From 0347536ff2649e889cb11606a80293bf61043604 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Fri, 18 Oct 2024 10:56:37 +0800 Subject: [PATCH] fixes #24319; `move` doesn't work well with (deref (var array)) (#24321) fixes #24319 `byRefLoc` (`mapType`) requires the Loc `a` to have the right type. Without `lfEnforceDeref`, it produces the wrong type for `deref (var array)`, which may come from `mitems`. --- compiler/ccgexprs.nim | 2 +- tests/destructor/tmove.nim | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 88d177800b..dcf0c4c931 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -2321,7 +2321,7 @@ proc genWasMoved(p: BProc; n: PNode) = # [addrLoc(p.config, a), getTypeDesc(p.module, a.t)]) proc genMove(p: BProc; n: PNode; d: var TLoc) = - var a: TLoc = initLocExpr(p, n[1].skipAddr) + var a: TLoc = initLocExpr(p, n[1].skipAddr, {lfEnforceDeref}) if n.len == 4: # generated by liftdestructors: var src: TLoc = initLocExpr(p, n[2]) diff --git a/tests/destructor/tmove.nim b/tests/destructor/tmove.nim index 2762aff900..da91442def 100644 --- a/tests/destructor/tmove.nim +++ b/tests/destructor/tmove.nim @@ -16,3 +16,16 @@ block: doAssert s == 2 foo() + +import std/deques + +block: # bug #24319 + var queue = initDeque[array[32, byte]]() + for i in 0 ..< 5: + let element: array[32, byte] = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, + ] + queue.addLast(element) + + doAssert queue.popLast[^1] == byte(1)