re PR c/52085 (incomplete enum not completed correctly if packed was used)
PR c/52085 * c-decl.c (finish_enum): Copy over TYPE_ALIGN. Also check for "mode" attribute. * gcc.dg/enum-incomplete-2.c: New test. * gcc.dg/enum-mode-1.c: New test. From-SVN: r222440
This commit is contained in:
parent
5962171edd
commit
6c1db78eca
@ -1,3 +1,9 @@
|
||||
2015-04-25 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c/52085
|
||||
* c-decl.c (finish_enum): Copy over TYPE_ALIGN. Also check for "mode"
|
||||
attribute.
|
||||
|
||||
2015-04-23 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c/65345
|
||||
|
@ -8010,11 +8010,13 @@ finish_enum (tree enumtype, tree values, tree attributes)
|
||||
TYPE_MIN_VALUE (enumtype) = TYPE_MIN_VALUE (tem);
|
||||
TYPE_MAX_VALUE (enumtype) = TYPE_MAX_VALUE (tem);
|
||||
TYPE_UNSIGNED (enumtype) = TYPE_UNSIGNED (tem);
|
||||
TYPE_ALIGN (enumtype) = TYPE_ALIGN (tem);
|
||||
TYPE_SIZE (enumtype) = 0;
|
||||
|
||||
/* If the precision of the type was specific with an attribute and it
|
||||
/* 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 (TYPE_PRECISION (enumtype)
|
||||
&& lookup_attribute ("mode", attributes))
|
||||
{
|
||||
if (precision > TYPE_PRECISION (enumtype))
|
||||
error ("specified mode too small for enumeral values");
|
||||
|
@ -1,3 +1,9 @@
|
||||
2015-04-25 Marek Polacek <polacek@redhat.com>
|
||||
|
||||
PR c/52085
|
||||
* gcc.dg/enum-incomplete-2.c: New test.
|
||||
* gcc.dg/enum-mode-1.c: New test.
|
||||
|
||||
2015-04-24 Michael Meissner <meissner@linux.vnet.ibm.com>
|
||||
|
||||
PR target/65849
|
||||
|
41
gcc/testsuite/gcc.dg/enum-incomplete-2.c
Normal file
41
gcc/testsuite/gcc.dg/enum-incomplete-2.c
Normal file
@ -0,0 +1,41 @@
|
||||
/* PR c/52085 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "" } */
|
||||
|
||||
#define SA(X) _Static_assert((X),#X)
|
||||
|
||||
enum e1;
|
||||
enum e1 { A } __attribute__ ((__packed__));
|
||||
enum e2 { B } __attribute__ ((__packed__));
|
||||
SA (sizeof (enum e1) == sizeof (enum e2));
|
||||
SA (_Alignof (enum e1) == _Alignof (enum e2));
|
||||
|
||||
enum e3;
|
||||
enum e3 { C = 256 } __attribute__ ((__packed__));
|
||||
enum e4 { D = 256 } __attribute__ ((__packed__));
|
||||
SA (sizeof (enum e3) == sizeof (enum e4));
|
||||
SA (_Alignof (enum e3) == _Alignof (enum e4));
|
||||
|
||||
enum e5;
|
||||
enum e5 { E = __INT_MAX__ } __attribute__ ((__packed__));
|
||||
enum e6 { F = __INT_MAX__ } __attribute__ ((__packed__));
|
||||
SA (sizeof (enum e5) == sizeof (enum e6));
|
||||
SA (_Alignof (enum e5) == _Alignof (enum e6));
|
||||
|
||||
enum e7;
|
||||
enum e7 { G } __attribute__ ((__mode__(__byte__)));
|
||||
enum e8 { H } __attribute__ ((__mode__(__byte__)));
|
||||
SA (sizeof (enum e7) == sizeof (enum e8));
|
||||
SA (_Alignof (enum e7) == _Alignof (enum e8));
|
||||
|
||||
enum e9;
|
||||
enum e9 { I } __attribute__ ((__packed__, __mode__(__byte__)));
|
||||
enum e10 { J } __attribute__ ((__packed__, __mode__(__byte__)));
|
||||
SA (sizeof (enum e9) == sizeof (enum e10));
|
||||
SA (_Alignof (enum e9) == _Alignof (enum e10));
|
||||
|
||||
enum e11;
|
||||
enum e11 { K } __attribute__ ((__mode__(__word__)));
|
||||
enum e12 { L } __attribute__ ((__mode__(__word__)));
|
||||
SA (sizeof (enum e11) == sizeof (enum e12));
|
||||
SA (_Alignof (enum e11) == _Alignof (enum e12));
|
10
gcc/testsuite/gcc.dg/enum-mode-1.c
Normal file
10
gcc/testsuite/gcc.dg/enum-mode-1.c
Normal file
@ -0,0 +1,10 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
enum e1 { A = 256 } __attribute__((__mode__(__byte__))); /* { dg-error "specified mode too small for enumeral values" } */
|
||||
enum e2 { B = 256 } __attribute__((__packed__, __mode__(__byte__))); /* { dg-error "specified mode too small for enumeral values" } */
|
||||
|
||||
enum e3 { C = __INT_MAX__ } __attribute__((__mode__(__QI__))); /* { dg-error "specified mode too small for enumeral values" } */
|
||||
enum e4 { D = __INT_MAX__ } __attribute__((__packed__, __mode__(__QI__))); /* { dg-error "specified mode too small for enumeral values" } */
|
||||
|
||||
enum e5 { E = __INT_MAX__ } __attribute__((__mode__(__HI__))); /* { dg-error "specified mode too small for enumeral values" } */
|
||||
enum e6 { F = __INT_MAX__ } __attribute__((__packed__, __mode__(__HI__))); /* { dg-error "specified mode too small for enumeral values" } */
|
Loading…
x
Reference in New Issue
Block a user