Commit 6c1db78e by Marek Polacek Committed by Marek Polacek

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
parent 5962171e
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");
......
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
......
/* 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));
/* { 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" } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment