]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: lambda in default type template-argument [PR100091]
authorJason Merrill <jason@redhat.com>
Thu, 15 Apr 2021 16:16:48 +0000 (12:16 -0400)
committerJason Merrill <jason@redhat.com>
Thu, 15 Apr 2021 16:42:15 +0000 (12:42 -0400)
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.

gcc/cp/parser.c
gcc/testsuite/g++.dg/cpp2a/lambda-uneval15.C [new file with mode: 0644]

index 3a10720631831c0d212101cf39595689e2bb179e..940751b5f05b8ed073eb25ead9e7da525d2fc553 100644 (file)
@@ -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 (file)
index 0000000..ae72ea3
--- /dev/null
@@ -0,0 +1,5 @@
+// PR c++/100091
+// { dg-do compile { target c++20 } }
+
+template<typename = decltype([]{})>
+void f() {}