Skip to content

Commit

Permalink
fixes #13744 (#13749)
Browse files Browse the repository at this point in the history
* fixes #13744

* improve style

Co-authored-by: cooldome <ariabushenko@gmail.ru>
  • Loading branch information
cooldome and cooldome authored Mar 25, 2020
1 parent 46c827b commit 182d3c1
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 1 deletion.
2 changes: 2 additions & 0 deletions compiler/ccgexprs.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1941,6 +1941,8 @@ proc genSomeCast(p: BProc, e: PNode, d: var TLoc) =
elif optSeqDestructors in p.config.globalOptions and etyp.kind in {tySequence, tyString}:
putIntoDest(p, d, e, "(*($1*) (&$2))" %
[getTypeDesc(p.module, e.typ), rdCharLoc(a)], a.storage)
elif etyp.kind == tyBool and srcTyp.kind in IntegralTypes:
putIntoDest(p, d, e, "(($1) != 0)" % [rdCharLoc(a)], a.storage)
else:
putIntoDest(p, d, e, "(($1) ($2))" %
[getTypeDesc(p.module, e.typ), rdCharLoc(a)], a.storage)
Expand Down
2 changes: 1 addition & 1 deletion compiler/transf.nim
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,7 @@ proc transformConv(c: PTransf, n: PNode): PNode =
var dest = skipTypes(n.typ, abstractVarRange)
var source = skipTypes(n[1].typ, abstractVarRange)
case dest.kind
of tyInt..tyInt64, tyEnum, tyChar, tyBool, tyUInt8..tyUInt32:
of tyInt..tyInt64, tyEnum, tyChar, tyUInt8..tyUInt32:
# we don't include uint and uint64 here as these are no ordinal types ;-)
if not isOrdinalType(source):
# float -> int conversions. ugh.
Expand Down
6 changes: 6 additions & 0 deletions compiler/vm.nim
Original file line number Diff line number Diff line change
Expand Up @@ -463,6 +463,12 @@ proc opConv(c: PCtx; dest: var TFullReg, src: TFullReg, desttyp, srctyp: PType):
value = (value shl srcDist) shr srcDist
value = (value shl destDist) shr destDist
dest.intVal = cast[BiggestInt](value)
of tyBool:
dest.ensureKind(rkInt)
dest.intVal =
case skipTypes(srctyp, abstractRange).kind
of tyFloat..tyFloat64: int(src.floatVal != 0.0)
else: int(src.intVal != 0)
of tyFloat..tyFloat64:
dest.ensureKind(rkFloat)
case skipTypes(srctyp, abstractRange).kind
Expand Down
35 changes: 35 additions & 0 deletions tests/types/tcast1.nim
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,38 @@ proc remap2[T](s: seq[int], typ: typedesc[T]): seq[T] =

echo remap1(@[1,2,3], float)
echo remap2(@[1,2,3], float)


#--------------------------------------------------------------------
# conversion to bool, issue #13744
proc test_conv_to_bool =
var
i0 = 0
i1 = 1
ih = high(uint)
il = low(int)

f0 = 0.0
f1 = 1.0
fh = Inf
fl = -Inf
f_nan = NaN

doAssert(bool(i0) == false)
doAssert(bool(i1) == true)
doAssert(bool(-i1) == true)
doAssert(bool(il) == true)
doAssert(bool(ih) == true)

doAssert(bool(f0) == false)
doAssert(bool(-f0) == false)
doAssert(bool(f1) == true)
doAssert(bool(-f1) == true)
doAssert(bool(fh) == true)
doAssert(bool(fl) == true)
doAssert(bool(fnan) == true) # NaN to bool gives true according to standard


static:
test_conv_to_bool()
test_conv_to_bool()

0 comments on commit 182d3c1

Please sign in to comment.