aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2016-12-22 10:19:54 -0500
committerJason Merrill <jason@gcc.gnu.org>2016-12-22 10:19:54 -0500
commitdd809fdeca8088bb91e6414d834e3e322dcdf14c (patch)
tree0853e281f9de0cc4c9ba0879a7213d45957f03c5 /gcc
parent745b451267cc14759724f3b03bbe12e2335aa5e8 (diff)
downloadgcc-dd809fdeca8088bb91e6414d834e3e322dcdf14c.zip
gcc-dd809fdeca8088bb91e6414d834e3e322dcdf14c.tar.gz
gcc-dd809fdeca8088bb91e6414d834e3e322dcdf14c.tar.bz2
PR c++/78898 - ICE on constructor with TTP
PR c++/42329 * pt.c (unify): Don't look for a class template from a non-class. From-SVN: r243890
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c3
-rw-r--r--gcc/testsuite/g++.dg/template/ttp30.C6
3 files changed, 14 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 925d0b5..6f193c4 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2016-12-22 Jason Merrill <jason@redhat.com>
+
+ PR c++/78898
+ PR c++/42329
+ * pt.c (unify): Don't look for a class template from a non-class.
+
2016-12-21 Jakub Jelinek <jakub@redhat.com>
PR c++/72707
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 301eb52..7711546 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -20292,7 +20292,8 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict,
if (TREE_CODE (parm) == BOUND_TEMPLATE_TEMPLATE_PARM)
{
- if (strict_in & UNIFY_ALLOW_DERIVED)
+ if ((strict_in & UNIFY_ALLOW_DERIVED)
+ && CLASS_TYPE_P (arg))
{
/* First try to match ARG directly. */
tree t = try_class_unification (tparms, targs, parm, arg,
diff --git a/gcc/testsuite/g++.dg/template/ttp30.C b/gcc/testsuite/g++.dg/template/ttp30.C
new file mode 100644
index 0000000..f7b9ce7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ttp30.C
@@ -0,0 +1,6 @@
+// PR c++/78898
+
+struct A {
+ template <class T> A(T);
+ template <template <typename> class SmartPtr> A(SmartPtr<int>) { A(0); }
+};