PR c++/86098 - ICE with template placeholder for TTP.
authorJason Merrill <jason@redhat.com>
Wed, 13 Jun 2018 03:33:06 +0000 (23:33 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 13 Jun 2018 03:33:06 +0000 (23:33 -0400)
* typeck.c (structural_comptypes) [TEMPLATE_TYPE_PARM]: Check
CLASS_PLACEHOLDER_TEMPLATE.

From-SVN: r261536

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/g++.dg/cpp1z/class-deduction58.C [new file with mode: 0644]

index 05105ae7cfe789038cb740f182c2f55129e3b2b0..4c23d574bf1e5a94c2813ab3ddef2eede0d6a288 100644 (file)
@@ -1,3 +1,9 @@
+2018-06-12  Jason Merrill  <jason@redhat.com>
+
+       PR c++/86098 - ICE with template placeholder for TTP.
+       * typeck.c (structural_comptypes) [TEMPLATE_TYPE_PARM]: Check
+       CLASS_PLACEHOLDER_TEMPLATE.
+
 2018-06-12  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * decl2.c (coerce_new_type, coerce_delete_type): Add location_t
index 9febdb908ae9220e745097791fe7743d1d3cfe2b..b033afd9884d5806dea1e4d1e2f888af33047a44 100644 (file)
@@ -1375,6 +1375,11 @@ structural_comptypes (tree t1, tree t2, int strict)
         template parameters set, they can't be equal.  */
       if (!comp_template_parms_position (t1, t2))
        return false;
+      /* If T1 and T2 don't represent the same class template deduction,
+         they aren't equal.  */
+      if (CLASS_PLACEHOLDER_TEMPLATE (t1)
+         != CLASS_PLACEHOLDER_TEMPLATE (t2))
+       return false;
       /* Constrained 'auto's are distinct from parms that don't have the same
         constraints.  */
       if (!equivalent_placeholder_constraints (t1, t2))
diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction58.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction58.C
new file mode 100644 (file)
index 0000000..82c3f83
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/86098
+// { dg-additional-options -std=c++17 }
+
+template <class _Res> class future;
+template <class T> T&& declval();
+
+template<template <class...> class T>
+struct construct_deduced {
+  template <class... AN>
+  using deduced_t = decltype(T{declval<AN>()...});
+  template<class... AN>
+  deduced_t<AN...> operator()(AN&&... an) const;
+};
+
+template<class T>
+future<T> future_from(T singleSender);