Fix PR c++/66686 (dependent template template substitution)
authorPatrick Palka <ppalka@gcc.gnu.org>
Wed, 1 Jul 2015 01:07:35 +0000 (01:07 +0000)
committerPatrick Palka <ppalka@gcc.gnu.org>
Wed, 1 Jul 2015 01:07:35 +0000 (01:07 +0000)
gcc/cp/ChangeLog:

PR c++/66686
* pt.c (coerce_template_template_parm) [PARM_DECL]: Don't
return 0 if tsubst returns a dependent type.

gcc/testsuite/ChangeLog:

PR c++/66686
* g++.dg/template/pr66686.C: New test.

From-SVN: r225220

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/pr66686.C [new file with mode: 0644]

index 4d9b5a6..e343641 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-01  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR c++/66686
+       * pt.c (coerce_template_template_parm) [PARM_DECL]: Don't
+       return 0 if tsubst returns a dependent type.
+
 2015-06-30  Jason Merrill  <jason@redhat.com>
 
        PR debug/66653
index 6b73d49..38d2e3a 100644 (file)
@@ -6363,11 +6363,13 @@ coerce_template_template_parm (tree parm,
           D<int, C> d;
 
         i.e. the parameter list of TT depends on earlier parameters.  */
-      if (!uses_template_parms (TREE_TYPE (arg))
-         && !same_type_p
-               (tsubst (TREE_TYPE (parm), outer_args, complain, in_decl),
-                TREE_TYPE (arg)))
-       return 0;
+      if (!uses_template_parms (TREE_TYPE (arg)))
+       {
+         tree t = tsubst (TREE_TYPE (parm), outer_args, complain, in_decl);
+         if (!uses_template_parms (t)
+             && !same_type_p (t, TREE_TYPE (arg)))
+           return 0;
+       }
       
       if (TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (arg))
          && !TEMPLATE_PARM_PARAMETER_PACK (DECL_INITIAL (parm)))
index 8fc634a..aca8886 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-01  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       PR c++/66686
+       * g++.dg/template/pr66686.C: New test.
+
 2015-06-30  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/lto17.ad[sb]: New test.
diff --git a/gcc/testsuite/g++.dg/template/pr66686.C b/gcc/testsuite/g++.dg/template/pr66686.C
new file mode 100644 (file)
index 0000000..d8aea62
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/66686
+
+template <int>
+struct Y { };
+
+template <class B, template <template <B> class Z> class C>
+struct X
+{
+  C<Y> a;  // { dg-bogus "mismatch" }
+};
+
+template <template <int> class>
+struct A { };
+
+X<int, A> a;