The following code fails to compile with trunk with -std=c++2a template<class A, class B> concept different_than = !__is_same_as(A, B); template<class B> auto diff(B) { return [](different_than<B> auto a) {}; } int main() { diff(42)(""); } By the time the compiler evaluates the constraint, it seems to have forgotten the context in which the constraint lives; that is, it no longer seems to know what type B is. I think the code should compile, and it does with clang-concepts: https://godbolt.org/z/3QzhxS
Reconfirmed with GCC master, looking into it.
The master branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>: https://gcc.gnu.org/g:c2449995ca36ea955e3c6d4ee7f0d401b512c897 commit r11-779-gc2449995ca36ea955e3c6d4ee7f0d401b512c897 Author: Patrick Palka <ppalka@redhat.com> Date: Mon Jun 1 21:37:04 2020 -0400 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.
The releases/gcc-10 branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>: https://gcc.gnu.org/g:40912c25b57b4e21aae20a4896624387aa13f7ed commit r10-8223-g40912c25b57b4e21aae20a4896624387aa13f7ed Author: Patrick Palka <ppalka@redhat.com> Date: Mon Jun 1 21:37:04 2020 -0400 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. (cherry picked from commit c2449995ca36ea955e3c6d4ee7f0d401b512c897)
Fixed for GCC 10.2+.
*** Bug 93152 has been marked as a duplicate of this bug. ***
*** Bug 93154 has been marked as a duplicate of this bug. ***