public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jason Merrill <jason@redhat.com>
To: gcc-patches@gcc.gnu.org
Subject: [PATCH 3/3] c++: CTAD for less-specialized alias template [PR102529]
Date: Sat, 18 Feb 2023 16:42:39 -0500	[thread overview]
Message-ID: <20230218214239.2297623-3-jason@redhat.com> (raw)
In-Reply-To: <20230218214239.2297623-1-jason@redhat.com>

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.
---
 gcc/cp/pt.cc                                   |  4 +++-
 gcc/testsuite/g++.dg/DRs/dr2664.C              | 17 +++++++++++++++++
 .../g++.dg/cpp2a/class-deduction-alias15.C     | 18 ++++++++++++++++++
 3 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/DRs/dr2664.C
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/class-deduction-alias15.C

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 1934c9dafac..69391450b75 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -30063,7 +30063,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
-- 
2.31.1


  parent reply	other threads:[~2023-02-18 21:42 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-18 21:42 [PATCH RFC 1/3] c++: add __is_deducible trait [PR105841] Jason Merrill
2023-02-18 21:42 ` [PATCH 2/3] c++: fix alias CTAD [PR105841] Jason Merrill
2023-02-18 21:42 ` Jason Merrill [this message]
2023-02-20 16:58 ` [PATCH RFC 1/3] c++: add __is_deducible trait [PR105841] Patrick Palka
2023-03-09 15:28   ` Jason Merrill

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230218214239.2297623-3-jason@redhat.com \
    --to=jason@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).