8sa1-gcc/gcc/testsuite/g++.dg/cpp2a/concepts-lambda11.C
Patrick Palka c2449995ca c++: constrained lambda inside template [PR92633]
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.
2020-06-01 21:37:04 -04:00

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