From c64ce5105c102c5ef73129df3a3285d2e29f9cab Mon Sep 17 00:00:00 2001 From: metagn <metagngn@gmail.com> Date: Sun, 23 Mar 2025 01:40:33 +0300 Subject: [PATCH 1/2] disable "dest register is set" for vm statements closes #24780 --- compiler/vmgen.nim | 4 +++- tests/test_nimscript.nims | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index 6e47f6fe446cf..655d3689bc890 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -2315,7 +2315,9 @@ proc genStmt*(c: PCtx; n: PNode): int = c.gen(n, d) c.gABC(n, opcEof) if d >= 0: - globalError(c.config, n.info, "VM problem: dest register is set") + # for discardable calls etc, otherwise not valid + freeTemp(c, d) + #globalError(c.config, n.info, "VM problem: dest register is set") proc genExpr*(c: PCtx; n: PNode, requiresValue = true): int = c.removeLastEof diff --git a/tests/test_nimscript.nims b/tests/test_nimscript.nims index 32b7d1416ee39..15e9d878d8954 100644 --- a/tests/test_nimscript.nims +++ b/tests/test_nimscript.nims @@ -136,3 +136,10 @@ block: # cpDir, cpFile, dirExists, fileExists, mkDir, mvDir, mvFile, rmDir, rmF block: # check parseopt can get command line: discard initOptParser() + +# issue #24780: + +proc discardableCall(cmd: string): int {.discardable.} = + result = 123 + +discardableCall "echo hi" From f49893be215bb9462485e8961fac93b113beeb37 Mon Sep 17 00:00:00 2001 From: metagn <metagngn@gmail.com> Date: Sun, 23 Mar 2025 01:54:33 +0300 Subject: [PATCH 2/2] move eof after --- compiler/vmgen.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim index 655d3689bc890..68ef99395e76f 100644 --- a/compiler/vmgen.nim +++ b/compiler/vmgen.nim @@ -2313,11 +2313,11 @@ proc genStmt*(c: PCtx; n: PNode): int = result = c.code.len var d: TDest = -1 c.gen(n, d) - c.gABC(n, opcEof) if d >= 0: # for discardable calls etc, otherwise not valid freeTemp(c, d) #globalError(c.config, n.info, "VM problem: dest register is set") + c.gABC(n, opcEof) proc genExpr*(c: PCtx; n: PNode, requiresValue = true): int = c.removeLastEof