From: Jason Merrill Date: Sun, 24 Jul 2016 02:50:16 +0000 (-0400) Subject: PR c++/70778 - member template template parameter X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=71b3723abb23b848ed7a647506345cdfaa03fddb;p=gcc.git PR c++/70778 - member template template parameter * pt.c (tsubst): Also substitute into the template of a BOUND_TEMPLATE_TEMPLATE_PARM. From-SVN: r238686 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c9a28aed253..e5275f51020 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2016-07-23 Jason Merrill + PR c++/70778 + * pt.c (tsubst): Also substitute into the template of a + BOUND_TEMPLATE_TEMPLATE_PARM. + PR c++/71738 * pt.c (lookup_template_class_1): Handle getting template from tsubst. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index a44beadd8af..65fa9825862 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 00000000000..7d4e03ab20b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp29.C @@ -0,0 +1,21 @@ +// PR c++/70778 + +template +struct Stuff +{ + template + struct AddToFront; + + template class Holder, KeyType Indexs> + struct AddToFront > + { + }; +}; + +template +struct Holder {}; + +int main() +{ + Stuff::AddToFront<0, Holder<24> > t; +}