From: drow Date: Thu, 8 Nov 2007 12:48:28 +0000 (+0000) Subject: * class.c (build_ctor_vtbl_group): Lay out the new type and decl. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ed111d2b116ffa865e970b8a2ec8cec0e76be440;p=thirdparty%2Fgcc.git * class.c (build_ctor_vtbl_group): Lay out the new type and decl. * g++.dg/opt/anchor1.C: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129997 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a294e7626202..e28f5822d4b1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2007-11-08 Daniel Jacobowitz + + * class.c (build_ctor_vtbl_group): Lay out the new type and decl. + 2007-11-07 Douglas Gregor PR c++/33045 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index e468db30442c..6e67157a290a 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -7006,7 +7006,10 @@ build_ctor_vtbl_group (tree binfo, tree t) /* Figure out the type of the construction vtable. */ type = build_index_type (size_int (list_length (inits) - 1)); type = build_cplus_array_type (vtable_entry_type, type); + layout_type (type); TREE_TYPE (vtbl) = type; + DECL_SIZE (vtbl) = DECL_SIZE_UNIT (vtbl) = NULL_TREE; + layout_decl (vtbl, 0); /* Initialize the construction vtable. */ CLASSTYPE_VTABLES (t) = chainon (CLASSTYPE_VTABLES (t), vtbl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2a863b9463fc..fdbbb6bbe4d9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-11-08 Daniel Jacobowitz + + * g++.dg/opt/anchor1.C: New. + 2007-11-07 Diego Novillo PR 33870 diff --git a/gcc/testsuite/g++.dg/opt/anchor1.C b/gcc/testsuite/g++.dg/opt/anchor1.C new file mode 100644 index 000000000000..5d30afbe8a3c --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/anchor1.C @@ -0,0 +1,59 @@ +// { dg-do run } +// { dg-options "-O2" } + +// The size of the construction vtable for YFont in YCoreFont was not +// updated to reflect its actual size. On targets with section anchor +// support, the vtable for YCoreFont was laid out immediately after +// that, but the compiler thought it was about 40 bytes closer to the +// anchor than it actually was. + +extern "C" void abort (void); + +class refcounted { +public: + int __refcount; + +public: + refcounted(): __refcount(0) {}; + virtual ~refcounted() {} +}; + +class YFont : public virtual refcounted { +public: + virtual ~YFont() {} + + virtual int ascent() const = 0; +}; + +struct XFontStruct { +}; + +class YCoreFont : public YFont { +public: + YCoreFont(char const * name); + virtual ~YCoreFont(); + + virtual int ascent() const { return 2; } + +private: + XFontStruct * fFont; +}; + +YCoreFont::YCoreFont(char const * name) { +} + +YCoreFont::~YCoreFont() { +} + +int foo(YCoreFont *ycf) +{ + ycf->ascent (); +} + +int main() +{ + YCoreFont ycf(""); + if (foo(&ycf) != 2) + abort (); + return 0; +}