Commit 4999d9b0 by Jason Merrill Committed by Jason Merrill

re PR c++/47198 ([C++0x] ICE: tree check: expected var_decl or function_decl,…

re PR c++/47198 ([C++0x] ICE: tree check: expected var_decl or function_decl, have template_decl in check_bases_and_members, at cp/class.c:4654 on invalid code)

	PR c++/47198
	* parser.c (cp_parser_single_declaration): Just return if
	cp_parser_parse_and_diagnose_invalid_type_name complained.

From-SVN: r170847
parent 39242686
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> 2011-03-09 Jason Merrill <jason@redhat.com>
PR c++/44629 PR c++/44629
......
...@@ -20102,8 +20102,15 @@ cp_parser_single_declaration (cp_parser* parser, ...@@ -20102,8 +20102,15 @@ cp_parser_single_declaration (cp_parser* parser,
} }
/* Complain about missing 'typename' or other invalid type names. */ /* Complain about missing 'typename' or other invalid type names. */
if (!decl_specifiers.any_type_specifiers_p) if (!decl_specifiers.any_type_specifiers_p
cp_parser_parse_and_diagnose_invalid_type_name (parser); && 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 /* If it's not a template class, try for a template function. If
the next token is a `;', then this declaration does not declare the next token is a `;', then this declaration does not declare
...@@ -20137,6 +20144,13 @@ cp_parser_single_declaration (cp_parser* parser, ...@@ -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 (); pop_deferring_access_checks ();
/* Clear any current qualification; whatever comes next is the start /* Clear any current qualification; whatever comes next is the start
...@@ -20144,11 +20158,6 @@ cp_parser_single_declaration (cp_parser* parser, ...@@ -20144,11 +20158,6 @@ cp_parser_single_declaration (cp_parser* parser,
parser->scope = NULL_TREE; parser->scope = NULL_TREE;
parser->qualifying_scope = NULL_TREE; parser->qualifying_scope = NULL_TREE;
parser->object_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; return decl;
} }
......
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> 2011-03-09 Jason Merrill <jason@redhat.com>
* g++.dg/template/nontype22.C: New. * g++.dg/template/nontype22.C: New.
......
// 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" } ...@@ -30,4 +30,3 @@ void g(const A<T>::type &t); // { dg-error "typename" }
// PR c++/18451 // PR c++/18451
template <class T> A<T>::B A<T>::b; // { dg-error "typename" } template <class T> A<T>::B A<T>::b; // { dg-error "typename" }
// { dg-error "expected" "" { target *-*-* } 32 }
...@@ -10,4 +10,4 @@ struct A { ...@@ -10,4 +10,4 @@ struct A {
template <class T> template <class T>
A<T>::A<T>() // { dg-error "constructor|qualified name" } A<T>::A<T>() // { dg-error "constructor|qualified name" }
{ {
} // { dg-error "end of input" } }
...@@ -18,4 +18,4 @@ struct B : public A<U> ...@@ -18,4 +18,4 @@ struct B : public A<U>
template <class U> template <class U>
B<U>::A_Type B<U>::Func() { // { dg-error "typename" } implicit typename B<U>::A_Type B<U>::Func() { // { dg-error "typename" } implicit typename
} // { dg-error "expected" } }
...@@ -23,4 +23,4 @@ struct C : public B<U> ...@@ -23,4 +23,4 @@ struct C : public B<U>
template <class U> template <class U>
C<U>::A_Type C<U>::Func() { // { dg-error "typename" } implicit typename C<U>::A_Type C<U>::Func() { // { dg-error "typename" } implicit typename
} // { dg-error "expected" } }
...@@ -17,4 +17,4 @@ struct B : public A<U> ...@@ -17,4 +17,4 @@ struct B : public A<U>
template <class U> template <class U>
A<U>::A_Type B<U>::Func() // { dg-error "typename" } function A<U>::A_Type B<U>::Func() // { dg-error "typename" } function
{ {
} // { dg-error "expected" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment