[PATCH] c++: Fix -Wvexing-parse ICE with omitted int [PR97762]
Jason Merrill
jason@redhat.com
Mon Nov 9 19:36:56 GMT 2020
On 11/9/20 11:47 AM, Marek Polacek wrote:
> 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.
>
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
OK.
> 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.
> ---
> gcc/cp/parser.c | 23 ++++++++++++++++------
> gcc/testsuite/g++.dg/warn/Wvexing-parse8.C | 11 +++++++++++
> 2 files changed, 28 insertions(+), 6 deletions(-)
> create mode 100644 gcc/testsuite/g++.dg/warn/Wvexing-parse8.C
>
> 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" }
> +}
>
> base-commit: 4e85ad79a137535393d8dc169359e1730cab3533
>
More information about the Gcc-patches
mailing list