summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semfold.nim10
-rw-r--r--tests/arithm/tand.nim20
2 files changed, 25 insertions, 5 deletions
diff --git a/compiler/semfold.nim b/compiler/semfold.nim
index e3469c602..05e398c9a 100644
--- a/compiler/semfold.nim
+++ b/compiler/semfold.nim
@@ -216,24 +216,24 @@ proc getIntervalType*(m: TMagic, n: PNode): PType =
     if b.kind in ordIntLit:
       let x = b.intVal|+|1
       if (x and -x) == x and x >= 0:
-        result = makeRange(a.typ, 0, b.intVal)
+        result = makeRange(n.typ, 0, b.intVal)
   of mModU:
     let a = n.sons[1]
     let b = n.sons[2]
     if b.kind in ordIntLit:
       if b.intVal >= 0:
-        result = makeRange(a.typ, 0, b.intVal-1)
+        result = makeRange(n.typ, 0, b.intVal-1)
       else:
-        result = makeRange(a.typ, b.intVal+1, 0)
+        result = makeRange(n.typ, b.intVal+1, 0)
   of mModI:
     # so ... if you ever wondered about modulo's signedness; this defines it:
     let a = n.sons[1]
     let b = n.sons[2]
     if b.kind in {nkIntLit..nkUInt64Lit}:
       if b.intVal >= 0:
-        result = makeRange(a.typ, -(b.intVal-1), b.intVal-1)
+        result = makeRange(n.typ, -(b.intVal-1), b.intVal-1)
       else:
-        result = makeRange(a.typ, b.intVal+1, -(b.intVal+1))
+        result = makeRange(n.typ, b.intVal+1, -(b.intVal+1))
   of mDivI, mDivU:
     binaryOp(`|div|`)
   of mMinI:
diff --git a/tests/arithm/tand.nim b/tests/arithm/tand.nim
new file mode 100644
index 000000000..fd0fa0dea
--- /dev/null
+++ b/tests/arithm/tand.nim
@@ -0,0 +1,20 @@
+discard """
+  output: '''int32
+int32
+1280
+1280'''
+"""
+
+# bug #5216
+
+import typetraits
+
+echo(name type((0x0A'i8 and 0x7F'i32) shl 7'i32))
+
+let i8 = 0x0A'i8
+echo(name type((i8 and 0x7F'i32) shl 7'i32))
+
+echo((0x0A'i8 and 0x7F'i32) shl 7'i32)
+
+let ii8 = 0x0A'i8
+echo((ii8 and 0x7F'i32) shl 7'i32)