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