diff options
-rw-r--r-- | compiler/semfold.nim | 10 | ||||
-rw-r--r-- | tests/arithm/tand.nim | 20 |
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) |