* Fix #8404 JS backend doesn't handle float->int type conversion * handle conv to uint as cast, discard other cases * limit to int32, times use int64 * toInt including tyInt64 break times timezones lib, ignore for now * also affect to vm * move to tests/misc/t8404.nim
This commit is contained in:
parent
d802a4a669
commit
797cb2e67b
2 changed files with 42 additions and 3 deletions
|
|
@ -2208,11 +2208,17 @@ proc genConv(p: PProc, n: PNode, r: var TCompRes) =
|
||||||
if dest.kind == src.kind:
|
if dest.kind == src.kind:
|
||||||
# no-op conversion
|
# no-op conversion
|
||||||
return
|
return
|
||||||
case dest.kind:
|
let toInt = (dest.kind in tyInt..tyInt32)
|
||||||
of tyBool:
|
let fromInt = (src.kind in tyInt..tyInt32)
|
||||||
|
let toUint = (dest.kind in tyUInt..tyUInt32)
|
||||||
|
let fromUint = (src.kind in tyUInt..tyUInt32)
|
||||||
|
if toUint and (fromInt or fromUint):
|
||||||
|
let trimmer = unsignedTrimmer(dest.size)
|
||||||
|
r.res = "($1 $2)" % [r.res, trimmer]
|
||||||
|
elif dest.kind == tyBool:
|
||||||
r.res = "(!!($1))" % [r.res]
|
r.res = "(!!($1))" % [r.res]
|
||||||
r.kind = resExpr
|
r.kind = resExpr
|
||||||
of tyInt:
|
elif toInt:
|
||||||
r.res = "(($1)|0)" % [r.res]
|
r.res = "(($1)|0)" % [r.res]
|
||||||
else:
|
else:
|
||||||
# TODO: What types must we handle here?
|
# TODO: What types must we handle here?
|
||||||
|
|
|
||||||
33
tests/misc/t8404.nim
Normal file
33
tests/misc/t8404.nim
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
discard """
|
||||||
|
targets: "c cpp js"
|
||||||
|
"""
|
||||||
|
template main() =
|
||||||
|
block: # bug #8404
|
||||||
|
# can conv
|
||||||
|
template float2int(T) =
|
||||||
|
var a = -1.0
|
||||||
|
let b = T(a)
|
||||||
|
doAssert b < 0
|
||||||
|
let c = b + 1
|
||||||
|
doAssert c is T
|
||||||
|
doAssert c == 0
|
||||||
|
|
||||||
|
float2int(int8)
|
||||||
|
float2int(int16)
|
||||||
|
float2int(int32)
|
||||||
|
float2int(int64)
|
||||||
|
|
||||||
|
block:
|
||||||
|
# can handle middle conv
|
||||||
|
# `/` can trigger int to float
|
||||||
|
template float2int(T) =
|
||||||
|
let n = T(1 / 256)
|
||||||
|
doAssert n == 0
|
||||||
|
|
||||||
|
float2int(int8)
|
||||||
|
float2int(int16)
|
||||||
|
float2int(int32)
|
||||||
|
# float2int(int64)
|
||||||
|
main()
|
||||||
|
static:
|
||||||
|
main()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue