[gcc r15-10739] d: Side effects not evaluated for array literals on stack [PR120096]
Iain Buclaw
ibuclaw@gcc.gnu.org
Tue Jan 27 22:38:12 GMT 2026
https://gcc.gnu.org/g:74eb175c2a6af89f0908c295388b146dd9f11aa8
commit r15-10739-g74eb175c2a6af89f0908c295388b146dd9f11aa8
Author: Iain Buclaw <ibuclaw@gdcproject.org>
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.
(cherry picked from commit 8e869a0d0eff6dd26ba3c2cfade4b673a3c9db42)
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 1c1ecf2c6db3..2b466a68cffb 100644
--- a/gcc/d/expr.cc
+++ b/gcc/d/expr.cc
@@ -2708,8 +2708,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;
+}
More information about the Gcc-cvs
mailing list