diff options
-rw-r--r-- | compiler/semexprs.nim | 4 | ||||
-rw-r--r-- | compiler/semfold.nim | 9 | ||||
-rw-r--r-- | tests/types/tcast1.nim | 9 |
3 files changed, 20 insertions, 2 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index c678d3674..c2f117efa 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -147,7 +147,9 @@ proc checkConvertible(c: PContext, targetTyp: PType, src: PNode): TConvStatus = result = checkConversionBetweenObjects(d.skipTypes(abstractInst), s.skipTypes(abstractInst), pointers) elif (targetBaseTyp.kind in IntegralTypes) and (srcBaseTyp.kind in IntegralTypes): - if targetTyp.isOrdinalType: + if targetTyp.kind == tyBool: + discard "convOk" + elif targetTyp.isOrdinalType: if src.kind in nkCharLit..nkUInt64Lit and src.getInt notin firstOrd(c.config, targetTyp)..lastOrd(c.config, targetTyp): result = convNotInRange diff --git a/compiler/semfold.nim b/compiler/semfold.nim index a8d42fe7a..4131347a2 100644 --- a/compiler/semfold.nim +++ b/compiler/semfold.nim @@ -433,6 +433,15 @@ proc foldConv(n, a: PNode; g: ModuleGraph; check = false): PNode = # echo high(int64) # writeStackTrace() case dstTyp.kind + of tyBool: + case srcTyp.kind + of tyFloat..tyFloat64: + result = newIntNodeT(int(getFloat(a) != 0.0), n, g) + of tyChar, tyUInt..tyUInt64, tyInt..tyInt64: + result = newIntNodeT(int(a.getOrdValue != 0), n, g) + else: + result = a + result.typ = n.typ of tyInt..tyInt64, tyUInt..tyUInt64: case srcTyp.kind of tyFloat..tyFloat64: diff --git a/tests/types/tcast1.nim b/tests/types/tcast1.nim index 04596baff..ab375b8b2 100644 --- a/tests/types/tcast1.nim +++ b/tests/types/tcast1.nim @@ -52,5 +52,12 @@ proc test_conv_to_bool = static: + doAssert(bool(0) == false) + doAssert(bool(-1) == true) + doAssert(bool(2) == true) + doAssert(bool(NaN) == true) + doAssert(bool(0.0) == false) + doAssert(bool(-0.0) == false) test_conv_to_bool() -test_conv_to_bool() \ No newline at end of file +test_conv_to_bool() + |