From: Jason Merrill Date: Thu, 15 Apr 2021 16:16:48 +0000 (-0400) Subject: c++: lambda in default type template-argument [PR100091] X-Git-Tag: basepoints/gcc-12~58 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=432f60c90dfb27f77e6f437bf1148f37bf73d70e;p=thirdparty%2Fgcc.git c++: lambda in default type template-argument [PR100091] 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. 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. --- diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 3a1072063183..940751b5f05b 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 000000000000..ae72ea3c56b6 --- /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 +void f() {}