c++: Fix -Wvexing-parse ICE with omitted int [PR97762]
For declarations like long f(); decl_specifiers->type will be NULL, but I neglected to handle this case, therefore we ICE. So handle this case by pretending we've seen 'int', which is good enough for -Wvexing-parse's purposes. gcc/cp/ChangeLog: PR c++/97762 * parser.c (warn_about_ambiguous_parse): Handle the case when there is no type in the decl-specifiers. gcc/testsuite/ChangeLog: PR c++/97762 * g++.dg/warn/Wvexing-parse8.C: New test.
This commit is contained in:
parent
6624075e7e
commit
3a5f8d745f
2 changed files with 28 additions and 6 deletions
|
@ -20652,13 +20652,24 @@ warn_about_ambiguous_parse (const cp_decl_specifier_seq *decl_specifiers,
|
|||
if (declarator->parenthesized != UNKNOWN_LOCATION)
|
||||
return;
|
||||
|
||||
tree type = decl_specifiers->type;
|
||||
if (TREE_CODE (type) == TYPE_DECL)
|
||||
type = TREE_TYPE (type);
|
||||
tree type;
|
||||
if (decl_specifiers->type)
|
||||
{
|
||||
type = decl_specifiers->type;
|
||||
if (TREE_CODE (type) == TYPE_DECL)
|
||||
type = TREE_TYPE (type);
|
||||
|
||||
/* If the return type is void there is no ambiguity. */
|
||||
if (same_type_p (type, void_type_node))
|
||||
return;
|
||||
/* If the return type is void there is no ambiguity. */
|
||||
if (same_type_p (type, void_type_node))
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Code like long f(); will have null ->type. If we have any
|
||||
type-specifiers, pretend we've seen int. */
|
||||
gcc_checking_assert (decl_specifiers->any_type_specifiers_p);
|
||||
type = integer_type_node;
|
||||
}
|
||||
|
||||
auto_diagnostic_group d;
|
||||
location_t loc = declarator->u.function.parens_loc;
|
||||
|
|
11
gcc/testsuite/g++.dg/warn/Wvexing-parse8.C
Normal file
11
gcc/testsuite/g++.dg/warn/Wvexing-parse8.C
Normal file
|
@ -0,0 +1,11 @@
|
|||
// PR c++/97762
|
||||
// { dg-do compile }
|
||||
|
||||
void
|
||||
g ()
|
||||
{
|
||||
long a(); // { dg-warning "empty parentheses" }
|
||||
signed b(); // { dg-warning "empty parentheses" }
|
||||
unsigned c(); // { dg-warning "empty parentheses" }
|
||||
short d(); // { dg-warning "empty parentheses" }
|
||||
}
|
Loading…
Add table
Reference in a new issue