re PR c++/47198 ([C++0x] ICE: tree check: expected var_decl or function_decl, have...
authorJason Merrill <jason@redhat.com>
Thu, 10 Mar 2011 15:21:00 +0000 (10:21 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 10 Mar 2011 15:21:00 +0000 (10:21 -0500)
PR c++/47198
* parser.c (cp_parser_single_declaration): Just return if
cp_parser_parse_and_diagnose_invalid_type_name complained.

From-SVN: r170847

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/syntax-err1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/parse/error36.C
gcc/testsuite/g++.old-deja/g++.pt/ctor2.C
gcc/testsuite/g++.old-deja/g++.pt/typename3.C
gcc/testsuite/g++.old-deja/g++.pt/typename4.C
gcc/testsuite/g++.old-deja/g++.pt/typename6.C

index 789b2cf62c87c4eaab6e31259e24714d99ed5bac..a3a5bf7c66d5e2d0cbd7e0845eb23f0baa54e98b 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-10  Jason Merrill  <jason@redhat.com>
+
+       PR c++/47198
+       * parser.c (cp_parser_single_declaration): Just return if
+       cp_parser_parse_and_diagnose_invalid_type_name complained.
+
 2011-03-09  Jason Merrill  <jason@redhat.com>
 
        PR c++/44629
index 510fcb1117995776d5101a59be37faa6a9e4072c..7e9b286c0ae50bd0fe34646054e4a8caf7a0fac1 100644 (file)
@@ -20102,8 +20102,15 @@ cp_parser_single_declaration (cp_parser* parser,
     }
 
   /* Complain about missing 'typename' or other invalid type names.  */
-  if (!decl_specifiers.any_type_specifiers_p)
-    cp_parser_parse_and_diagnose_invalid_type_name (parser);
+  if (!decl_specifiers.any_type_specifiers_p
+      && cp_parser_parse_and_diagnose_invalid_type_name (parser))
+    {
+      /* cp_parser_parse_and_diagnose_invalid_type_name calls
+        cp_parser_skip_to_end_of_block_or_statement, so don't try to parse
+        the rest of this declaration.  */
+      decl = error_mark_node;
+      goto out;
+    }
 
   /* If it's not a template class, try for a template function.  If
      the next token is a `;', then this declaration does not declare
@@ -20137,6 +20144,13 @@ cp_parser_single_declaration (cp_parser* parser,
       }
     }
 
+  /* Look for a trailing `;' after the declaration.  */
+  if (!function_definition_p
+      && (decl == error_mark_node
+         || !cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON)))
+    cp_parser_skip_to_end_of_block_or_statement (parser);
+
+ out:
   pop_deferring_access_checks ();
 
   /* Clear any current qualification; whatever comes next is the start
@@ -20144,11 +20158,6 @@ cp_parser_single_declaration (cp_parser* parser,
   parser->scope = NULL_TREE;
   parser->qualifying_scope = NULL_TREE;
   parser->object_scope = NULL_TREE;
-  /* Look for a trailing `;' after the declaration.  */
-  if (!function_definition_p
-      && (decl == error_mark_node
-         || !cp_parser_require (parser, CPP_SEMICOLON, RT_SEMICOLON)))
-    cp_parser_skip_to_end_of_block_or_statement (parser);
 
   return decl;
 }
index 0c30b083f350fafb31b3e6b1e9eba9465ac4122d..9739ac855b1eada1d0aad1a08f6989bf77a8aabc 100644 (file)
@@ -1,3 +1,12 @@
+2011-03-10  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/cpp0x/syntax-err1.C: New.
+       * g++.dg/parse/error36.C: Adjust expected errors.
+       * g++.old-deja/g++.pt/ctor2.C: Likewise.
+       * g++.old-deja/g++.pt/typename3.C: Likewise.
+       * g++.old-deja/g++.pt/typename4.C: Likewise.
+       * g++.old-deja/g++.pt/typename6.C: Likewise.
+
 2011-03-09  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/template/nontype22.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/syntax-err1.C b/gcc/testsuite/g++.dg/cpp0x/syntax-err1.C
new file mode 100644 (file)
index 0000000..ce1c9ee
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/47198
+// { dg-options -std=c++0x }
+
+struct S
+{
+  template < int > sometype foo (); // { dg-error "sometype. does not name a type" }
+  S () = default;
+};
index 0d7f8cfc4c33b0a3c2d8bbb3f3b7bb7fb542b691..8fcaa2fb232b156916fd7ebf2f2c4026f1c166c5 100644 (file)
@@ -30,4 +30,3 @@ void g(const A<T>::type &t);  // { dg-error "typename" }
 
 // PR c++/18451
 template <class T> A<T>::B A<T>::b; // { dg-error "typename" }
-// { dg-error "expected" "" { target *-*-* } 32 }
index eb8f312642f7abe7f2cc043a2588e9b1f2234881..a8be91ddbb917f12fb01650045a01b24112115ef 100644 (file)
@@ -10,4 +10,4 @@ struct A {
 template <class T>
 A<T>::A<T>()   // { dg-error "constructor|qualified name" }
 {
-} // { dg-error "end of input" }
+}
index 0708f1f24953524284660cdcfdbb2d0f1ab515cf..ad026a770703fc3c3d1745faa89954c7d8ebe597 100644 (file)
@@ -18,4 +18,4 @@ struct B : public A<U>
 
 template <class U>
 B<U>::A_Type B<U>::Func() { // { dg-error "typename" } implicit typename
-}                          // { dg-error "expected" }
+}
index 7238470e4ceb6296cb1542f4219808f3e0247701..47fb250a9a808484891eadfed364be1b0f2a71e0 100644 (file)
@@ -23,4 +23,4 @@ struct C : public B<U>
 
 template <class U>
 C<U>::A_Type C<U>::Func() { // { dg-error "typename" } implicit typename
-}                          // { dg-error "expected" }
+}
index 0a5f0184bd455ef69f620ecf9de6c1d5b6082c62..734781202f160ec63cb65d59a7adcedbafd9a931 100644 (file)
@@ -17,4 +17,4 @@ struct B : public A<U>
 template <class U>
 A<U>::A_Type B<U>::Func()       // { dg-error "typename" } function
 {                              
-} // { dg-error "expected" }
+}