When regenerating a constrained lambda during instantiation of an enclosing template, we are forgetting to substitute into the lambda's constraints. Fix this by substituting through the constraints during tsubst_lambda_expr. gcc/cp/ChangeLog: PR c++/92633 PR c++/92838 * pt.c (tsubst_function_decl): Don't do set_constraints when regenerating a lambda. (tsubst_lambda_expr): Substitute into the lambda's constraints and do set_constraints here. gcc/testsuite/ChangeLog: PR c++/92633 PR c++/92838 * g++.dg/cpp2a/concepts-lambda11.C: New test. * g++.dg/cpp2a/concepts-lambda12.C: New test.
18 lines
321 B
C
18 lines
321 B
C
// PR c++/92838
|
|
// { dg-do compile { target c++20 } }
|
|
|
|
template<int N>
|
|
auto foo()
|
|
{
|
|
[] () requires (N != 0) { }(); // { dg-error "no match" }
|
|
[] () requires (N == 0) { }();
|
|
|
|
[] <int M=1> () requires (N == M) { }(); // { dg-error "no match" }
|
|
[] <int M=1> () requires (N != M) { }();
|
|
}
|
|
|
|
void bar()
|
|
{
|
|
foo<0>();
|
|
}
|