@@ -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,19 +20144,21 @@ cp_parser_single_declaration (cp_parser* parser,
}
}
- pop_deferring_access_checks ();
-
- /* Clear any current qualification; whatever comes next is the start
- of something new. */
- 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);
+ out:
+ pop_deferring_access_checks ();
+
+ /* Clear any current qualification; whatever comes next is the start
+ of something new. */
+ parser->scope = NULL_TREE;
+ parser->qualifying_scope = NULL_TREE;
+ parser->object_scope = NULL_TREE;
+
return decl;
}
new file mode 100644
@@ -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;
+};
@@ -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 }
@@ -10,4 +10,4 @@ struct A {
template <class T>
A<T>::A<T>() // { dg-error "constructor|qualified name" }
{
-} // { dg-error "end of input" }
+}
@@ -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" }
+}
@@ -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" }
+}
@@ -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" }
+}