aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>2002-11-09 11:53:18 +0000
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>2002-11-09 11:53:18 +0000
commit5c74d5b03c53581f8f555a958f139740b1ad884c (patch)
tree230f8e2c8b355db4b3b87f5ed6e91bde71543770 /gcc/cp
parent8a9a176bf6e3d1974642d1ecb67555bef4be0acd (diff)
downloadgcc-5c74d5b03c53581f8f555a958f139740b1ad884c.zip
gcc-5c74d5b03c53581f8f555a958f139740b1ad884c.tar.gz
gcc-5c74d5b03c53581f8f555a958f139740b1ad884c.tar.bz2
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
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/cp-tree.h2
-rw-r--r--gcc/cp/mangle.c5
-rw-r--r--gcc/cp/pt.c40
4 files changed, 36 insertions, 21 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 224c590..0b5b670 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,13 @@
+2002-11-09 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ 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 <mark@codesourcery.com>
* 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 ad88103..262f6a1 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 bc7e970..523db85 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 62eef7a..db8e33f 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;
}