summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/commands.nim4
-rw-r--r--compiler/main.nim2
-rw-r--r--lib/system/embedded.nim10
-rw-r--r--lib/system/strmantle.nim20
-rw-r--r--tests/manyloc/standalone/panicoverride.nim5
-rw-r--r--tests/manyloc/standalone2/panicoverride.nim14
-rw-r--r--tests/manyloc/standalone2/tavr.nim7
-rw-r--r--tests/manyloc/standalone2/tavr.nim.cfg4
8 files changed, 49 insertions, 17 deletions
diff --git a/compiler/commands.nim b/compiler/commands.nim
index b52148668..9fb9b7e6e 100644
--- a/compiler/commands.nim
+++ b/compiler/commands.nim
@@ -572,6 +572,8 @@ proc processSwitch*(switch, arg: string, pass: TCmdLinePass, info: TLineInfo;
         if pass in {passCmd2, passPP}:
           defineSymbol(conf.symbols, "nimSeqsV2")
           defineSymbol(conf.symbols, "nimV2")
+        if conf.exc == excNone and conf.backend != backendCpp:
+          conf.exc = excGoto
       of "orc":
         conf.selectedGC = gcOrc
         defineSymbol(conf.symbols, "gcdestructors")
@@ -581,6 +583,8 @@ proc processSwitch*(switch, arg: string, pass: TCmdLinePass, info: TLineInfo;
         if pass in {passCmd2, passPP}:
           defineSymbol(conf.symbols, "nimSeqsV2")
           defineSymbol(conf.symbols, "nimV2")
+        if conf.exc == excNone and conf.backend != backendCpp:
+          conf.exc = excGoto
       of "hooks":
         conf.selectedGC = gcHooks
         defineSymbol(conf.symbols, "gchooks")
diff --git a/compiler/main.nim b/compiler/main.nim
index 868198268..4c67aaea7 100644
--- a/compiler/main.nim
+++ b/compiler/main.nim
@@ -192,8 +192,6 @@ proc mainCommand*(graph: ModuleGraph) =
         # A better solution might be to fix system.nim
         undefSymbol(conf.symbols, "useNimRtl")
     of backendInvalid: doAssert false
-    if conf.selectedGC in {gcArc, gcOrc} and conf.backend != backendCpp:
-      conf.exc = excGoto
 
   proc compileToBackend() =
     customizeForBackend(conf.backend)
diff --git a/lib/system/embedded.nim b/lib/system/embedded.nim
index c4f15a336..258558c3f 100644
--- a/lib/system/embedded.nim
+++ b/lib/system/embedded.nim
@@ -44,3 +44,13 @@ proc setControlCHook(hook: proc () {.noconv.}) = discard
 
 proc closureIterSetupExc(e: ref Exception) {.compilerproc, inline.} =
   sysFatal(ReraiseDefect, "exception handling is not available")
+
+when gotoBasedExceptions:
+  var nimInErrorMode {.threadvar.}: bool
+
+  proc nimErrorFlag(): ptr bool {.compilerRtl, inl.} =
+    result = addr(nimInErrorMode)
+
+  proc nimTestErrorFlag() {.compilerRtl.} =
+    if nimInErrorMode:
+      sysFatal(ReraiseDefect, "exception handling is not available")
diff --git a/lib/system/strmantle.nim b/lib/system/strmantle.nim
index b5d275e25..7553f921b 100644
--- a/lib/system/strmantle.nim
+++ b/lib/system/strmantle.nim
@@ -24,26 +24,26 @@ const digitsTable = "0001020304050607080910111213141516171819" &
   #     else:
   #       res.add $i
   #   doAssert res == digitsTable
-  
+
 
 func digits10(num: uint64): int {.noinline.} =
-  if num < 10:
+  if num < 10'u64:
     result = 1
-  elif num < 100:
+  elif num < 100'u64:
     result = 2
-  elif num < 1_000:
+  elif num < 1_000'u64:
     result = 3
-  elif num < 10_000:
+  elif num < 10_000'u64:
     result = 4
-  elif num < 100_000:
+  elif num < 100_000'u64:
     result = 5
-  elif num < 1_000_000:
+  elif num < 1_000_000'u64:
     result = 6
-  elif num < 10_000_000:
+  elif num < 10_000_000'u64:
     result = 7
-  elif num < 100_000_000:
+  elif num < 100_000_000'u64:
     result = 8
-  elif num < 1_000_000_000:
+  elif num < 1_000_000_000'u64:
     result = 9
   elif num < 10_000_000_000'u64:
     result = 10
diff --git a/tests/manyloc/standalone/panicoverride.nim b/tests/manyloc/standalone/panicoverride.nim
index d9b3f4388..c0b8bb030 100644
--- a/tests/manyloc/standalone/panicoverride.nim
+++ b/tests/manyloc/standalone/panicoverride.nim
@@ -11,9 +11,4 @@ proc panic(s: string) {.noreturn.} =
   rawoutput(s)
   exit(1)
 
-# Alternatively we also could implement these 2 here:
-#
-# proc sysFatal(exceptn: typeDesc, message: string) {.noReturn.}
-# proc sysFatal(exceptn: typeDesc, message, arg: string) {.noReturn.}
-
 {.pop.}
diff --git a/tests/manyloc/standalone2/panicoverride.nim b/tests/manyloc/standalone2/panicoverride.nim
new file mode 100644
index 000000000..c0b8bb030
--- /dev/null
+++ b/tests/manyloc/standalone2/panicoverride.nim
@@ -0,0 +1,14 @@
+
+proc printf(frmt: cstring) {.varargs, importc, header: "<stdio.h>", cdecl.}
+proc exit(code: int) {.importc, header: "<stdlib.h>", cdecl.}
+
+{.push stack_trace: off, profiler:off.}
+
+proc rawoutput(s: string) =
+  printf("%s\n", s)
+
+proc panic(s: string) {.noreturn.} =
+  rawoutput(s)
+  exit(1)
+
+{.pop.}
diff --git a/tests/manyloc/standalone2/tavr.nim b/tests/manyloc/standalone2/tavr.nim
new file mode 100644
index 000000000..6cbc5c699
--- /dev/null
+++ b/tests/manyloc/standalone2/tavr.nim
@@ -0,0 +1,7 @@
+# bug #16404
+
+proc printf(frmt: cstring) {.varargs, header: "<stdio.h>", cdecl.}
+
+var x = 0
+inc x
+printf("hi %ld\n", x+4777)
diff --git a/tests/manyloc/standalone2/tavr.nim.cfg b/tests/manyloc/standalone2/tavr.nim.cfg
new file mode 100644
index 000000000..e5291969d
--- /dev/null
+++ b/tests/manyloc/standalone2/tavr.nim.cfg
@@ -0,0 +1,4 @@
+--gc:arc
+--cpu:avr
+--os:standalone
+--compileOnly