aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2021-04-15 12:16:48 -0400
committerJason Merrill <jason@redhat.com>2021-04-15 12:42:15 -0400
commit432f60c90dfb27f77e6f437bf1148f37bf73d70e (patch)
treef8e409d8c88ea197ca40b7ccad595dd6fd20c20c
parent6c0c7fc6236470a533675cd3cd1ebb1cc3dd112c (diff)
downloadgcc-432f60c90dfb27f77e6f437bf1148f37bf73d70e.zip
gcc-432f60c90dfb27f77e6f437bf1148f37bf73d70e.tar.gz
gcc-432f60c90dfb27f77e6f437bf1148f37bf73d70e.tar.bz2
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.
-rw-r--r--gcc/cp/parser.c4
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/lambda-uneval15.C5
2 files changed, 9 insertions, 0 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 3a10720..940751b 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 0000000..ae72ea3
--- /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() {}