diff options
author | Jason Merrill <jason@redhat.com> | 2021-04-13 22:28:32 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2021-04-13 22:35:14 -0400 |
commit | e1666ebd9ad31dbd8b9b933c883bdd882cfd1522 (patch) | |
tree | 50b0a965cfcd7ae9f3ccc3b08cfa4f27c7aa8d43 /gcc/cp | |
parent | 0589be0c59767cf4cbb0ef0e7d918cf6aa3d606c (diff) | |
download | gcc-e1666ebd9ad31dbd8b9b933c883bdd882cfd1522.zip gcc-e1666ebd9ad31dbd8b9b933c883bdd882cfd1522.tar.gz gcc-e1666ebd9ad31dbd8b9b933c883bdd882cfd1522.tar.bz2 |
c++: lambda in non-type template parm type [PR99478]
In this testcase, the non-type template parameter has the type of a
lambda-expression. This makes no sense because a lambda in template context
is specified to be distinct between different specializations of the
template, even if the lambda is non-dependent, but here which specialization
we are dealing with depends on which lambda we have, and vice versa.
gcc/cp/ChangeLog:
PR c++/99478
* parser.c (cp_parser_lambda_expression): Reject lambda
in template parameter type.
gcc/testsuite/ChangeLog:
PR c++/99478
* g++.dg/cpp2a/lambda-uneval14.C: New test.
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/parser.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index aec3aa3..3a10720 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -10796,7 +10796,21 @@ cp_parser_lambda_expression (cp_parser* parser) LAMBDA_EXPR_LOCATION (lambda_expr) = token->location; if (cxx_dialect >= cxx20) - /* C++20 allows lambdas in unevaluated context. */; + { + /* C++20 allows lambdas in unevaluated context, but one in the type of a + non-type parameter is nonsensical. + + Distinguish a lambda in the parameter type from a lambda in the + default argument by looking at local_variables_forbidden_p, which is + only set in default arguments. */ + if (processing_template_parmlist && !parser->local_variables_forbidden_p) + { + error_at (token->location, + "lambda-expression in template parameter type"); + token->error_reported = true; + ok = false; + } + } else if (cp_unevaluated_operand) { if (!token->error_reported) |