re PR c++/27508 (ICE on invalid destructor name)
PR c++/27508 * parser.c (cp_parser_unqualified_id): Check for invalid scopes when parsing destructor names. * g++.dg/parse/dtor9.C: New test. * g++.dg/parse/dtor10.C: New test. * g++.dg/other/error7.C: Adjust error-marker. From-SVN: r115896
This commit is contained in:
parent
4a2f6dc05b
commit
c0dc47a866
|
@ -1,5 +1,9 @@
|
||||||
2006-08-03 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
|
2006-08-03 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
|
||||||
|
|
||||||
|
PR c++/27508
|
||||||
|
* parser.c (cp_parser_unqualified_id): Check for invalid scopes
|
||||||
|
when parsing destructor names.
|
||||||
|
|
||||||
PR c++/28274
|
PR c++/28274
|
||||||
* decl.c (duplicate_decls): Call check_default_args here.
|
* decl.c (duplicate_decls): Call check_default_args here.
|
||||||
(start_preparsed_function): Do not call check_default_args.
|
(start_preparsed_function): Do not call check_default_args.
|
||||||
|
|
|
@ -3416,9 +3416,24 @@ cp_parser_unqualified_id (cp_parser* parser,
|
||||||
object_scope = parser->object_scope;
|
object_scope = parser->object_scope;
|
||||||
qualifying_scope = parser->qualifying_scope;
|
qualifying_scope = parser->qualifying_scope;
|
||||||
|
|
||||||
|
/* Check for invalid scopes. */
|
||||||
|
if (scope == error_mark_node)
|
||||||
|
{
|
||||||
|
cp_parser_skip_to_end_of_statement (parser);
|
||||||
|
return error_mark_node;
|
||||||
|
}
|
||||||
|
if (scope && TREE_CODE (scope) == NAMESPACE_DECL)
|
||||||
|
{
|
||||||
|
if (!cp_parser_uncommitted_to_tentative_parse_p (parser))
|
||||||
|
error ("scope %qT before %<~%> is not a class-name", scope);
|
||||||
|
cp_parser_skip_to_end_of_statement (parser);
|
||||||
|
return error_mark_node;
|
||||||
|
}
|
||||||
|
gcc_assert (!scope || TYPE_P (scope));
|
||||||
|
|
||||||
/* If the name is of the form "X::~X" it's OK. */
|
/* If the name is of the form "X::~X" it's OK. */
|
||||||
token = cp_lexer_peek_token (parser->lexer);
|
token = cp_lexer_peek_token (parser->lexer);
|
||||||
if (scope && TYPE_P (scope)
|
if (scope
|
||||||
&& token->type == CPP_NAME
|
&& token->type == CPP_NAME
|
||||||
&& (cp_lexer_peek_nth_token (parser->lexer, 2)->type
|
&& (cp_lexer_peek_nth_token (parser->lexer, 2)->type
|
||||||
== CPP_OPEN_PAREN)
|
== CPP_OPEN_PAREN)
|
||||||
|
@ -3500,7 +3515,7 @@ cp_parser_unqualified_id (cp_parser* parser,
|
||||||
destructor is the same as the name of the qualifying
|
destructor is the same as the name of the qualifying
|
||||||
class. That allows us to keep parsing after running
|
class. That allows us to keep parsing after running
|
||||||
into ill-formed destructor names. */
|
into ill-formed destructor names. */
|
||||||
if (type_decl == error_mark_node && scope && TYPE_P (scope))
|
if (type_decl == error_mark_node && scope)
|
||||||
return build_nt (BIT_NOT_EXPR, scope);
|
return build_nt (BIT_NOT_EXPR, scope);
|
||||||
else if (type_decl == error_mark_node)
|
else if (type_decl == error_mark_node)
|
||||||
return error_mark_node;
|
return error_mark_node;
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
2006-08-03 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
|
2006-08-03 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
|
||||||
|
|
||||||
|
PR c++/27508
|
||||||
|
* g++.dg/parse/dtor9.C: New test.
|
||||||
|
* g++.dg/parse/dtor10.C: New test.
|
||||||
|
* g++.dg/other/error7.C: Adjust error-marker.
|
||||||
|
|
||||||
PR c++/28274
|
PR c++/28274
|
||||||
* g++.dg/other/default5.C: New test.
|
* g++.dg/other/default5.C: New test.
|
||||||
|
|
||||||
|
|
|
@ -8,5 +8,5 @@ namespace N {}
|
||||||
|
|
||||||
void foo(void)
|
void foo(void)
|
||||||
{
|
{
|
||||||
N::~A(); // { dg-error "not a member" }
|
N::~A(); // { dg-error "not a class-name" }
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
// PR c++/27508
|
||||||
|
// { dg-do compile }
|
||||||
|
|
||||||
|
namespace N
|
||||||
|
{
|
||||||
|
struct A { ~A(); };
|
||||||
|
}
|
||||||
|
|
||||||
|
N::~A () {} // { dg-error "not a class-name" }
|
|
@ -0,0 +1,5 @@
|
||||||
|
// PR c++/27508
|
||||||
|
// { dg-do compile }
|
||||||
|
|
||||||
|
struct A;
|
||||||
|
using ::~A; // { dg-error "not a class-name" }
|
Loading…
Reference in New Issue