From: Iain Buclaw Date: Tue, 27 Jan 2026 20:51:40 +0000 (+0100) Subject: d: Side effects not evaluated for array literals on stack [PR120096] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8e869a0d0eff6dd26ba3c2cfade4b673a3c9db42;p=thirdparty%2Fgcc.git 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 --git a/gcc/d/expr.cc b/gcc/d/expr.cc index 9d698644c38..bc1f788d022 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 00000000000..7aaae2dbc76 --- /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; +}