From: Marek Polacek Date: Mon, 9 Nov 2020 15:19:07 +0000 (-0500) Subject: c++: Fix -Wvexing-parse ICE with omitted int [PR97762] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3a5f8d745f8e26d973218b088788f22ad197ca67;p=gcc.git 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. --- diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index bbf157eb47f..b14b4c90c92 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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; diff --git a/gcc/testsuite/g++.dg/warn/Wvexing-parse8.C b/gcc/testsuite/g++.dg/warn/Wvexing-parse8.C new file mode 100644 index 00000000000..2d26d22fc4b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wvexing-parse8.C @@ -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" } +}