This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: C++ PATCH for c++/87781, detect invalid elaborated-type-specifier
- From: Jason Merrill <jason at redhat dot com>
- To: Marek Polacek <polacek at redhat dot com>
- Cc: gcc-patches List <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 19 Nov 2018 15:57:17 -0500
- Subject: Re: C++ PATCH for c++/87781, detect invalid elaborated-type-specifier
- References: <20181114145540.GI28582@redhat.com> <CADzB+2=J-cUqVOraLdp35np7ykzwwJUkFCSy6gRg_e=PLQVw1g@mail.gmail.com> <20181114203203.GM28582@redhat.com>
OK, thanks.
On Wed, Nov 14, 2018 at 3:32 PM Marek Polacek <polacek@redhat.com> wrote:
>
> On Wed, Nov 14, 2018 at 10:03:50AM -0500, Jason Merrill wrote:
> > On Wed, Nov 14, 2018 at 9:55 AM Marek Polacek <polacek@redhat.com> wrote:
> > >
> > > In elaborated-type-specifier, the typename keyword can only follow a
> > > nested-name-specifier:
> > >
> > > class-key nested-name-specifier template[opt] simple-template-id
> > >
> > > but we weren't detecting it.
> > >
> > > Bootstrapped/regtested on x86_64-linux, ok for trunk?
> > >
> > > 2018-11-14 Marek Polacek <polacek@redhat.com>
> > >
> > > PR c++/87781 - detect invalid elaborated-type-specifier.
> > > * parser.c (cp_parser_elaborated_type_specifier): Ensure that
> > > typename follows a nested-name-specifier.
> > >
> > > * g++.dg/parse/elab3.C: New test.
> > >
> > > diff --git gcc/cp/parser.c gcc/cp/parser.c
> > > index e9e49b15702..0ab44ab93e3 100644
> > > --- gcc/cp/parser.c
> > > +++ gcc/cp/parser.c
> > > @@ -17986,6 +17986,10 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
> > > template-id or not. */
> > > if (!template_p)
> > > cp_parser_parse_tentatively (parser);
> > > + /* The `template' keyword must follow a nested-name-specifier. */
> > > + else if (!nested_name_specifier)
> > > + return error_mark_node;
> >
> > Don't we want a diagnostic here?
>
> We'd get "invalid declarator" even without a diagnostic there but I guess it'd
> be nicer so say what the actual problem is. Unsure which diagnostic to go with,
> this patch uses cp_parser_error though.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
>
> 2018-11-14 Marek Polacek <polacek@redhat.com>
>
> PR c++/87781 - detect invalid elaborated-type-specifier.
> * parser.c (cp_parser_elaborated_type_specifier): Ensure that
> typename follows a nested-name-specifier.
>
> * g++.dg/parse/elab3.C: New test.
> * g++.dg/template/crash115.C: Adjust dg-error.
>
> diff --git gcc/cp/parser.c gcc/cp/parser.c
> index e9e49b15702..bfcf42b0f39 100644
> --- gcc/cp/parser.c
> +++ gcc/cp/parser.c
> @@ -17986,6 +17986,14 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
> template-id or not. */
> if (!template_p)
> cp_parser_parse_tentatively (parser);
> + /* The `template' keyword must follow a nested-name-specifier. */
> + else if (!nested_name_specifier)
> + {
> + cp_parser_error (parser, "%<template%> must follow a nested-"
> + "name-specifier");
> + return error_mark_node;
> + }
> +
> /* Parse the template-id. */
> token = cp_lexer_peek_token (parser->lexer);
> decl = cp_parser_template_id (parser, template_p,
> diff --git gcc/testsuite/g++.dg/parse/elab3.C gcc/testsuite/g++.dg/parse/elab3.C
> new file mode 100644
> index 00000000000..61338fb7ac4
> --- /dev/null
> +++ gcc/testsuite/g++.dg/parse/elab3.C
> @@ -0,0 +1,6 @@
> +// PR c++/87781
> +// { dg-do compile }
> +// { dg-options "" }
> +
> +template<class> class A;
> +class template A<int> *p; // { dg-error ".template. must follow|invalid" }
> diff --git gcc/testsuite/g++.dg/template/crash115.C gcc/testsuite/g++.dg/template/crash115.C
> index 5c9f525cd64..80f8683a136 100644
> --- gcc/testsuite/g++.dg/template/crash115.C
> +++ gcc/testsuite/g++.dg/template/crash115.C
> @@ -1,3 +1,3 @@
> // PR c++/56534
>
> -template < struct template rebind < > // { dg-error "expected" }
> +template < struct template rebind < > // { dg-error "expected|must follow" }