From 2234a9cb75c9f2ba6d6b944a93c673e5b3fc004a Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Fri, 17 Apr 2015 12:14:24 +0000 Subject: [PATCH] re PR c++/64527 (Constructor for empty struct not called in some situations) Fix PR c++/64527 gcc/ PR c++/64527 * gimplify.c (gimplify_init_constructor): Always emit a side-effecting constructor. gcc/testsuite/ PR c++/64527 * g++.dg/init/pr64527.C: New test. From-SVN: r222176 --- gcc/ChangeLog | 6 ++++++ gcc/gimplify.c | 11 ++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/init/pr64527.C | 21 +++++++++++++++++++++ 4 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/init/pr64527.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8929d06d5f9..bd25dd7f1f5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-04-17 Patrick Palka + + PR c++/64527 + * gimplify.c (gimplify_init_constructor): Always emit a + side-effecting constructor. + 2015-04-17 Tom de Vries PR tree-optimization/64950 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 0394543ef7b..c701ef3954f 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -3994,6 +3994,9 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, pre_p, post_p, &preeval_data); } + bool ctor_has_side_effects_p + = TREE_SIDE_EFFECTS (TREE_OPERAND (*expr_p, 1)); + if (cleared) { /* Zap the CONSTRUCTOR element list, which simplifies this case. @@ -4006,9 +4009,11 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, } /* If we have not block cleared the object, or if there are nonzero - elements in the constructor, add assignments to the individual - scalar fields of the object. */ - if (!cleared || num_nonzero_elements > 0) + elements in the constructor, or if the constructor has side effects, + add assignments to the individual scalar fields of the object. */ + if (!cleared + || num_nonzero_elements > 0 + || ctor_has_side_effects_p) gimplify_init_ctor_eval (object, elts, pre_p, cleared); *expr_p = NULL_TREE; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6b9b5766c6b..1f9f1d4e03c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-04-17 Patrick Palka + + PR c++/64527 + * g++.dg/init/pr64527.C: New test. + 2015-04-17 Tom de Vries Michael Matz diff --git a/gcc/testsuite/g++.dg/init/pr64527.C b/gcc/testsuite/g++.dg/init/pr64527.C new file mode 100644 index 00000000000..36b82141cae --- /dev/null +++ b/gcc/testsuite/g++.dg/init/pr64527.C @@ -0,0 +1,21 @@ +// { dg-do run { target c++11 } } + +static int g; + +struct A { + A() { g = 1; } +}; + +struct accessor { + A a; + int x; +}; + +int +main (void) +{ + (void) accessor{}; + + if (g != 1) + __builtin_abort (); +} -- 2.30.2