re PR c++/8727 (compiler confused by inheritance from an anonymous struct)
authorMark Mitchell <mark@codesourcery.com>
Sun, 1 Dec 2002 20:27:37 +0000 (20:27 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sun, 1 Dec 2002 20:27:37 +0000 (20:27 +0000)
PR c++/8727
* g++.dg/inherit/typeinfo1.C: New test.

PR c++/8663
* g++.dg/inherit/typedef1.C: New test.

PR c++/8727
* cp-tree.h (lang_type_class): Add typeinfo_var.
(CLASSTYPE_TYPEINFO_VAR): New macro.
* rtti.c (get_tinfo_decl): Use it.

PR c++/8663
* init.c (expand_member_init): Always get the main variant of a
base class.

From-SVN: r59694

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/init.c
gcc/cp/rtti.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/inherit/typedef1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/inherit/typeinfo1.C [new file with mode: 0644]

index f00d0fb0ff8ff9d6d2223d91b2e048657702ef56..8c784806e35e08b32f299dd435c0e552bfab9600 100644 (file)
@@ -1,3 +1,14 @@
+2002-12-01  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/8727
+       * cp-tree.h (lang_type_class): Add typeinfo_var.
+       (CLASSTYPE_TYPEINFO_VAR): New macro.
+       * rtti.c (get_tinfo_decl): Use it.
+
+       PR c++/8663
+       * init.c (expand_member_init): Always get the main variant of a
+       base class.
+
 2002-12-01  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/8332
index db2f082a3f38a3ee06a3c1fab1e4a674e7309e9e..0c8c37a7e20eb17a5ff9e587c15d76ba35cd51ab 100644 (file)
@@ -1159,6 +1159,7 @@ struct lang_type_class GTY(())
   tree vfields;
   tree vcall_indices;
   tree vtables;
+  tree typeinfo_var;
   tree vbases;
   tree tags;
   tree as_base;
@@ -1637,6 +1638,12 @@ struct lang_type GTY(())
 #define CLASSTYPE_VTABLES(NODE) \
   (LANG_TYPE_CLASS_CHECK (NODE)->vtables)
 
+/* The std::type_info variable representing this class, or NULL if no
+   such variable has been created.  This field is only set for the
+   TYPE_MAIN_VARIANT of the class.  */
+#define CLASSTYPE_TYPEINFO_VAR(NODE) \
+  (LANG_TYPE_CLASS_CHECK (NODE)->typeinfo_var)
+
 /* Accessor macros for the vfield slots in structures.  */
 
 /* List of virtual table fields that this type contains (both the primary
index a7db626785350aaa43e174da77a596a2fc72333c..39d4c57047e4c8252d430ab93a816eccc710963e 100644 (file)
@@ -967,7 +967,7 @@ expand_member_init (tree name, tree init)
     }
   else if (TYPE_P (name))
     {
-      basetype = name;
+      basetype = TYPE_MAIN_VARIANT (name);
       name = TYPE_NAME (name);
     }
   else if (TREE_CODE (name) == TYPE_DECL)
index 17942c30fd6f49a7cc9deddd7e38531fb08bcbde..7540b5c0e72b0fd735b542181693d46ced22010f 100644 (file)
@@ -328,6 +328,15 @@ get_tinfo_decl (type)
     type = build_function_type (TREE_TYPE (type),
                                TREE_CHAIN (TYPE_ARG_TYPES (type)));
 
+  /* For a class type, the variable is cached in the type node
+     itself.  */
+  if (CLASS_TYPE_P (type))
+    {
+      d = CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type));
+      if (d)
+       return d;
+    }
+    
   name = mangle_typeinfo_for_type (type);
 
   d = IDENTIFIER_GLOBAL_VALUE (name);
@@ -347,6 +356,9 @@ get_tinfo_decl (type)
 
       pushdecl_top_level (d);
 
+      if (CLASS_TYPE_P (type))
+       CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)) = d;
+
       /* Remember the type it is for.  */
       TREE_TYPE (name) = type;
     }
index bad7921ffba2d075994d0d9dd2e5a1985a58134e..844d5926731e15bf5c3519bc671626ee0189a28b 100644 (file)
@@ -1,3 +1,11 @@
+2002-12-01  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/8727
+       * g++.dg/inherit/typeinfo1.C: New test.
+       
+       PR c++/8663
+       * g++.dg/inherit/typedef1.C: New test.
+
 2002-11-30  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/8332
diff --git a/gcc/testsuite/g++.dg/inherit/typedef1.C b/gcc/testsuite/g++.dg/inherit/typedef1.C
new file mode 100644 (file)
index 0000000..20da08b
--- /dev/null
@@ -0,0 +1,8 @@
+namespace NS {
+class X {};
+typedef X Y;
+}
+
+struct Base : virtual public NS::Y {
+  Base() : NS::Y() {}
+};
diff --git a/gcc/testsuite/g++.dg/inherit/typeinfo1.C b/gcc/testsuite/g++.dg/inherit/typeinfo1.C
new file mode 100644 (file)
index 0000000..794776e
--- /dev/null
@@ -0,0 +1,18 @@
+typedef struct {
+   virtual const char *blah() {
+     return "Heya::blah";
+   }
+} Heya;
+
+struct Grok : public Heya {
+   virtual const char *blah() {
+     return "Grok::blah";
+   }
+};
+
+int main() {
+   Grok *g = new Grok();
+   delete g;
+   return 0;
+}
+