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