https://gcc.gnu.org/g:8e869a0d0eff6dd26ba3c2cfade4b673a3c9db42
commit r16-7082-g8e869a0d0eff6dd26ba3c2cfade4b673a3c9db42 Author: Iain Buclaw <[email protected]> Date: Tue Jan 27 21:51:40 2026 +0100 d: Side effects not evaluated for array literals on stack [PR120096] PR d/120096 gcc/d/ChangeLog: * expr.cc (ExprVisitor::visit (ArrayLiteralExp *)): Include saved side effects in expression result. gcc/testsuite/ChangeLog: * gdc.dg/torture/pr120096.d: New test. Diff: --- gcc/d/expr.cc | 5 +++-- gcc/testsuite/gdc.dg/torture/pr120096.d | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/gcc/d/expr.cc b/gcc/d/expr.cc index 9d698644c383..bc1f788d0221 100644 --- a/gcc/d/expr.cc +++ b/gcc/d/expr.cc @@ -2674,8 +2674,9 @@ public: /* Array literal for a `scope' dynamic array. */ gcc_assert (tb->ty == TY::Tarray); ctor = force_target_expr (ctor); - this->result_ = d_array_value (type, size_int (e->elements->length), - build_address (ctor)); + ctor = d_array_value (type, size_int (e->elements->length), + build_address (force_target_expr (ctor))); + this->result_ = compound_expr (saved_elems, ctor); } else { diff --git a/gcc/testsuite/gdc.dg/torture/pr120096.d b/gcc/testsuite/gdc.dg/torture/pr120096.d new file mode 100644 index 000000000000..7aaae2dbc76e --- /dev/null +++ b/gcc/testsuite/gdc.dg/torture/pr120096.d @@ -0,0 +1,18 @@ +// { dg-do run } +// { dg-additional-options "-fpreview=dip1000" } +// { dg-skip-if "needs gcc/config.d" { ! d_runtime } } +struct S +{ + this(int p) nothrow @nogc @safe + { f = p; } + int f; +} + +int main() nothrow @nogc @safe +{ + scope S[] sa = [S(1), S(2)]; + + assert(sa[0].f == 1); + assert(sa[1].f == 2); + return 0; +}
