From e493c503f9d5a9682c18b64d9ef1a00b243fa231 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 14 Mar 2018 15:17:03 -0400 Subject: [PATCH] PR c++/83916 - ICE with template template parameters. * pt.c (convert_template_argument): Don't substitute into type of non-type parameter if we don't have enough arg levels. (unify): Likewise. From-SVN: r258533 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/pt.c | 28 +++++++++++++++++++-------- gcc/testsuite/g++.dg/template/ttp31.C | 10 ++++++++++ gcc/testsuite/g++.dg/template/ttp32.C | 10 ++++++++++ 4 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/ttp31.C create mode 100644 gcc/testsuite/g++.dg/template/ttp32.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 067d53835b6..a4ffc663dc1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2018-03-14 Jason Merrill + + PR c++/83916 - ICE with template template parameters. + * pt.c (convert_template_argument): Don't substitute into type of + non-type parameter if we don't have enough arg levels. + (unify): Likewise. + 2018-03-14 Marek Polacek PR c++/84596 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index d720c33cf0a..14321816cde 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7974,7 +7974,11 @@ convert_template_argument (tree parm, { tree t = TREE_TYPE (parm); - if (tree a = type_uses_auto (t)) + if (TEMPLATE_PARM_LEVEL (get_template_parm_index (parm)) + > TMPL_ARGS_DEPTH (args)) + /* We don't have enough levels of args to do any substitution. This + can happen in the context of -fnew-ttp-matching. */; + else if (tree a = type_uses_auto (t)) { t = do_auto_deduction (t, arg, a, complain, adc_unify, args); if (t == error_mark_node) @@ -21224,14 +21228,22 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict, template-parameter exactly, except that a template-argument deduced from an array bound may be of any integral type. The non-type parameter might use already deduced type parameters. */ - ++processing_template_decl; - tparm = tsubst (TREE_TYPE (parm), targs, 0, NULL_TREE); - --processing_template_decl; - if (tree a = type_uses_auto (tparm)) + tparm = TREE_TYPE (parm); + if (TEMPLATE_PARM_LEVEL (parm) > TMPL_ARGS_DEPTH (targs)) + /* We don't have enough levels of args to do any substitution. This + can happen in the context of -fnew-ttp-matching. */; + else { - tparm = do_auto_deduction (tparm, arg, a, complain, adc_unify); - if (tparm == error_mark_node) - return 1; + ++processing_template_decl; + tparm = tsubst (tparm, targs, tf_none, NULL_TREE); + --processing_template_decl; + + if (tree a = type_uses_auto (tparm)) + { + tparm = do_auto_deduction (tparm, arg, a, complain, adc_unify); + if (tparm == error_mark_node) + return 1; + } } if (!TREE_TYPE (arg)) diff --git a/gcc/testsuite/g++.dg/template/ttp31.C b/gcc/testsuite/g++.dg/template/ttp31.C new file mode 100644 index 00000000000..ff3f1f5c3ac --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp31.C @@ -0,0 +1,10 @@ +// PR c++/83916 +// { dg-do compile { target c++11 } } + +template class TTA, TA... VA> +struct A { }; + +template class TTC, TC... VC> +struct C : A { }; diff --git a/gcc/testsuite/g++.dg/template/ttp32.C b/gcc/testsuite/g++.dg/template/ttp32.C new file mode 100644 index 00000000000..a96a62d332f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ttp32.C @@ -0,0 +1,10 @@ +// PR c++/83916 +// { dg-do compile { target c++17 } } + +template class TTA, TA... VA> +struct A { }; + +template class TTC, TC... VC> +struct C : A { }; -- 2.30.2