From bc44baadce0f8c990e87b6b8876756f695e28326 Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Fri, 28 Jan 2011 23:35:59 +0000 Subject: [PATCH] re PR preprocessor/47311 ([C++0x] ICE in tsubst @cp/pt.c:10502) Fix PR c++/47311 gcc/cp/ PR c++/47311 * cp-tree.h (fixup_template_parms): Declare. * pt.c (end_template_parm_list): Do not fixup template parms here. (fixup_template_parms): Remove static. Fix typo in the comments. Remove useless code statement. (fixup_template_parm): For a template template parameter, fixup its attributes before fixing up its type. * parser.c (cp_parser_template_declaration_after_export): After parsing template parameters fixup their types. gcc/testsuite/ PR c++/47311 * g++.dg/template/param2.C: New test. From-SVN: r169377 --- gcc/cp/ChangeLog | 13 ++++++++++ gcc/cp/cp-tree.h | 1 + gcc/cp/parser.c | 7 +++-- gcc/cp/pt.c | 36 ++++++++++++-------------- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/template/param2.C | 8 ++++++ 6 files changed, 49 insertions(+), 21 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/param2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4e5c7608236..b38ed5fa10d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +2011-01-29 Dodji Seketeli + + PR c++/47311 + * cp-tree.h (fixup_template_parms): Declare. + * pt.c (end_template_parm_list): Do not fixup template parms here. + (fixup_template_parms): Remove static. Fix typo in the + comments. Remove useless code statement. + (fixup_template_parm): For a template template parameter, fixup + its attributes before fixing up its type. + * parser.c + (cp_parser_template_declaration_after_export): After parsing + template parameters fixup their types. + 2011-01-26 Jakub Jelinek PR c++/47476 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 75008260f96..934dab8c451 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5025,6 +5025,7 @@ extern bool is_auto (const_tree); extern tree process_template_parm (tree, location_t, tree, bool, bool, unsigned); extern tree end_template_parm_list (tree); +void fixup_template_parms (void); extern void end_template_decl (void); extern tree maybe_update_decl_type (tree, tree); extern bool check_default_tmpl_args (tree, tree, int, int, int); diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 41f82ac4747..2b6a752629c 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -19919,8 +19919,11 @@ cp_parser_template_declaration_after_export (cp_parser* parser, bool member_p) parameter_list = NULL_TREE; } else - /* Parse the template parameters. */ - parameter_list = cp_parser_template_parameter_list (parser); + { + /* Parse the template parameters. */ + parameter_list = cp_parser_template_parameter_list (parser); + fixup_template_parms (); + } /* Get the deferred access checks from the parameter list. These will be checked once we know what is being declared, as for a diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 7d39e1cb486..d59f32a7ea7 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -194,7 +194,6 @@ static tree template_parm_to_arg (tree t); static tree current_template_args (void); static tree fixup_template_type_parm_type (tree, int); static tree fixup_template_parm_index (tree, tree, int); -static void fixup_template_parms (void); static tree tsubst_template_parm (tree, tree, tsubst_flags_t); /* Make the current scope suitable for access checking when we are @@ -3614,8 +3613,6 @@ end_template_parm_list (tree parms) TREE_CHAIN (parm) = NULL_TREE; } - fixup_template_parms (); - --processing_template_parmlist; return saved_parmlist; @@ -3774,21 +3771,16 @@ fixup_template_parm (tree parm_desc, { /* PARM is a template template parameter. This is going to be interesting. */ - tree tparms, targs, innermost_args; + tree tparms, targs, innermost_args, t; int j; - /* First, fix up the type of the parm. */ + /* First, fix up the parms of the template template parm + because the parms are involved in defining the new canonical + type of the template template parm. */ - tree t = - fixup_template_type_parm_type (TREE_TYPE (parm), num_parms); - TREE_TYPE (parm) = t; - - TREE_VEC_ELT (fixedup_args, idx) = - template_parm_to_arg (parm_desc); - - /* Now we need to substitute the template parm types that - have been fixed up so far into the non-type template - parms of this template template parm. E.g, consider this: + /* So we need to substitute the template parm types that have + been fixed up so far into the template parms of this template + template parm. E.g, consider this: template class TT> class S; @@ -3827,6 +3819,14 @@ fixup_template_parm (tree parm_desc, TREE_VEC_LENGTH (tparms), targs); } + + /* Now fix up the type of the template template parm. */ + + t = fixup_template_type_parm_type (TREE_TYPE (parm), num_parms); + TREE_TYPE (parm) = t; + + TREE_VEC_ELT (fixedup_args, idx) = + template_parm_to_arg (parm_desc); } else if (TREE_CODE (parm) == PARM_DECL) { @@ -3882,11 +3882,11 @@ fixup_template_parm (tree parm_desc, pop_deferring_access_checks (); } -/* Walk current the template parms and properly compute the canonical +/* Walk the current template parms and properly compute the canonical types of the dependent types created during cp_parser_template_parameter_list. */ -static void +void fixup_template_parms (void) { tree arglist; @@ -3911,8 +3911,6 @@ fixup_template_parms (void) arglist = current_template_args (); arglist = add_outermost_template_args (arglist, fixedup_args); - fixedup_args = INNERMOST_TEMPLATE_ARGS (arglist); - /* Let's do the proper fixup now. */ for (i = 0; i < num_parms; ++i) fixup_template_parm (TREE_VEC_ELT (parameter_vec, i), diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 64a70322f24..f6f203dd9b0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-01-29 Dodji Seketeli + + PR c++/47311 + * g++.dg/template/param2.C: New test. + 2011-01-28 Jerry DeLisle PR libgfortran/47285 diff --git a/gcc/testsuite/g++.dg/template/param2.C b/gcc/testsuite/g++.dg/template/param2.C new file mode 100644 index 00000000000..d25b85565dd --- /dev/null +++ b/gcc/testsuite/g++.dg/template/param2.C @@ -0,0 +1,8 @@ +// Origin PR c++/47311 +// { dg-do compile } + +template < typename > class A0; +template class TC = A0> class B0; + +template class A1; +template class TC = A1> class B1;