From 8db14cf8467ca25256904d51169b176c9c89afb1 Mon Sep 17 00:00:00 2001 From: Martin Kinkelin Date: Wed, 19 Mar 2025 00:15:23 +0100 Subject: [PATCH] Fix #21020 - Indexing a *cast* AA yields no lvalue anymore (#21029) --- compiler/src/dmd/expression.d | 1 + compiler/test/runnable/test21020.d | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 compiler/test/runnable/test21020.d diff --git a/compiler/src/dmd/expression.d b/compiler/src/dmd/expression.d index ef5c0b09eb..4bf1f9f25f 100644 --- a/compiler/src/dmd/expression.d +++ b/compiler/src/dmd/expression.d @@ -3632,6 +3632,7 @@ extern (C++) final class CastExp : UnaExp if (rvalue || !e1.isLvalue()) return false; return (to.ty == Tsarray && (e1.type.ty == Tvector || e1.type.ty == Tsarray)) || + (to.ty == Taarray && e1.type.ty == Taarray) || e1.type.mutableOf.unSharedOf().equals(to.mutableOf().unSharedOf()); } diff --git a/compiler/test/runnable/test21020.d b/compiler/test/runnable/test21020.d new file mode 100644 index 0000000000..484db30a56 --- /dev/null +++ b/compiler/test/runnable/test21020.d @@ -0,0 +1,11 @@ +// https://github.com/dlang/dmd/issues/21020 + +shared struct Queue { + int[int] map; +} + +void main() { + auto queue = Queue(); + (cast(int[int]) queue.map)[1] = 2; + assert(queue.map[1] == 2); +}