public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-6556] c++: CTAD for less-specialized alias template [PR102529]
@ 2023-03-09 15:28 Jason Merrill
  0 siblings, 0 replies; only message in thread
From: Jason Merrill @ 2023-03-09 15:28 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:afe1f0c251d0429069c2414d4f3f14042efc174f

commit r13-6556-gafe1f0c251d0429069c2414d4f3f14042efc174f
Author: Jason Merrill <jason@redhat.com>
Date:   Thu Feb 9 12:58:35 2023 -0800

    c++: CTAD for less-specialized alias template [PR102529]
    
    The standard was unclear what happens with the transformation of a deduction
    guide if the initial template argument deduction fails for a reason other
    than not deducing all the arguments; my implementation assumed that the
    right thing was to give up on the deduction guide.  But in consideration of
    CWG2664 this week I realized that we get a better result by just continuing
    with an empty set of deductions, so the alias deduction guide is the same as
    the original deduction guide plus the deducible constraint.
    
            DR 2664
            PR c++/102529
    
    gcc/cp/ChangeLog:
    
            * pt.cc (alias_ctad_tweaks): Continue after deduction failure.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/DRs/dr2664.C: New test.
            * g++.dg/cpp2a/class-deduction-alias15.C: New test.

Diff:
---
 gcc/cp/pt.cc                                         |  4 +++-
 gcc/testsuite/g++.dg/DRs/dr2664.C                    | 17 +++++++++++++++++
 gcc/testsuite/g++.dg/cpp2a/class-deduction-alias15.C | 18 ++++++++++++++++++
 3 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 8c73ea5b0fa..65341c40f97 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -30072,7 +30072,9 @@ alias_ctad_tweaks (tree tmpl, tree uguides)
 	  tree targs = make_tree_vec (len);
 	  int err = unify (ftparms, targs, ret, utype, UNIFY_ALLOW_NONE, false);
 	  if (err)
-	    continue;
+	    /* CWG2664: Discard any deductions, still build the guide.  */
+	    for (unsigned i = 0; i < len; ++i)
+	      TREE_VEC_ELT (targs, i) = NULL_TREE;
 
 	  /* The number of parms for f' is the number of parms for A plus
 	     non-deduced parms of f.  */
diff --git a/gcc/testsuite/g++.dg/DRs/dr2664.C b/gcc/testsuite/g++.dg/DRs/dr2664.C
new file mode 100644
index 00000000000..f6bf8e2ecef
--- /dev/null
+++ b/gcc/testsuite/g++.dg/DRs/dr2664.C
@@ -0,0 +1,17 @@
+// CWG 2664
+// { dg-do compile { target c++20 } }
+
+template <class S1, class S2> struct C {
+  C(...);
+};
+
+template<class T1> C(T1) -> C<T1, T1>;
+template<class T1, class T2> C(T1, T2) -> C<T1 *, T2>;
+
+template<class V1, class V2> using A = C<V1, V2>;
+
+C c1{""};
+A a1{""};
+
+C c2{"", 1};
+A a2{"", 1};
diff --git a/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias15.C b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias15.C
new file mode 100644
index 00000000000..db615faf8e2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias15.C
@@ -0,0 +1,18 @@
+// PR c++/102529
+// { dg-do compile { target c++20 } }
+
+template <typename T>
+struct C {
+    template <typename U>
+    C(U);
+};
+
+template <typename U>
+C(U) -> C<U*>;
+
+template <typename T>
+    requires true
+using A = C<T>;
+
+C ok(1);   // ok, a is a C<int*>
+A bad(2);  // fails

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-03-09 15:28 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-09 15:28 [gcc r13-6556] c++: CTAD for less-specialized alias template [PR102529] Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).