Commit 1fb0b801 by Jason Merrill Committed by Jason Merrill

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: r179934
parent 40746f40
2011-10-13 Jason Merrill <jason@redhat.com>
PR c++/50618
* init.c (expand_aggr_init_1): Don't zero-initialize virtual
bases of a base subobject.
2011-10-12 Paolo Carlini <paolo.carlini@oracle.com> 2011-10-12 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/50594 PR c++/50594
......
...@@ -1588,27 +1588,25 @@ expand_aggr_init_1 (tree binfo, tree true_exp, tree exp, tree init, int flags, ...@@ -1588,27 +1588,25 @@ expand_aggr_init_1 (tree binfo, tree true_exp, tree exp, tree init, int flags,
that's value-initialization. */ that's value-initialization. */
if (init == void_type_node) if (init == void_type_node)
{ {
/* If there's a user-provided constructor, we just call that. */ /* If no user-provided ctor, we need to zero out the object. */
if (type_has_user_provided_constructor (type)) if (!type_has_user_provided_constructor (type))
/* Fall through. */; {
/* If there isn't, but we still need to call the constructor, tree field_size = NULL_TREE;
zero out the object first. */ if (exp != true_exp && CLASSTYPE_AS_BASE (type) != type)
else if (type_build_ctor_call (type)) /* Don't clobber already initialized virtual bases. */
{ field_size = TYPE_SIZE (CLASSTYPE_AS_BASE (type));
init = build_zero_init (type, NULL_TREE, /*static_storage_p=*/false); init = build_zero_init_1 (type, NULL_TREE, /*static_storage_p=*/false,
field_size);
init = build2 (INIT_EXPR, type, exp, init); init = build2 (INIT_EXPR, type, exp, init);
finish_expr_stmt (init); finish_expr_stmt (init);
/* And then call the constructor. */
} }
/* If we don't need to mess with the constructor at all, /* If we don't need to mess with the constructor at all,
then just zero out the object and we're done. */ then we're done. */
else if (! type_build_ctor_call (type))
{
init = build2 (INIT_EXPR, type, exp,
build_value_init_noctor (type, complain));
finish_expr_stmt (init);
return; return;
}
/* Otherwise fall through and call the constructor. */
init = NULL_TREE; init = NULL_TREE;
} }
......
2011-10-13 Jason Merrill <jason@redhat.com>
PR c++/50618
* g++.dg/init/vbase1.C: New.
2011-10-13 Jakub Jelinek <jakub@redhat.com> 2011-10-13 Jakub Jelinek <jakub@redhat.com>
* gcc.target/i386/sse4_1-phminposuw-2.c: New test. * gcc.target/i386/sse4_1-phminposuw-2.c: New test.
......
// 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();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment