PR c++/88820 - ICE with CTAD and member template used in DMI.
authorJason Merrill <jason@redhat.com>
Thu, 7 Mar 2019 16:15:56 +0000 (11:15 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 7 Mar 2019 16:15:56 +0000 (11:15 -0500)
Here the problem was that in order to form a FUNCTION_DECL for foo<int> in
the uninstantiated template, we were trying to deduce template args for S
from the template parm itself, and failing.

* pt.c (do_class_deduction): Handle parm used as its own arg.

From-SVN: r269463

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

index c2162a4..94e278d 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-07  Jason Merrill  <jason@redhat.com>
+
+       PR c++/88820 - ICE with CTAD and member template used in DMI.
+       * pt.c (do_class_deduction): Handle parm used as its own arg.
+
 2019-03-07  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/89585
index 8a5a0b3..906cfe0 100644 (file)
@@ -27184,6 +27184,9 @@ do_class_deduction (tree ptype, tree tmpl, tree init, int flags,
        error ("non-class template %qT used without template arguments", tmpl);
       return error_mark_node;
     }
+  if (init && TREE_TYPE (init) == ptype)
+    /* Using the template parm as its own argument.  */
+    return ptype;
 
   tree type = TREE_TYPE (tmpl);
 
diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction64.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction64.C
new file mode 100644 (file)
index 0000000..3a06e6f
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/88820
+// { dg-do compile { target c++17 } }
+
+template <int> struct S;
+
+template <S> struct W {
+  template <typename> static int foo();
+  bool b = foo<int>();
+};