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:
Marek Polacek 2020-11-09 10:19:07 -05:00
parent 6624075e7e
commit 3a5f8d745f
2 changed files with 28 additions and 6 deletions

View file

@ -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;

View 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" }
}