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
This commit is contained in:
parent
558bb2c45e
commit
a82d6da5fc
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
8
gcc/testsuite/g++.dg/inherit/typedef1.C
Normal file
8
gcc/testsuite/g++.dg/inherit/typedef1.C
Normal file
@ -0,0 +1,8 @@
|
||||
namespace NS {
|
||||
class X {};
|
||||
typedef X Y;
|
||||
}
|
||||
|
||||
struct Base : virtual public NS::Y {
|
||||
Base() : NS::Y() {}
|
||||
};
|
18
gcc/testsuite/g++.dg/inherit/typeinfo1.C
Normal file
18
gcc/testsuite/g++.dg/inherit/typeinfo1.C
Normal file
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user