]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
class.c (maybe_fixup_vptrs): Remove declaration.
authorMark Mitchell <mark@codesourcery.com>
Mon, 5 Apr 1999 12:34:20 +0000 (12:34 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 5 Apr 1999 12:34:20 +0000 (12:34 +0000)
* 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
gcc/cp/class.c
gcc/cp/decl.c
gcc/cp/search.c
gcc/testsuite/g++.old-deja/g++.pt/parse2.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.pt/shadow2.C [new file with mode: 0644]

index e341bc2766be76ff1679543f224c794e6f6cd455..0e3c6fe0d9dc16e6c3b9cc596ee86c4a71c2defd 100644 (file)
@@ -1,3 +1,13 @@
+1999-04-05  Mark Mitchell  <mark@codesourcery.com>
+
+       * 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  <mark@codesourcery.com>
 
        * pt.c (check_template_shadow): Don't treat OVERLOADs as _DECL
index 6997d013f853231ba5cf1ba112c6bda6f047e882..6b7b98a3aa998599166a03a4f7e8ab35fb0b4792 100644 (file)
@@ -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));
index 63f4fec119729b2297db11d619898dfd422d4ed6..0372daedbfc145d984f5535e54764bf93b631903 100644 (file)
@@ -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.  */
index 5f4a76fe6cc19c5605ad0dd3ba921e4ce6564a8c..99e25a84a15e9184d27c07d696aa06f6dab95df3 100644 (file)
@@ -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 (file)
index 0000000..f7b737e
--- /dev/null
@@ -0,0 +1,8 @@
+// Build don't link:
+// Origin: Jason Merrill <jason@cygnus.com>
+
+template <class T> struct A {
+  A (const A&) { }
+};
+
+template A<int>::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 (file)
index 0000000..452e8ca
--- /dev/null
@@ -0,0 +1,10 @@
+// Build don't link:
+// Origin: Jason Merrill <jason@cygnus.com>
+
+template <class T> struct A { // ERROR - shadowed parameter
+  struct B {
+    void T(); // ERROR - shadows template parameter
+  };
+};
+A<int> a;
+