* decl.c (finish_enum): Handle packed attribute.
* parser.c (cp_parser_enum_specifier): Process trailing attributes.
* g++.dg/ext/packed7.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@89801
138bc75d-0d04-0410-961f-
82ee72b054a4
+1004-10-28 Matt Austern <austern@apple.com>
+
+ PR c++/14124
+ * decl.c (finish_enum): Handle packed attribute.
+ * parser.c (cp_parser_enum_specifier): Process trailing attributes.
+
2004-10-28 Mark Mitchell <mark@codesourcery.com>
PR c++/17132
tree maxnode;
tree t;
bool unsignedp;
+ bool use_short_enum;
int lowprec;
int highprec;
int precision;
We use "int" or an "unsigned int" as the underlying type, even if
a smaller integral type would work, unless the user has
- explicitly requested that we use the smallest possible type. */
- for (itk = (flag_short_enums ? itk_char : itk_int);
+ explicitly requested that we use the smallest possible type. The
+ user can request that for all enumerations with a command line
+ flag, or for just one enumeration with an attribute. */
+
+ use_short_enum = flag_short_enums
+ || lookup_attribute ("packed", TYPE_ATTRIBUTES (enumtype));
+
+ for (itk = (use_short_enum ? itk_char : itk_int);
itk != itk_none;
itk++)
{
enum-specifier:
enum identifier [opt] { enumerator-list [opt] }
+ GNU Extensions:
+ enum identifier [opt] { enumerator-list [opt] } attributes
+
Returns an ENUM_TYPE representing the enumeration. */
static tree
/* Consume the final '}'. */
cp_parser_require (parser, CPP_CLOSE_BRACE, "`}'");
+ /* Look for trailing attributes to apply to this enumeration, and
+ apply them if appropriate. */
+ if (cp_parser_allow_gnu_extensions_p (parser))
+ {
+ tree trailing_attr = cp_parser_attributes_opt (parser);
+ cplus_decl_attributes (&type,
+ trailing_attr,
+ (int) ATTR_FLAG_TYPE_IN_PLACE);
+ }
+
/* Finish up the enumeration. */
finish_enum (type);
+1004-10-28 Matt Austern <austern@apple.com>
+
+ PR c++/14124
+ * g++.dg/ext/packed7.C: New test.
+
2004-10-28 Andrew Pinski <pinskia@physics.uc.edu>
* gcc.dg/visibility-[1-9a].c: Change to use scan-hidden instead of
--- /dev/null
+// PR c++/14124
+// A packed enum uses the minimal underlying type.
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Matt Austern <austern@apple.com>
+
+// { dg-do run }
+
+enum XXX { xyzzy = 3 } __attribute__((packed));
+
+int main()
+{
+ int enumsize = sizeof(xyzzy);
+ return (enumsize == 1) ? 0 : 1;
+}