diff options
author | Mark Mitchell <mark@codesourcery.com> | 2002-12-01 20:27:37 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2002-12-01 20:27:37 +0000 |
commit | a82d6da5fcc41ade40261bca65c7717686c1ac9f (patch) | |
tree | 949e579a2127ed5b717cc2f0c87ffab7e3cf700e | |
parent | 558bb2c45e1eb7ef91a7ed959aad41b7b2eb6cf9 (diff) | |
download | gcc-a82d6da5fcc41ade40261bca65c7717686c1ac9f.zip gcc-a82d6da5fcc41ade40261bca65c7717686c1ac9f.tar.gz gcc-a82d6da5fcc41ade40261bca65c7717686c1ac9f.tar.bz2 |
re PR c++/8727 (compiler confused by inheritance from an anonymous struct)
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
-rw-r--r-- | gcc/cp/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 7 | ||||
-rw-r--r-- | gcc/cp/init.c | 2 | ||||
-rw-r--r-- | gcc/cp/rtti.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/typedef1.C | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/typeinfo1.C | 18 |
7 files changed, 65 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f00d0fb..8c78480 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,16 @@ 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 PR c++/8493 * decl.c (cxx_init_decl_processing): Use size_type_node, not diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index db2f082..0c8c37a 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index a7db626..39d4c57 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -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) diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index 17942c3..7540b5c 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bad7921..844d592 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..20da08b --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/typedef1.C @@ -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 index 0000000..794776e --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/typeinfo1.C @@ -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; +} + |