diff mbox series

[pushed] c++: lambda in default type template-argument [PR100091]

Message ID 20210415164206.782089-1-jason@redhat.com
State New
Headers show
Series [pushed] c++: lambda in default type template-argument [PR100091] | expand

Commit Message

Jason Merrill April 15, 2021, 4:42 p.m. UTC
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


base-commit: b5f644a98b3f3543d3a8d2dfea7785c22879013f
diff mbox series

Patch

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() {}