From 8f563f2cc94d4bf9f206bd68eab75a4630c73500 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 (cherry picked from commit a7711d452d655c4e4c109ecea87e307ce3bc63aa) --- 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 6b8fc3b06f..c69610a451 100644 --- a/tests/arc/tarcmisc.nim +++ b/tests/arc/tarcmisc.nim @@ -882,3 +882,17 @@ proc test_18070() = # bug #18070 doAssert msg == "", "expected empty string but got: " & $msg test_18070() + +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