From: dodji Date: Fri, 28 Jan 2011 23:35:59 +0000 (+0000) Subject: Fix PR c++/47311 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=71c5bb94f750e8cc98201a400fc250081e96e0b7;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169377 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4e5c76082366..b38ed5fa10d7 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 75008260f96c..934dab8c451c 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 41f82ac47476..2b6a752629cc 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 7d39e1cb4868..d59f32a7ea78 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 64a70322f24b..f6f203dd9b01 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 000000000000..d25b85565dd9 --- /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;