From 5c74d5b03c53581f8f555a958f139740b1ad884c Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Sat, 9 Nov 2002 11:53:18 +0000 Subject: [PATCH] re PR c++/8389 (Access to members of base class & templates) PR c++/8389 * pt.c (instantiate_template): Push class scope for member functions. (get_mostly_instantiated_function_type): Likewise. Don't call tsubst on context. Remove CONTEXTP and TPARMSP parameters. * cp-tree.h (get_mostly_instantiated_function_type): Adjust. * mangle.c (write_encoding, write_unqualified_name): Adjust. PR c++/8389 * g++.dg/template/access6.C: New test. From-SVN: r58950 --- gcc/cp/ChangeLog | 10 +++++++ gcc/cp/cp-tree.h | 2 +- gcc/cp/mangle.c | 5 ++-- gcc/cp/pt.c | 40 ++++++++++++++----------- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/template/access6.C | 17 +++++++++++ 6 files changed, 58 insertions(+), 21 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/access6.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 224c5908fa5..0b5b67089e8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2002-11-09 Kriang Lerdsuwanakij + + PR c++/8389 + * pt.c (instantiate_template): Push class scope for member + functions. + (get_mostly_instantiated_function_type): Likewise. Don't call + tsubst on context. Remove CONTEXTP and TPARMSP parameters. + * cp-tree.h (get_mostly_instantiated_function_type): Adjust. + * mangle.c (write_encoding, write_unqualified_name): Adjust. + 2002-11-07 Mark Mitchell * class.c (add_vcall_offset_vtbl_entries_1): Correct ordering of diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index ad88103c925..262f6a1fd69 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4013,7 +4013,7 @@ extern void print_candidates PARAMS ((tree)); extern int instantiate_pending_templates PARAMS ((void)); extern tree tsubst_default_argument PARAMS ((tree, tree, tree)); extern tree most_general_template PARAMS ((tree)); -extern tree get_mostly_instantiated_function_type PARAMS ((tree, tree *, tree *)); +extern tree get_mostly_instantiated_function_type PARAMS ((tree)); extern int problematic_instantiation_changed PARAMS ((void)); extern void record_last_problematic_instantiation PARAMS ((void)); extern tree current_instantiation PARAMS ((void)); diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index bc7e970cdd9..523db85ab38 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -656,7 +656,7 @@ write_encoding (decl) tree fn_type; if (decl_is_template_id (decl, NULL)) - fn_type = get_mostly_instantiated_function_type (decl, NULL, NULL); + fn_type = get_mostly_instantiated_function_type (decl); else fn_type = TREE_TYPE (decl); @@ -1011,8 +1011,7 @@ write_unqualified_name (decl) tree type; if (decl_is_template_id (decl, NULL)) { - tree fn_type = get_mostly_instantiated_function_type (decl, NULL, - NULL); + tree fn_type = get_mostly_instantiated_function_type (decl); type = TREE_TYPE (fn_type); } else diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 62eef7ac982..db8e33f7fcb 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7786,9 +7786,19 @@ instantiate_template (tmpl, targ_ptr) } } + /* Make sure that we can see identifiers, and compute access + correctly. */ + if (DECL_CLASS_SCOPE_P (gen_tmpl)) + pushclass (tsubst (DECL_CONTEXT (gen_tmpl), targ_ptr, tf_error, + gen_tmpl), 1); + /* substitute template parameters */ fndecl = tsubst (DECL_TEMPLATE_RESULT (gen_tmpl), targ_ptr, tf_error, gen_tmpl); + + if (DECL_CLASS_SCOPE_P (gen_tmpl)) + popclass (); + /* The DECL_TI_TEMPLATE should always be the immediate parent template, not the most general template. */ DECL_TI_TEMPLATE (fndecl) = tmpl; @@ -10414,18 +10424,12 @@ tsubst_enum (tag, newtag, args) /* DECL is a FUNCTION_DECL that is a template specialization. Return its type -- but without substituting the innermost set of template arguments. So, innermost set of template parameters will appear in - the type. If CONTEXTP is non-NULL, then the partially substituted - DECL_CONTEXT (if any) will also be filled in. Similarly, TPARMSP - will be filled in with the substituted template parameters, if it - is non-NULL. */ + the type. */ tree -get_mostly_instantiated_function_type (decl, contextp, tparmsp) +get_mostly_instantiated_function_type (decl) tree decl; - tree *contextp; - tree *tparmsp; { - tree context = NULL_TREE; tree fn_type; tree tmpl; tree targs; @@ -10442,8 +10446,6 @@ get_mostly_instantiated_function_type (decl, contextp, tparmsp) my_friendly_assert (parm_depth == TMPL_ARGS_DEPTH (targs), 0); fn_type = TREE_TYPE (tmpl); - if (DECL_STATIC_FUNCTION_P (decl)) - context = DECL_CONTEXT (decl); if (parm_depth == 1) /* No substitution is necessary. */ @@ -10463,11 +10465,17 @@ get_mostly_instantiated_function_type (decl, contextp, tparmsp) TMPL_ARGS_DEPTH (targs), make_tree_vec (DECL_NTPARMS (tmpl))); + /* Make sure that we can see identifiers, and compute access + correctly. We can just use the context of DECL for the + partial substitution here. It depends only on outer template + parameters, regardless of whether the innermost level is + specialized or not. */ + if (DECL_CLASS_SCOPE_P (decl)) + pushclass (DECL_CONTEXT (decl), 1); + /* Now, do the (partial) substitution to figure out the appropriate function type. */ fn_type = tsubst (fn_type, partial_args, tf_error, NULL_TREE); - if (DECL_STATIC_FUNCTION_P (decl)) - context = tsubst (context, partial_args, tf_error, NULL_TREE); /* Substitute into the template parameters to obtain the real innermost set of parameters. This step is important if the @@ -10475,12 +10483,10 @@ get_mostly_instantiated_function_type (decl, contextp, tparmsp) parameters whose types depend on outer template parameters. */ TREE_VEC_LENGTH (partial_args)--; tparms = tsubst_template_parms (tparms, partial_args, tf_error); - } - if (contextp) - *contextp = context; - if (tparmsp) - *tparmsp = tparms; + if (DECL_CLASS_SCOPE_P (decl)) + popclass (); + } return fn_type; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2aa18e36afb..97b80de9a05 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2002-11-09 Kriang Lerdsuwanakij + + PR c++/8389 + * g++.dg/template/access6.C: New test. + Fri Nov 8 10:52:15 CET 2002 Jan Hubicka * gcc.c-torture/compile/20021108-1.c: New testcase for x86-64 failure. diff --git a/gcc/testsuite/g++.dg/template/access6.C b/gcc/testsuite/g++.dg/template/access6.C new file mode 100644 index 00000000000..fc80402ba1b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/access6.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// Origin: Detlef Vollmann + +// PR c++/8389 +// Access control ICE for typename during instantiation and name mangling + +template class Base { + protected: + typedef int Type; +}; + +template struct Derived : public Base { + typedef typename Base::Type Type; + template void f(Type = Type()) {}; +}; + +template void Derived::f (Type);