c++/14124
authoraustern <austern@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 29 Oct 2004 00:50:44 +0000 (00:50 +0000)
committeraustern <austern@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 29 Oct 2004 00:50:44 +0000 (00:50 +0000)
* 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

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/packed7.C [new file with mode: 0644]

index 2edaa40..5aa869c 100644 (file)
@@ -1,3 +1,9 @@
+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
index aeb3347..4d74a2a 100644 (file)
@@ -9504,6 +9504,7 @@ finish_enum (tree enumtype)
   tree maxnode;
   tree t;
   bool unsignedp;
+  bool use_short_enum;
   int lowprec;
   int highprec;
   int precision;
@@ -9586,8 +9587,14 @@ finish_enum (tree enumtype)
 
      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++)
     {
index ccb1ac1..8fed7ba 100644 (file)
@@ -9754,6 +9754,9 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
    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
@@ -9791,6 +9794,16 @@ cp_parser_enum_specifier (cp_parser* parser)
   /* 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);
 
index c781e8b..7667f42 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/g++.dg/ext/packed7.C b/gcc/testsuite/g++.dg/ext/packed7.C
new file mode 100644 (file)
index 0000000..e2f74e0
--- /dev/null
@@ -0,0 +1,15 @@
+// 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;
+}