From a7711d452d655c4e4c109ecea87e307ce3bc63aa Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Tue, 11 Mar 2025 16:59:55 +0800 Subject: [PATCH] fixes #24754; {.gcsafe.} block breaks move analysis (#24757) fixes #24754 --- compiler/injectdestructors.nim | 2 +- tests/arc/tarcmisc.nim | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/compiler/injectdestructors.nim b/compiler/injectdestructors.nim index b0fa733982..ce9164058a 100644 --- a/compiler/injectdestructors.nim +++ b/compiler/injectdestructors.nim @@ -1164,7 +1164,7 @@ proc moveOrCopy(dest, ri: PNode; c: var Con; s: var Scope, flags: set[MoveOrCopy c.finishCopy(result, dest, flags, isFromSink = false) of nkHiddenSubConv, nkHiddenStdConv, nkConv, nkObjDownConv, nkObjUpConv, nkCast: result = c.genSink(s, dest, p(ri, c, s, sinkArg), flags) - of nkStmtListExpr, nkBlockExpr, nkIfExpr, nkCaseStmt, nkTryStmt: + of nkStmtListExpr, nkBlockExpr, nkIfExpr, nkCaseStmt, nkTryStmt, nkPragmaBlock: template process(child, s): untyped = moveOrCopy(dest, child, c, s, flags) # We know the result will be a stmt so we use that fact to optimize handleNestedTempl(ri, process, willProduceStmt = true) diff --git a/tests/arc/tarcmisc.nim b/tests/arc/tarcmisc.nim index 12d67a999b..f8a50c0d21 100644 --- a/tests/arc/tarcmisc.nim +++ b/tests/arc/tarcmisc.nim @@ -898,3 +898,17 @@ proc bar = mutate(("1.2", 0, 0)) bar() + +block: # bug #24754 + type NoCopy = object + id: int + + proc `=copy`(a: var NoCopy, b: NoCopy) {.error.} + + + proc foo(): NoCopy = + {.gcsafe.}: + let s = 12 + NoCopy(id: s) + + doAssert foo().id == 12