diff mbox

Make C++ honor the enum mode attribute

Message ID AM4PR07MB157101EF27A6DA225D3789E8E4670@AM4PR07MB1571.eurprd07.prod.outlook.com
State New
Headers show

Commit Message

Bernd Edlinger April 30, 2016, 5:54 a.m. UTC
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.
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.

Comments

Bernd Edlinger May 7, 2016, 9:54 a.m. UTC | #1
Ping..

For this patch: https://gcc.gnu.org/ml/gcc-patches/2016-04/msg02069.html

Thanks
Bernd.

On 04/30/16 07:54, Bernd Edlinger wrote:
> 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.
>
Bernd Edlinger May 18, 2016, 6:12 p.m. UTC | #2
Ping...

On 07.05.2016 11:54 Bernd Edlinger wrote:
> Ping..
>
> For this patch: https://gcc.gnu.org/ml/gcc-patches/2016-04/msg02069.html
>
> Thanks
> Bernd.
>
Jason Merrill May 18, 2016, 9:07 p.m. UTC | #3
OK.

Jason
diff mbox

Patch

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" } } */