On Sat, Jul 23, 2016 at 10:50 PM, Jason Merrill <ja...@redhat.com> wrote: > Here when we partially instantiated the declaration of the AddToFront > partial specialization, which meant substituting into > "Holder<Indexs>", we weren't replacing KeyType in the template > parameter list of Holder, leading to confusion when we encounter it > later and try to substitute in 0. > > Tested x86_64-pc-linux-gnu, applying to trunk.
commit fa7e4de043897f89467887f84e705cdd3a0cfb79 Author: Jason Merrill <ja...@redhat.com> Date: Fri Jul 22 16:42:52 2016 -0400
PR c++/70778 - member template template parameter * pt.c (tsubst): Also substitute into the template of a BOUND_TEMPLATE_TEMPLATE_PARM. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index a44bead..65fa982 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -13232,13 +13232,20 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) if (code == BOUND_TEMPLATE_TEMPLATE_PARM) { - tree argvec = tsubst (TYPE_TI_ARGS (t), args, + tree tinfo = TYPE_TEMPLATE_INFO (t); + /* We might need to substitute into the types of non-type + template parameters. */ + tree tmpl = tsubst (TI_TEMPLATE (tinfo), args, + complain, in_decl); + if (tmpl == error_mark_node) + return error_mark_node; + tree argvec = tsubst (TI_ARGS (tinfo), args, complain, in_decl); if (argvec == error_mark_node) return error_mark_node; TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (r) - = build_template_info (TYPE_TI_TEMPLATE (t), argvec); + = build_template_info (tmpl, argvec); } } break; diff --git a/gcc/testsuite/g++.dg/template/ttp29.C b/gcc/testsuite/g++.dg/template/ttp29.C new file mode 100644 index 0000000..7d4e03a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp29.C @@ -0,0 +1,21 @@ +// PR c++/70778 + +template <class KeyType> +struct Stuff +{ + template <KeyType, class> + struct AddToFront; + + template <KeyType ToAdd, template<KeyType> class Holder, KeyType Indexs> + struct AddToFront<ToAdd, Holder<Indexs> > + { + }; +}; + +template <unsigned> +struct Holder {}; + +int main() +{ + Stuff<unsigned>::AddToFront<0, Holder<24> > t; +}