My patch for 99478 relied on local_variables_forbidden_p for distinguishing between a template parameter and its default argument, but that flag wasn't set for a default type template-argument.
Tested x86_64-pc-linux-gnu, applying to trunk. gcc/cp/ChangeLog: PR c++/100091 PR c++/99478 * parser.c (cp_parser_default_type_template_argument): Set parser->local_variables_forbidden_p. gcc/testsuite/ChangeLog: PR c++/100091 * g++.dg/cpp2a/lambda-uneval15.C: New test. --- gcc/cp/parser.c | 4 ++++ gcc/testsuite/g++.dg/cpp2a/lambda-uneval15.C | 5 +++++ 2 files changed, 9 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp2a/lambda-uneval15.C diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 3a107206318..940751b5f05 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -16923,6 +16923,10 @@ cp_parser_default_type_template_argument (cp_parser *parser) cp_token *token = cp_lexer_peek_token (parser->lexer); + /* Tell cp_parser_lambda_expression this is a default argument. */ + auto lvf = make_temp_override (parser->local_variables_forbidden_p); + parser->local_variables_forbidden_p = LOCAL_VARS_AND_THIS_FORBIDDEN; + /* Parse the default-argument. */ push_deferring_access_checks (dk_no_deferred); tree default_argument = cp_parser_type_id (parser, diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-uneval15.C b/gcc/testsuite/g++.dg/cpp2a/lambda-uneval15.C new file mode 100644 index 00000000000..ae72ea3c56b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/lambda-uneval15.C @@ -0,0 +1,5 @@ +// PR c++/100091 +// { dg-do compile { target c++20 } } + +template<typename = decltype([]{})> +void f() {} base-commit: b5f644a98b3f3543d3a8d2dfea7785c22879013f -- 2.27.0