summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semexprs.nim4
-rw-r--r--compiler/semfold.nim9
-rw-r--r--tests/types/tcast1.nim9
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()
+