From: Jason Merrill Date: Thu, 13 Oct 2011 18:03:06 +0000 (-0400) Subject: re PR c++/50618 (Virtual inheritance segfault) X-Git-Tag: releases/gcc-4.4.7~213 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7cb3890d6ef4d16958a9f763d592320b831491f7;p=thirdparty%2Fgcc.git re PR c++/50618 (Virtual inheritance segfault) PR c++/50618 * init.c (expand_aggr_init_1): Don't zero-initialize virtual bases of a base subobject. From-SVN: r179938 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a5a834187d4e..3797b3a7a270 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-10-13 Jason Merrill + PR c++/50618 + * init.c (expand_aggr_init_1): Don't zero-initialize virtual + bases of a base subobject. + Backported from 4.6 branch 2011-03-11 Jakub Jelinek diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 4294acc80653..d219a4f176df 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -1443,7 +1443,12 @@ expand_aggr_init_1 (tree binfo, tree true_exp, tree exp, tree init, int flags, zero out the object first. */ else if (TYPE_NEEDS_CONSTRUCTING (type)) { - init = build_zero_init (type, NULL_TREE, /*static_storage_p=*/false); + tree field_size = NULL_TREE; + if (exp != true_exp && CLASSTYPE_AS_BASE (type) != type) + /* Don't clobber already initialized virtual bases. */ + field_size = TYPE_SIZE (CLASSTYPE_AS_BASE (type)); + init = build_zero_init_1 (type, NULL_TREE, /*static_storage_p=*/false, + field_size); init = build2 (INIT_EXPR, type, exp, init); finish_expr_stmt (init); /* And then call the constructor. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3fe28e698bbf..8ccbd7ebc5ce 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-10-13 Jason Merrill + PR c++/50618 + * g++.dg/init/vbase1.C: New. + Backported from 4.6 branch 2011-03-11 Jakub Jelinek diff --git a/gcc/testsuite/g++.dg/init/vbase1.C b/gcc/testsuite/g++.dg/init/vbase1.C new file mode 100644 index 000000000000..bbfd58f5c348 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/vbase1.C @@ -0,0 +1,39 @@ +// PR c++/50618 +// { dg-do run } + +struct Base +{ + const int text; + Base():text(1) {} + Base(int aText) + : text(aText) {} +}; +struct SubA : public virtual Base +{ +protected: + int x; +public: + SubA(int aX) + : x(aX) {} +}; +class SubB : public virtual Base +{}; +struct Diamond : public SubA, public SubB +{ + Diamond(int text) + : Base(text), SubA(5), SubB() {} + + void printText() + { + if(text != 2) + __builtin_abort(); + if(x!=5) + __builtin_abort(); + } +}; + +int main(int, char**) +{ + Diamond x(2); + x.printText(); +}