public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [pushed] c++: deduction guide using alias [PR99180]
@ 2021-04-10  4:06 Jason Merrill
  0 siblings, 0 replies; only message in thread
From: Jason Merrill @ 2021-04-10  4:06 UTC (permalink / raw)
  To: gcc-patches

alias_ctad_tweaks was expecting that all deduction guides for the class
would be suitable for deduction from the alias definition; in this case, the
deduction guide uses 'true' and the alias B uses 'false', so deduction
fails.  But that's OK, we just don't use that deduction guide.  I also
noticed that we were giving up on deduction entirely if substitution failed
for some guide; we should only give up on that particular deduction guide.

We ought to give a better diagnostic about this case when deduction fails,
but that can wait.

Tested x86_64-pc-linux-gnu, applying to trunk.

gcc/cp/ChangeLog:

	PR c++/99180
	PR c++/93295
	PR c++/93867
	PR c++/99118
	PR c++/96873
	* pt.c (alias_ctad_tweaks): Handle failure better.

gcc/testsuite/ChangeLog:

	PR c++/99180
	PR c++/93295
	PR c++/93867
	PR c++/95486
	* g++.dg/cpp2a/class-deduction-alias5.C: New test.
	* g++.dg/cpp2a/class-deduction-alias6.C: New test.
	* g++.dg/cpp2a/class-deduction-alias7.C: New test.
	* g++.dg/cpp2a/class-deduction-alias8.C: New test.
---
 gcc/cp/pt.c                                   |  7 ++--
 .../g++.dg/cpp2a/class-deduction-alias5.C     | 18 +++++++++++
 .../g++.dg/cpp2a/class-deduction-alias6.C     | 11 +++++++
 .../g++.dg/cpp2a/class-deduction-alias7.C     | 32 +++++++++++++++++++
 .../g++.dg/cpp2a/class-deduction-alias8.C     | 14 ++++++++
 5 files changed, 79 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/class-deduction-alias5.C
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/class-deduction-alias6.C
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/class-deduction-alias7.C
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/class-deduction-alias8.C

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index ff98bc13551..2db27413fdb 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -29039,7 +29039,8 @@ alias_ctad_tweaks (tree tmpl, tree uguides)
 	  unsigned len = TREE_VEC_LENGTH (ftparms);
 	  tree targs = make_tree_vec (len);
 	  int err = unify (ftparms, targs, ret, utype, UNIFY_ALLOW_NONE, false);
-	  gcc_assert (!err);
+	  if (err)
+	    continue;
 
 	  /* The number of parms for f' is the number of parms for A plus
 	     non-deduced parms of f.  */
@@ -29072,7 +29073,7 @@ alias_ctad_tweaks (tree tmpl, tree uguides)
 	     guideness, and explicit-specifier.  */
 	  tree g = tsubst_decl (DECL_TEMPLATE_RESULT (f), targs, complain);
 	  if (g == error_mark_node)
-	    return error_mark_node;
+	    continue;
 	  DECL_USE_TEMPLATE (g) = 0;
 	  fprime = build_template_decl (g, gtparms, false);
 	  DECL_TEMPLATE_RESULT (fprime) = g;
@@ -29086,7 +29087,7 @@ alias_ctad_tweaks (tree tmpl, tree uguides)
 	  if (ci)
 	    ci = tsubst_constraint_info (ci, targs, complain, in_decl);
 	  if (ci == error_mark_node)
-	    return error_mark_node;
+	    continue;
 
 	  /* Add a constraint that the return type matches the instantiation of
 	     A with the same template arguments.  */
diff --git a/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias5.C b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias5.C
new file mode 100644
index 00000000000..69143a3277b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias5.C
@@ -0,0 +1,18 @@
+// PR c++/99180
+// { dg-do compile { target c++17 } }
+
+template <bool, typename... Ts>
+struct A {
+  A(Ts...) {}
+};
+
+template <typename... Ts>
+using B = A<false, Ts...>;
+
+template <typename... Ts>
+A(Ts...) -> A<true, Ts...>;
+
+int main() {
+  B{};				// { dg-error "alias" "" { target c++17_down } }
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias6.C b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias6.C
new file mode 100644
index 00000000000..26a38641ab3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias6.C
@@ -0,0 +1,11 @@
+// PR c++/93295
+// { dg-do compile { target c++20 } }
+
+template<typename T, bool B = false>
+struct Foo {
+    Foo(T) {}
+};
+
+template<typename T> Foo(T) -> Foo<T>;
+template<typename T> using Bar = Foo<T, true>;
+Bar b{0};
diff --git a/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias7.C b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias7.C
new file mode 100644
index 00000000000..0d8bff7610d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias7.C
@@ -0,0 +1,32 @@
+// PR c++/93867
+// { dg-do compile { target c++20 } }
+
+template <typename CharT, unsigned N>
+struct basic_fixed_string
+{
+  constexpr basic_fixed_string(const CharT *p) {
+    for (int i = 0; i < N; ++i) {
+      m_data[i] = p[i];
+    }
+  }
+
+  CharT m_data[N] {};
+};
+
+template <typename CharT, unsigned N>
+basic_fixed_string(const CharT (&)[N]) -> basic_fixed_string<CharT,N>;
+
+template <unsigned N>
+using fixed_string = basic_fixed_string<char, N>;
+
+template <fixed_string path>
+constexpr int foo()
+{
+  return 42;
+}
+
+int main(int argc, char const *argv[])
+{
+  foo<"hello">();
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias8.C b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias8.C
new file mode 100644
index 00000000000..ec005956fa6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/class-deduction-alias8.C
@@ -0,0 +1,14 @@
+// PR c++/95486
+// { dg-do compile { target c++20 } }
+
+template<class T, class U>
+struct X { X(U) requires __is_same(U, int) {} };
+
+template<class U>
+X(U) -> X<char, U>;
+
+template<class U>
+using Y = X<void, U>;
+
+Y y{1};
+Y z{'a'}; // { dg-error "failed|no match" }

base-commit: a7ce23cec4a4a581b88c226418dc702dcd19bceb
prerequisite-patch-id: 74afe3e9039136cd1275c09f0e3f0d5efcdd8eea
-- 
2.27.0


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

only message in thread, other threads:[~2021-04-10  4:06 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-10  4:06 [pushed] c++: deduction guide using alias [PR99180] 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).