diff options
author | cooldome <cdome@bk.ru> | 2020-03-25 13:44:52 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-25 13:44:52 +0000 |
commit | 182d3c16e3b7aac9ed3575dec55e6d9a3d5042c4 (patch) | |
tree | 79c9531d5252f66df2d28d29cf233dff9a40029e /compiler | |
parent | 46c827be6a959be3d3bb840d1582bac8fc55bda6 (diff) | |
download | Nim-182d3c16e3b7aac9ed3575dec55e6d9a3d5042c4.tar.gz |
fixes #13744 (#13749)
* fixes #13744 * improve style Co-authored-by: cooldome <ariabushenko@gmail.ru>
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/ccgexprs.nim | 2 | ||||
-rw-r--r-- | compiler/transf.nim | 2 | ||||
-rw-r--r-- | compiler/vm.nim | 6 |
3 files changed, 9 insertions, 1 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 9c683a071..e1561ae12 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -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) diff --git a/compiler/transf.nim b/compiler/transf.nim index c1af6c23f..18d9b9130 100644 --- a/compiler/transf.nim +++ b/compiler/transf.nim @@ -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. diff --git a/compiler/vm.nim b/compiler/vm.nim index 6a12b615e..8e05c5618 100644 --- a/compiler/vm.nim +++ b/compiler/vm.nim @@ -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 |