From: Jason Merrill Date: Mon, 2 May 2011 21:59:49 +0000 (-0400) Subject: re PR c++/48834 (-fno-exceptions causes wrong code generation on C++ code) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0a2cdfe6fdd3376e694a83b3229fa03d018dbfda;p=gcc.git re PR c++/48834 (-fno-exceptions causes wrong code generation on C++ code) PR c++/48834 * tree.c (build_vec_init_expr): Set TREE_SIDE_EFFECTS. Protect an explicit target. From-SVN: r173272 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 983939e2a18..127d77a2b3e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-05-02 Jason Merrill + PR c++/48834 + * tree.c (build_vec_init_expr): Set TREE_SIDE_EFFECTS. + Protect an explicit target. + PR c++/48446 * decl.c (stabilize_save_expr_r, stabilize_vla_size): New. (compute_array_index_type): Revert earlier 48446 changes. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 2eaa1db0b22..fff3fbf28a2 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -564,6 +564,7 @@ build_vec_init_expr (tree target, tree init, tree nelts, elt_init = build_vec_init_elt (type, init, complain); init = build3 (VEC_INIT_EXPR, type, slot, init, nelts); + TREE_SIDE_EFFECTS (init) = true; SET_EXPR_LOCATION (init, input_location); if (cxx_dialect >= cxx0x @@ -571,7 +572,11 @@ build_vec_init_expr (tree target, tree init, tree nelts, VEC_INIT_EXPR_IS_CONSTEXPR (init) = true; VEC_INIT_EXPR_VALUE_INIT (init) = value_init; - if (slot != target) + if (slot == target) + /* If we specified what array we're initializing, make sure + we don't override that in cp_gimplify_init_expr. */ + init = cp_build_compound_expr (init, slot, complain); + else { init = build_target_expr (slot, init, complain); TARGET_EXPR_IMPLICIT_P (init) = 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index be4f4b608be..216beee6797 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-05-02 Jason Merrill + + * g++.dg/init/new31.C: New. + 2011-05-02 Simon Martin PR c/35445 diff --git a/gcc/testsuite/g++.dg/init/new31.C b/gcc/testsuite/g++.dg/init/new31.C new file mode 100644 index 00000000000..33c94aaabaa --- /dev/null +++ b/gcc/testsuite/g++.dg/init/new31.C @@ -0,0 +1,18 @@ +// PR c++/48834 +// { dg-options -Wuninitialized } +// { dg-do run } + +struct S +{ + S ():i (0) + { + } + int i; +}; + +int +main () +{ + S *s = new S[2]; + return 0; +}