(Another) ping.
On Sun, Apr 30, 2023 at 12:00:05PM +1000, Nathaniel Shead wrote: > This patch ensures that any errors raised by finish_id_expression when > parsing a decltype expression are properly reported, rather than > potentially going ignored and causing invalid code to be accepted. > > We can also now remove the separate check for templates without args as > this is also checked for in finish_id_expression. > > PR 100482 > > gcc/cp/ChangeLog: > > * parser.cc (cp_parser_decltype_expr): Report errors raised by > finish_id_expression. > > gcc/testsuite/ChangeLog: > > * g++.dg/pr100482.C: New test. > > Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> > --- > gcc/cp/parser.cc | 22 +++++++++++----------- > gcc/testsuite/g++.dg/pr100482.C | 11 +++++++++++ > 2 files changed, 22 insertions(+), 11 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/pr100482.C > > diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc > index e5f032f2330..20ebcdc3cfd 100644 > --- a/gcc/cp/parser.cc > +++ b/gcc/cp/parser.cc > @@ -16508,10 +16508,6 @@ cp_parser_decltype_expr (cp_parser *parser, > expr = cp_parser_lookup_name_simple (parser, expr, > id_expr_start_token->location); > > - if (expr && TREE_CODE (expr) == TEMPLATE_DECL) > - /* A template without args is not a complete id-expression. */ > - expr = error_mark_node; > - > if (expr > && expr != error_mark_node > && TREE_CODE (expr) != TYPE_DECL > @@ -16532,13 +16528,17 @@ cp_parser_decltype_expr (cp_parser *parser, > &error_msg, > id_expr_start_token->location)); > > - if (expr == error_mark_node) > - /* We found an id-expression, but it was something that we > - should not have found. This is an error, not something > - we can recover from, so note that we found an > - id-expression and we'll recover as gracefully as > - possible. */ > - id_expression_or_member_access_p = true; > + if (error_msg) > + { > + /* We found an id-expression, but it was something that we > + should not have found. This is an error, not something > + we can recover from, so report the error we found and > + we'll recover as gracefully as possible. */ > + cp_parser_parse_definitely (parser); > + cp_parser_error (parser, error_msg); > + id_expression_or_member_access_p = true; > + return error_mark_node; > + } > } > > if (expr > diff --git a/gcc/testsuite/g++.dg/pr100482.C b/gcc/testsuite/g++.dg/pr100482.C > new file mode 100644 > index 00000000000..dcf6722fda5 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/pr100482.C > @@ -0,0 +1,11 @@ > +// { dg-do compile { target c++11 } } > + > +namespace N {} > +decltype(std) x; // { dg-error "expected primary-expression" } > + > +struct S {}; > +decltype(S) y; // { dg-error "argument to .decltype. must be an expression" > } > + > +template <typename T> > +struct U {}; > +decltype(U) z; // { dg-error "missing template arguments" } > -- > 2.40.0 >