From c5540945071f17bed8009e2cfeffd7af8e830ba7 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Fri, 10 Jul 2015 23:21:39 +0000 Subject: [PATCH] re PR c++/30044 (ICE in tsubst, at cp/pt.c:7359) Fix PR c++/30044 gcc/cp/ChangeLog: PR c++/30044 * pt.c (begin_template_parm_list): Add a dummy parameter level to current_template_parms. (end_template_parm_list): Remove the dummy parameter level before adding the real one. (tsubst): Don't attempt to substitute for template parameters corresponding to a dummy argument level. (template_parms_to_args): Remove obsolete hack for giving template template arguments the proper level. (splite_late_return_type): Remove obsolete hack for giving template template arguments the proper level. * error.c (dump_template_decl): Don't print dummy template levels. gcc/testsuite/ChangeLog PR c++/30044 * g++.dg/cpp0x/auto46.C: New test. * g++.dg/template/pr30044.C: New test. * g++.dg/template/shadow2.C: New test. * g++.dg/template/error55.C: New test. * g++.dg/template/crash83.C: Accept any error string. * g++.dg/cpp0x/variadic18.C: Adjust to avoid shadowing template parameters. * g++.dg/cpp0x/variadic18.C: Likewise * g++.dg/template/canon-type-13.C: Likewise. * g++.old-deja/g++.pt/ttp42.C: Likewise. * g++.dg/torture/20070621-1.C: Likewise. From-SVN: r225706 --- gcc/cp/ChangeLog | 16 ++++++++++ gcc/cp/error.c | 8 +++++ gcc/cp/pt.c | 32 +++++++------------ gcc/testsuite/ChangeLog | 15 +++++++++ gcc/testsuite/g++.dg/cpp0x/auto46.C | 5 +++ gcc/testsuite/g++.dg/cpp0x/variadic18.C | 2 +- gcc/testsuite/g++.dg/cpp0x/variadic19.C | 2 +- gcc/testsuite/g++.dg/template/canon-type-13.C | 2 +- gcc/testsuite/g++.dg/template/crash83.C | 2 +- gcc/testsuite/g++.dg/template/error55.C | 8 +++++ gcc/testsuite/g++.dg/template/pr30044.C | 14 ++++++++ gcc/testsuite/g++.dg/template/shadow2.C | 3 ++ gcc/testsuite/g++.dg/torture/20070621-1.C | 2 +- gcc/testsuite/g++.old-deja/g++.pt/ttp42.C | 2 +- 14 files changed, 86 insertions(+), 27 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/auto46.C create mode 100644 gcc/testsuite/g++.dg/template/error55.C create mode 100644 gcc/testsuite/g++.dg/template/pr30044.C create mode 100644 gcc/testsuite/g++.dg/template/shadow2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9d9e0c145c6..2b46fbd2e1d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,19 @@ +2015-07-10 Patrick Palka + + PR c++/30044 + * pt.c (begin_template_parm_list): Add a dummy parameter level + to current_template_parms. + (end_template_parm_list): Remove the dummy parameter level + before adding the real one. + (tsubst): Don't attempt to substitute for template parameters + corresponding to a dummy argument level. + (template_parms_to_args): Remove obsolete hack for + giving template template arguments the proper level. + (splite_late_return_type): Remove obsolete hack for giving + template template arguments the proper level. + * error.c (dump_template_decl): Don't print dummy template + levels. + 2015-07-10 Paolo Carlini PR c++/54521 diff --git a/gcc/cp/error.c b/gcc/cp/error.c index b2b063842ee..b811df2b9be 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -1295,6 +1295,14 @@ dump_template_decl (cxx_pretty_printer *pp, tree t, int flags) tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms); int len = TREE_VEC_LENGTH (inner_parms); + if (len == 0) + { + /* Skip over the dummy template levels of a template template + parm. */ + gcc_assert (TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TEMPLATE_PARM); + continue; + } + pp_cxx_ws_string (pp, "template"); pp_cxx_begin_template_argument_list (pp); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 8c72a6194e2..064cbfdc4ec 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -657,6 +657,12 @@ begin_template_parm_list (void) ++processing_template_decl; ++processing_template_parmlist; note_template_header (0); + + /* Add a dummy parameter level while we process the parameter list. */ + current_template_parms + = tree_cons (size_int (processing_template_decl), + make_tree_vec (0), + current_template_parms); } /* This routine is called when a specialization is declared. If it is @@ -3888,6 +3894,9 @@ end_template_parm_list (tree parms) tree parm, next; tree saved_parmlist = make_tree_vec (list_length (parms)); + /* Pop the dummy parameter level and add the real one. */ + current_template_parms = TREE_CHAIN (current_template_parms); + current_template_parms = tree_cons (size_int (processing_template_decl), saved_parmlist, current_template_parms); @@ -4023,21 +4032,6 @@ template_parms_to_args (tree parms) args = a; } - if (length > 1 && TREE_VEC_ELT (args, 0) == NULL_TREE) - /* This can happen for template parms of a template template - parameter, e.g: - - template class TT> struct S; - - Consider the level of the parms of TT; T and U both have - level 2; TT has no template parm of level 1. So in this case - the first element of full_template_args is NULL_TREE. If we - leave it like this TMPL_ARGS_DEPTH on args returns 1 instead - of 2. This will make tsubst wrongly consider that T and U - have level 1. Instead, let's create a dummy vector as the - first element of full_template_args so that TMPL_ARGS_DEPTH - returns the correct depth for args. */ - TREE_VEC_ELT (args, 0) = make_tree_vec (1); return args; } @@ -12073,7 +12067,8 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) template_parm_level_and_index (t, &level, &idx); levels = TMPL_ARGS_DEPTH (args); - if (level <= levels) + if (level <= levels + && TREE_VEC_LENGTH (TMPL_ARGS_LEVEL (args, level)) > 0) { arg = TMPL_ARG (args, level, idx); @@ -22440,11 +22435,6 @@ splice_late_return_type (tree type, tree late_return_type) return type; argvec = make_tree_vec (1); TREE_VEC_ELT (argvec, 0) = late_return_type; - if (processing_template_parmlist) - /* For a late-specified return type in a template type-parameter, we - need to add a dummy argument level for its parmlist. */ - argvec = add_to_template_args - (make_tree_vec (processing_template_parmlist), argvec); if (current_template_parms) argvec = add_to_template_args (current_template_args (), argvec); return tsubst (type, argvec, tf_warning_or_error, NULL_TREE); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dde2803688e..fae1defbb62 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,18 @@ +2015-07-10 Patrick Palka + + PR c++/30044 + * g++.dg/cpp0x/auto46.C: New test. + * g++.dg/template/pr30044.C: New test. + * g++.dg/template/shadow2.C: New test. + * g++.dg/template/error55.C: New test. + * g++.dg/template/crash83.C: Accept any error string. + * g++.dg/cpp0x/variadic18.C: Adjust to avoid shadowing template + parameters. + * g++.dg/cpp0x/variadic18.C: Likewise + * g++.dg/template/canon-type-13.C: Likewise. + * g++.old-deja/g++.pt/ttp42.C: Likewise. + * g++.dg/torture/20070621-1.C: Likewise. + 2015-07-10 Paolo Carlini PR c++/54521 diff --git a/gcc/testsuite/g++.dg/cpp0x/auto46.C b/gcc/testsuite/g++.dg/cpp0x/auto46.C new file mode 100644 index 00000000000..09e9f4436cf --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/auto46.C @@ -0,0 +1,5 @@ +// Addendum to auto23.C, now with nested template parameter lists +// { dg-do compile { target c++11 } } + +template