]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/41127 (unnamed bitfield declaration parser regression)
authorJason Merrill <jason@redhat.com>
Mon, 31 Aug 2009 21:08:33 +0000 (17:08 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 31 Aug 2009 21:08:33 +0000 (17:08 -0400)
PR c++/41127
* parser.c (cp_parser_enum_specifier): Make sure the : is followed by a
type-specifier-seq before we commit.

From-SVN: r151246

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/enum1.C
gcc/testsuite/g++.dg/parse/enum5.C [new file with mode: 0644]

index 90a5c595746617bdd49efb62a633dbf0516e8506..78d075eca7d6c4eb5f4bbc155c1ceea0a3f46e99 100644 (file)
@@ -1,3 +1,9 @@
+2009-08-31  Jason Merrill  <jason@redhat.com>
+
+       PR c++/41127
+       * parser.c (cp_parser_enum_specifier): Make sure the : is followed by a
+       type-specifier-seq before we commit.
+
 2009-08-28  Richard Guenther  <rguenther@suse.de>
 
        PR lto/41058
index a3e9f0ebebcdc987ece171995012e59e6fd2069d..64869cd8476d0e0a981e3282adcc352070f80820 100644 (file)
@@ -11967,11 +11967,19 @@ cp_parser_enum_specifier (cp_parser* parser)
   else
     identifier = make_anon_name ();
 
-  /* Check for the `:' that denotes a specified underlying type in C++0x.  */
+  /* Check for the `:' that denotes a specified underlying type in C++0x.
+     Note that a ':' could also indicate a bitfield width, however.  */
   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
     {
       cp_decl_specifier_seq type_specifiers;
 
+      /* Consume the `:'.  */
+      cp_lexer_consume_token (parser->lexer);
+
+      /* Parse the type-specifier-seq.  */
+      cp_parser_type_specifier_seq (parser, /*is_condition=*/false,
+                                    &type_specifiers);
+
       /* At this point this is surely not elaborated type specifier.  */
       if (!cp_parser_parse_definitely (parser))
        return NULL_TREE;
@@ -11979,15 +11987,8 @@ cp_parser_enum_specifier (cp_parser* parser)
       if (cxx_dialect == cxx98)
         maybe_warn_cpp0x ("scoped enums");
 
-      /* Consume the `:'.  */
-      cp_lexer_consume_token (parser->lexer);
-
       has_underlying_type = true;
 
-      /* Parse the type-specifier-seq.  */
-      cp_parser_type_specifier_seq (parser, /*is_condition=*/false,
-                                    &type_specifiers);
-
       /* If that didn't work, stop.  */
       if (type_specifiers.type != error_mark_node)
         {
index eba8f6efa624138eb92a43113ff458e5125af01b..67ea0ef5fc8fe46430e1fb487f1b7febd96ef663 100644 (file)
@@ -1,3 +1,9 @@
+2009-08-31  Jason Merrill  <jason@redhat.com>
+
+       PR c++/41127
+       * g++.dg/parse/enum5.C: New.
+       * g++.dg/cpp0x/enum1.C: Adjust expected error.
+
 2009-08-31  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/40940
index af691f028b18fe887a8973671d2db0502e1da406..fb03692fab4a0b43b01c89beb16ddae794025815 100644 (file)
@@ -2,5 +2,5 @@
 // { dg-do compile }
 // { dg-options "-std=gnu++0x" }
 
-enum : { };    // { dg-error "expected type-specifier" }
+enum : { };    // { dg-error "expected" }
 enum : 3 { };  // { dg-error "expected" }
diff --git a/gcc/testsuite/g++.dg/parse/enum5.C b/gcc/testsuite/g++.dg/parse/enum5.C
new file mode 100644 (file)
index 0000000..3ebb02f
--- /dev/null
@@ -0,0 +1,17 @@
+// PR c++/41127
+
+#define CHAR_BIT 8
+enum EE {ee};
+typedef unsigned int T;
+
+struct D {
+        T : sizeof(unsigned int) * CHAR_BIT; // OK
+        EE : sizeof(EE) * CHAR_BIT; // OK
+        enum EE : sizeof(EE) * CHAR_BIT; // not OK
+        enum EE xxxx : sizeof(EE) * CHAR_BIT; // OK
+        T x : sizeof(unsigned int) * CHAR_BIT; // OK
+        enum FF {ff} : sizeof(int) * CHAR_BIT; // OK
+} element;
+
+enum EE xx;
+EE yy;