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); +}