public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Bernd Edlinger <bernd.edlinger@hotmail.de>
To: "gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>
Cc: Jason Merrill <jason@redhat.com>, Jakub Jelinek <jakub@redhat.com>
Subject: [PATCH] Make C++ honor the enum mode attribute
Date: Sat, 30 Apr 2016 05:54:00 -0000	[thread overview]
Message-ID: <AM4PR07MB157101EF27A6DA225D3789E8E4670@AM4PR07MB1571.eurprd07.prod.outlook.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1171 bytes --]

Hi,

this was already posted in february, but has not yet been reviewed, so I thought
it is time now to post it again...

As a follow-up for Jakub's c/69669 fix, I'd like to have the enum mode also honored
in C++ code, because the mode attribute now finally really works in C, but it is
completely and silently(!) ignored by C++ code, which results in incompatible
code.

So I duplicated what is done in c/c-decl.c also in cp/decl.c.  That worked
immediately, except that it is not possible to explicitly check the "mode"
attribute in the TYPE_ATTRIBUTES (enumtype) because that attribute
is never copied to the type, and the original attribute list is not available
here.  That should be OK, as this check was added to fix pr52085 which
does not apply here, because C++ does not support enum forward
declarations.

If that patch is not appropriate for stage  4, I would at least want to emit
an attribute directive ignored warning in c++ mode.  I think that could
be done in handle_mode_attribute.  But fixing that feature is cooler.


Boot-strapped and regression tested on x86_64-pc-linux-gnu.
Ok for trunk and gcc-6 branch?


Thanks
Bernd.

[-- Attachment #2: changelog-enum-mode.txt --]
[-- Type: text/plain, Size: 238 bytes --]

cp:
2016-02-06  Bernd Edlinger  <bernd.edlinger@hotmail.de>

	* decl.c (finish_enum_value_list): Use the specified mode.

testsuite:
2016-02-06  Bernd Edlinger  <bernd.edlinger@hotmail.de>

	* c-c++-common/pr69669.c: Check the used mode.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: patch-enum-mode.diff --]
[-- Type: text/x-patch; name="patch-enum-mode.diff", Size: 1340 bytes --]

Index: gcc/cp/decl.c
===================================================================
--- gcc/cp/decl.c	(Revision 233176)
+++ gcc/cp/decl.c	(Arbeitskopie)
@@ -13310,6 +13310,19 @@ finish_enum_value_list (tree enumtype)
       use_short_enum = flag_short_enums
         || lookup_attribute ("packed", TYPE_ATTRIBUTES (enumtype));
 
+      /* If the precision of the type was specified with an attribute and it
+	 was too small, give an error.  Otherwise, use it.  */
+      if (TYPE_PRECISION (enumtype))
+	{
+	  if (precision > TYPE_PRECISION (enumtype))
+	    error ("specified mode too small for enumeral values");
+	  else
+	    {
+	      use_short_enum = true;
+	      precision = TYPE_PRECISION (enumtype);
+	    }
+	}
+
       for (itk = (use_short_enum ? itk_char : itk_int);
            itk != itk_none;
            itk++)
Index: gcc/testsuite/c-c++-common/pr69669.c
===================================================================
--- gcc/testsuite/c-c++-common/pr69669.c	(Revision 233176)
+++ gcc/testsuite/c-c++-common/pr69669.c	(Arbeitskopie)
@@ -1,5 +1,6 @@
 /* PR c/69669 */
 /* { dg-do compile } */
+/* { dg-options "-fdump-rtl-final" } */
 
 enum __attribute__((mode(QI))) E { F = 1 };
 
@@ -8,3 +9,5 @@ foo (enum E *x, int y)
 {
   *x = (enum E) y;
 }
+
+/* { dg-final { scan-rtl-dump-times "mem:QI" 1 "final" } } */

             reply	other threads:[~2016-04-30  5:54 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-30  5:54 Bernd Edlinger [this message]
2016-05-07  9:55 ` [PING] " Bernd Edlinger
2016-05-18 18:12   ` [PING**2] " Bernd Edlinger
2016-05-18 21:07 ` Jason Merrill

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AM4PR07MB157101EF27A6DA225D3789E8E4670@AM4PR07MB1571.eurprd07.prod.outlook.com \
    --to=bernd.edlinger@hotmail.de \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jakub@redhat.com \
    --cc=jason@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).