diff options
author | Jason Merrill <jason@redhat.com> | 2021-04-15 12:16:48 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2021-04-15 12:42:15 -0400 |
commit | 432f60c90dfb27f77e6f437bf1148f37bf73d70e (patch) | |
tree | f8e409d8c88ea197ca40b7ccad595dd6fd20c20c /gcc | |
parent | 6c0c7fc6236470a533675cd3cd1ebb1cc3dd112c (diff) | |
download | gcc-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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/parser.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/lambda-uneval15.C | 5 |
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() {} |