Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look
OK for trunk/15/14?

-- >8 --

This patch makes the default case of unify accept LAMBDA_EXPR P/A pairs,
which we can legitimately hit during alias CTAD guide overload resolution.
We can also less legimitately hit this during partial specialization
matching (likely IFNDR).

        PR c++/122318
        PR c++/101670

gcc/cp/ChangeLog:

        * pt.cc (unify) <default>: Handle LAMBDA_EXPR.

gcc/testsuite/ChangeLog:

        * g++.dg/cpp2a/class-deduction-alias27.C: New test.
---
 gcc/cp/pt.cc                               |  1 +
 gcc/testsuite/g++.dg/cpp2a/lambda-targ20.C | 14 ++++++++++++++
 gcc/testsuite/g++.dg/cpp2a/lambda-targ21.C | 10 ++++++++++
 3 files changed, 25 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/lambda-targ20.C
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/lambda-targ21.C

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 1d11b07d567d..5db46cd707f1 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -26650,6 +26650,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, 
int strict,
        return unify_success (explain_p);
       gcc_assert (EXPR_P (parm)
                  || TREE_CODE (parm) == CONSTRUCTOR
+                 || TREE_CODE (parm) == LAMBDA_EXPR
                  || TREE_CODE (parm) == TRAIT_EXPR);
     expr:
       /* We must be looking at an expression.  This can happen with
diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-targ20.C 
b/gcc/testsuite/g++.dg/cpp2a/lambda-targ20.C
new file mode 100644
index 000000000000..4d444bbe1121
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/lambda-targ20.C
@@ -0,0 +1,14 @@
+// PR c++/122318
+// { dg-do compile { target c++20 } }
+
+template<class T, auto V>
+struct A {
+  A() { }
+  A(T) { }
+};
+
+template<class T>
+using AT = A<T, []{}>;
+
+AT<int> a;
+AT b = a;
diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-targ21.C 
b/gcc/testsuite/g++.dg/cpp2a/lambda-targ21.C
new file mode 100644
index 000000000000..73656422333f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/lambda-targ21.C
@@ -0,0 +1,10 @@
+// PR c++/101670
+// { dg-do compile { target c++20 } }
+
+template<int, auto = []{}>
+struct A;
+
+template<int N>
+struct A<N> { }; // Partial specialization unusable due to lambda uniqueness
+
+A<0> a; // { dg-error "incomplete" }
-- 
2.53.0.118.g852829b3dd

Reply via email to