summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/jsgen.nim8
-rw-r--r--tests/int/tints.nim8
2 files changed, 15 insertions, 1 deletions
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim
index 471d51c0f..ffc11789f 100644
--- a/compiler/jsgen.nim
+++ b/compiler/jsgen.nim
@@ -788,7 +788,13 @@ proc arithAux(p: PProc, n: PNode, r: var TCompRes, op: TMagic) =
   of mEqProc: applyFormat("($1 == $2)", "($1 == $2)")
   of mUnaryMinusI: applyFormat("negInt($1)", "-($1)")
   of mUnaryMinusI64: applyFormat("negInt64($1)", "-($1)")
-  of mAbsI: applyFormat("absInt($1)", "Math.abs($1)")
+  of mAbsI:
+    let typ = n[1].typ.skipTypes(abstractVarRange)
+    if typ.kind == tyInt64 and optJsBigInt64 in p.config.globalOptions:
+      useMagic(p, "absInt64")
+      applyFormat("absInt64($1)", "absInt64($1)")
+    else:
+      applyFormat("absInt($1)", "Math.abs($1)")
   of mNot: applyFormat("!($1)", "!($1)")
   of mUnaryPlusI: applyFormat("+($1)", "+($1)")
   of mBitnotI:
diff --git a/tests/int/tints.nim b/tests/int/tints.nim
index a7d27d736..5c071c21d 100644
--- a/tests/int/tints.nim
+++ b/tests/int/tints.nim
@@ -1,5 +1,6 @@
 discard """
   matrix: "; --backend:js --jsbigint64:off; --backend:js --jsbigint64:on"
+  targets: "c js"
   output: '''
 0 0
 0 0
@@ -7,6 +8,8 @@ Success'''
 """
 # Test the different integer operations
 
+# TODO: fixme --backend:js cannot change targets!!!
+
 import std/private/jsutils
 
 var testNumber = 0
@@ -141,4 +144,9 @@ block: # shl
   when not defined(js) or (defined(js) and compileOption("jsbigint64")):
     doAssert u64 shl 1 == u64 - 1
 
+block: # bug #23378
+  var neg = -1  # prevent compile-time evaluation
+  let n = abs BiggestInt neg
+  doAssert n == 1
+
 echo("Success") #OUT Success