From 764a81ca253b78d0faa75a24dffc8d111362974f Mon Sep 17 00:00:00 2001 From: cooldome Date: Wed, 25 Mar 2020 20:36:22 +0000 Subject: [PATCH] Continue bool conversion fixing (#13751) * continue fixing #13744 * improve style * improve test Co-authored-by: cooldome --- compiler/semexprs.nim | 4 +++- compiler/semfold.nim | 9 +++++++++ tests/types/tcast1.nim | 9 ++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index c678d3674d..c2f117efa8 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 a8d42fe7ac..4131347a2a 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 04596baff8..ab375b8b2d 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() +