From 908c4e83161c7166e0d86864b88d29115b003c5a Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Mon, 5 Apr 1999 12:34:20 +0000 Subject: [PATCH] class.c (maybe_fixup_vptrs): Remove declaration. * class.c (maybe_fixup_vptrs): Remove declaration. (build_class_init_list): Likewise. * decl.c (pushdecl_class_level): Call check_template_shadow here ... (push_class_level_binding): ... not here. * search.c (dfs_push_type_decls): Only avoid template-self-reference TYPE_DECLs if they are from base classes. From-SVN: r26202 --- gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/class.c | 2 -- gcc/cp/decl.c | 8 +++++--- gcc/cp/search.c | 3 ++- gcc/testsuite/g++.old-deja/g++.pt/parse2.C | 8 ++++++++ gcc/testsuite/g++.old-deja/g++.pt/shadow2.C | 10 ++++++++++ 6 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/parse2.C create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/shadow2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e341bc2766b..0e3c6fe0d9d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +1999-04-05 Mark Mitchell + + * class.c (maybe_fixup_vptrs): Remove declaration. + (build_class_init_list): Likewise. + * decl.c (pushdecl_class_level): Call check_template_shadow here + ... + (push_class_level_binding): ... not here. + * search.c (dfs_push_type_decls): Only avoid + template-self-reference TYPE_DECLs if they are from base classes. + 1999-04-04 Mark Mitchell * pt.c (check_template_shadow): Don't treat OVERLOADs as _DECL diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 6997d013f85..6b7b98a3aa9 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -121,7 +121,6 @@ static void merge_overrides PROTO((tree, tree, int, tree)); static void override_one_vtable PROTO((tree, tree, tree)); static void mark_overriders PROTO((tree, tree)); static void check_for_override PROTO((tree, tree)); -static tree maybe_fixup_vptrs PROTO((tree, tree, tree)); static tree get_class_offset_1 PROTO((tree, tree, tree, tree, tree)); static tree get_class_offset PROTO((tree, tree, tree, tree)); static void modify_one_vtable PROTO((tree, tree, tree, tree)); @@ -130,7 +129,6 @@ static void modify_all_direct_vtables PROTO((tree, int, tree, tree, tree)); static void modify_all_indirect_vtables PROTO((tree, int, int, tree, tree, tree)); -static void build_class_init_list PROTO((tree)); static int finish_base_struct PROTO((tree, struct base_info *)); static void finish_struct_methods PROTO((tree)); static void maybe_warn_about_overly_private_class PROTO ((tree)); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 63f4fec1197..0372daedbfc 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -4159,9 +4159,6 @@ pushdecl_class_level (x) if (name) { - if (TYPE_BEING_DEFINED (current_class_type)) - check_template_shadow (x); - push_class_level_binding (name, x); if (TREE_CODE (x) == TYPE_DECL) set_identifier_type_value (name, TREE_TYPE (x)); @@ -4214,6 +4211,11 @@ push_class_level_binding (name, x) if (!class_binding_level) return; + /* Make sure that this new member does not have the same name + as a template parameter. */ + if (TYPE_BEING_DEFINED (current_class_type)) + check_template_shadow (x); + /* If this declaration shadows a declaration from an enclosing class, then we will need to restore IDENTIFIER_CLASS_VALUE when we leave this class. Record the shadowed declaration here. */ diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 5f4a76fe6cc..99e25a84a15 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -2943,7 +2943,8 @@ dfs_push_type_decls (binfo, data) type = BINFO_TYPE (binfo); for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields)) if (DECL_NAME (fields) && TREE_CODE (fields) == TYPE_DECL - && !template_self_reference_p (type, fields)) + && !(!same_type_p (type, current_class_type) + && template_self_reference_p (type, fields))) setup_class_bindings (DECL_NAME (fields), /*type_binding_p=*/1); /* We can't just use BINFO_MARKED because envelope_add_decl uses diff --git a/gcc/testsuite/g++.old-deja/g++.pt/parse2.C b/gcc/testsuite/g++.old-deja/g++.pt/parse2.C new file mode 100644 index 00000000000..f7b737e6915 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/parse2.C @@ -0,0 +1,8 @@ +// Build don't link: +// Origin: Jason Merrill + +template struct A { + A (const A&) { } +}; + +template A::A (const A&); diff --git a/gcc/testsuite/g++.old-deja/g++.pt/shadow2.C b/gcc/testsuite/g++.old-deja/g++.pt/shadow2.C new file mode 100644 index 00000000000..452e8ca63b9 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/shadow2.C @@ -0,0 +1,10 @@ +// Build don't link: +// Origin: Jason Merrill + +template struct A { // ERROR - shadowed parameter + struct B { + void T(); // ERROR - shadows template parameter + }; +}; +A a; + -- 2.30.2