diff options
author | Patrick Palka <ppalka@gcc.gnu.org> | 2015-07-01 01:07:35 +0000 |
---|---|---|
committer | Patrick Palka <ppalka@gcc.gnu.org> | 2015-07-01 01:07:35 +0000 |
commit | f58d5e069d601551cbc072919789e46f7fe3c77d (patch) | |
tree | ceb0b7ee730b66f97ae75356921decf7c2eff6d1 /gcc | |
parent | 5be6d9e45fe62addd10ca7950f594f8aeef3f07b (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/pr66686.C | 15 |
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; |