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