]> gcc.gnu.org Git - gcc.git/commitdiff
c++/14124
authorMatt Austern <austern@apple.com>
Fri, 29 Oct 2004 00:50:44 +0000 (00:50 +0000)
committerMatt Austern <austern@gcc.gnu.org>
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.

From-SVN: r89801

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 2edaa402f21e268c3fb8995972abfbc2bdeb6083..5aa869c5320eae8336e417dcf6466b7b47699638 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 aeb3347bb46712a879dea6817b4e4c3b1e5ae756..4d74a2a2e654d7c2351e5e1480d869d61f7d6677 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 ccb1ac184ce5b59a8f1a7461ba772a2396eb5d56..8fed7ba9da8226b87976c014ab0b8d1dda9be10e 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 c781e8bb28ea5c3b5041705208fd93dd8e6facff..7667f42d1d27fcfdeed6f360ee53bd480559c5c9 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;
+}
This page took 1.599499 seconds and 5 git commands to generate.