re PR c++/29980 (ICE using attribute in invalid declaration)
authorLee Millward <lee.millward@codesourcery.com>
Thu, 7 Dec 2006 19:16:38 +0000 (19:16 +0000)
committerLee Millward <lmillward@gcc.gnu.org>
Thu, 7 Dec 2006 19:16:38 +0000 (19:16 +0000)
        PR c++/29980
        * cp_parser_elaborated_type_specifier: Check
        the return value of check_elaborated_type_specifier.

        * g++.dg/ext/attrib27.C: New test.
        * g++.dg/parse/struct-as-enum1.C: Adjust error markers.
        * g++.dg/parse/typedef5.C: Likewise.

From-SVN: r119633

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/attrib27.C [new file with mode: 0644]
gcc/testsuite/g++.dg/parse/struct-as-enum1.C
gcc/testsuite/g++.dg/parse/typedef5.C

index 07e6b63aa38000803656fdac9000c92dfa55b1c7..213550807c0a086b866e6af42cf60f6dfe52e85f 100644 (file)
@@ -1,3 +1,9 @@
+2006-12-07  Lee Millward  <lee.millward@codesourcery.com>
+
+        PR c++/29980
+        * cp_parser_elaborated_type_specifier: Check
+        the return value of check_elaborated_type_specifier.
+       
 2006-12-06  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/29730
index cdb60f646237d76765f3802a4e07fb7b3daab4ef..a0a6a1778550876aabfe4c01ff2fb5da12a9bdd0 100644 (file)
@@ -10311,10 +10311,15 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
            }
 
          if (TREE_CODE (TREE_TYPE (decl)) != TYPENAME_TYPE)
-           check_elaborated_type_specifier
-             (tag_type, decl,
-              (parser->num_template_parameter_lists
-               || DECL_SELF_REFERENCE_P (decl)));
+            {
+              bool allow_template = (parser->num_template_parameter_lists
+                                     || DECL_SELF_REFERENCE_P (decl));
+              type = check_elaborated_type_specifier (tag_type, decl, 
+                                                      allow_template);
+
+              if (type == error_mark_node)
+                return error_mark_node;
+            }
 
          type = TREE_TYPE (decl);
        }
index e2a5c46b4a618ed965d671a89042cfa980dee649..77c3bf1883a6d8a7e1c17c7d59774ebdab5248d1 100644 (file)
@@ -1,3 +1,10 @@
+2006-12-07  Lee Millward  <lee.millward@codesourcery.com>
+
+        PR c++/29980
+        * g++.dg/ext/attrib27.C: New test.
+        * g++.dg/parse/struct-as-enum1.C: Adjust error markers.
+        * g++.dg/parse/typedef5.C: Likewise.
+       
 2006-12-07  Mike Stump  <mrs@apple.com>
 
        * treelang/compile/var_defs.tree: Adjust.
diff --git a/gcc/testsuite/g++.dg/ext/attrib27.C b/gcc/testsuite/g++.dg/ext/attrib27.C
new file mode 100644 (file)
index 0000000..4f629aa
--- /dev/null
@@ -0,0 +1,5 @@
+//PR c++/29980
+
+struct A { typedef int X; };            // { dg-error "previous declaration" }
+
+struct __attribute__((unused)) A::X;    // { dg-error "typedef-name" }
index bc8c5b530f6b87fa5b19169700aea901566bbb02..f58c738819593fc27e4abeefeca36f25e637d62c 100644 (file)
@@ -7,4 +7,4 @@ namespace N
     struct A {};       // { dg-error "previous declaration" }
 }
 
-typedef enum N::A B;   // { dg-error "enum" }
+typedef enum N::A B;   // { dg-error "enum|invalid type" }
index 22ba85e0aea561fc6b8f221967b208b412821001..7079f371333cd1944f3606fec1a316d3554dc478 100644 (file)
@@ -3,4 +3,4 @@ namespace A
   typedef int T;       // { dg-error "previous declaration" }
 }
 
-class A::T x;          // { dg-error "using typedef-name" }
+class A::T x;          // { dg-error "using typedef-name|invalid type" }