From 68617adb91ecae00725523ae6bf2833fe6c07bd1 Mon Sep 17 00:00:00 2001 From: Araq Date: Fri, 27 Jan 2017 09:49:45 +0100 Subject: [PATCH] fixes #5216 --- compiler/semfold.nim | 10 +++++----- tests/arithm/tand.nim | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 tests/arithm/tand.nim 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)