aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@gcc.gnu.org>2015-07-01 01:07:35 +0000
committerPatrick Palka <ppalka@gcc.gnu.org>2015-07-01 01:07:35 +0000
commitf58d5e069d601551cbc072919789e46f7fe3c77d (patch)
treeceb0b7ee730b66f97ae75356921decf7c2eff6d1 /gcc
parent5be6d9e45fe62addd10ca7950f594f8aeef3f07b (diff)
downloadgcc-f58d5e069d601551cbc072919789e46f7fe3c77d.zip
gcc-f58d5e069d601551cbc072919789e46f7fe3c77d.tar.gz
gcc-f58d5e069d601551cbc072919789e46f7fe3c77d.tar.bz2
Fix PR c++/66686 (dependent template template substitution)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/pr66686.C15
4 files changed, 33 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4d9b5a6..e343641 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 6b73d49..38d2e3a 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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)))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8fc634a..aca8886 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..d8aea62
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr66686.C
@@ -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;