From 0a86d0a2bf7a1400e10a5d442d491796b5d4c5cb Mon Sep 17 00:00:00 2001 From: Volker Reichelt Date: Thu, 17 Aug 2006 09:19:27 +0000 Subject: [PATCH] re PR c++/28606 (Destructor accepted as return-type of constructor) PR c++/28606 * parser.c (cp_parser_diagnose_invalid_type_name): Handle BIT_NOT_EXPR. Fix formatting. (cp_parser_parse_and_diagnose_invalid_type_name): Tighten condition for valid type-names. (cp_parser_unqualified_id): Fix error handling for destructors. * g++.dg/parse/dtor11.C: New test. From-SVN: r116219 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/parser.c | 16 ++++++++++------ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/parse/dtor11.C | 12 ++++++++++++ 4 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/dtor11.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1dcbc7736cf1..e2fada81d905 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2006-08-17 Volker Reichelt + PR c++/28606 + * parser.c (cp_parser_diagnose_invalid_type_name): Handle BIT_NOT_EXPR. + Fix formatting. + (cp_parser_parse_and_diagnose_invalid_type_name): Tighten condition + for valid type-names. + (cp_parser_unqualified_id): Fix error handling for destructors. + PR c++/28710 * decl.c (xref_tag): Improve error message. Return early on error. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 9e6fedfd6393..13cf044cf0c8 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2049,8 +2049,9 @@ cp_parser_diagnose_invalid_type_name (cp_parser *parser, tree scope, tree id) /* If the lookup found a template-name, it means that the user forgot to specify an argument list. Emit an useful error message. */ if (TREE_CODE (decl) == TEMPLATE_DECL) - error ("invalid use of template-name %qE without an argument list", - decl); + error ("invalid use of template-name %qE without an argument list", decl); + else if (TREE_CODE (id) == BIT_NOT_EXPR) + error ("invalid use of destructor %qD as a type", id); else if (!parser->scope || parser->scope == error_mark_node) { /* Issue an error message. */ @@ -2143,8 +2144,7 @@ cp_parser_parse_and_diagnose_invalid_type_name (cp_parser *parser) cp_parser_abort_tentative_parse (parser); return false; } - if (!cp_parser_parse_definitely (parser) - || TREE_CODE (id) != IDENTIFIER_NODE) + if (!cp_parser_parse_definitely (parser) || TREE_CODE (id) == TYPE_DECL) return false; /* Emit a diagnostic for the invalid type. */ @@ -3302,14 +3302,17 @@ cp_parser_unqualified_id (cp_parser* parser, /* Check for invalid scopes. */ if (scope == error_mark_node) { - cp_parser_skip_to_end_of_statement (parser); + if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)) + cp_lexer_consume_token (parser->lexer); 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); + cp_parser_simulate_error (parser); + if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)) + cp_lexer_consume_token (parser->lexer); return error_mark_node; } gcc_assert (!scope || TYPE_P (scope)); @@ -3409,6 +3412,7 @@ cp_parser_unqualified_id (cp_parser* parser, if (!cp_parser_uncommitted_to_tentative_parse_p (parser)) error ("declaration of %<~%T%> as member of %qT", type_decl, scope); + cp_parser_simulate_error (parser); return error_mark_node; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 291c55d68bfb..9da250571378 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2006-08-17 Volker Reichelt + PR c++/28606 + * g++.dg/parse/dtor11.C: New test. + PR c++/28710 * g++.dg/template/redecl4.C: New test. diff --git a/gcc/testsuite/g++.dg/parse/dtor11.C b/gcc/testsuite/g++.dg/parse/dtor11.C new file mode 100644 index 000000000000..63ffb60bac10 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/dtor11.C @@ -0,0 +1,12 @@ +// PR c++/28606 +// { dg-do compile } + +struct A +{ + ~A A(); // { dg-error "destructor" } +}; + +struct B +{ + A::~B B(); // { dg-error "as member of" } +}; -- 2.47.2