mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-11 22:08:54 +00:00
73 lines
2.7 KiB
Nim
73 lines
2.7 KiB
Nim
discard """
|
|
cmd: "nim check $options --hints:off --warning:ImplicitRangeConversion --warningaserror:ImplicitRangeConversion $file"
|
|
action: "reject"
|
|
nimout: '''
|
|
timplicitrangedownsizing.nim(22, 5) Error: implicit range conversion int -> FakeUint8 [ImplicitRangeConversion]
|
|
timplicitrangedownsizing.nim(24, 5) Error: implicit range conversion OffByOneRange -> FakeUint8 [ImplicitRangeConversion]
|
|
timplicitrangedownsizing.nim(28, 5) Error: implicit range conversion int -> FakeUint8 [ImplicitRangeConversion]
|
|
timplicitrangedownsizing.nim(55, 6) Error: implicit range conversion float64 -> SmallFloat [ImplicitRangeConversion]
|
|
timplicitrangedownsizing.nim(59, 6) Error: implicit range conversion FloatRange -> SmallFloat [ImplicitRangeConversion]
|
|
timplicitrangedownsizing.nim(63, 6) Error: implicit range conversion float64 -> SmallFloat [ImplicitRangeConversion]
|
|
'''
|
|
"""
|
|
# Integer range tests
|
|
type FakeUint8 = range[0..255]
|
|
type OffByOneRange = range[1..256]
|
|
type WideRange = range[0..65535]
|
|
|
|
var v: FakeUint8
|
|
var x = 256
|
|
var y = OffByOneRange(256)
|
|
|
|
v = x # panics, should trigger warning
|
|
v = FakeUint8(x) # panics, should not trigger warning
|
|
v = y # panics should trigger warning
|
|
|
|
proc xxx(v: FakeUint8)= discard
|
|
|
|
xxx(x) # panics, should trigger warning
|
|
xxx(FakeUint8(x)) # panics, should not trigger warning
|
|
|
|
# Test narrower to wider range conversions (should NOT warn)
|
|
proc acceptWide(v: WideRange) = discard
|
|
|
|
var smallRange: FakeUint8 = FakeUint8(100)
|
|
acceptWide(smallRange) # OK - FakeUint8 (0..255) fits in WideRange (0..65535)
|
|
|
|
var medRange: OffByOneRange = OffByOneRange(150)
|
|
acceptWide(medRange) # OK - OffByOneRange (1..256) fits in WideRange (0..65535)
|
|
|
|
var w: WideRange
|
|
w = smallRange # OK - FakeUint8 range fits in WideRange
|
|
w = medRange # OK - OffByOneRange range fits in WideRange
|
|
|
|
# Test narrower range passed to function (should NOT warn)
|
|
xxx(smallRange) # OK - FakeUint8 value fits in range[0..255]
|
|
|
|
# Float range tests
|
|
type SmallFloat = range[0.0..10.0]
|
|
type FloatRange = range[5.0..15.0]
|
|
type WideFloatRange = range[0.0..100.0]
|
|
|
|
var fv: SmallFloat
|
|
var fx = 11.5 # Out of range
|
|
|
|
fv = fx # panics, should trigger warning
|
|
fv = SmallFloat(fx) # panics, should not trigger warning
|
|
|
|
var fy = FloatRange(7.5)
|
|
fv = fy # panics, should trigger warning (5.0..15.0 → 0.0..10.0)
|
|
|
|
proc fffx(v: SmallFloat) = discard
|
|
|
|
fffx(fx) # panics, should trigger warning
|
|
fffx(SmallFloat(fx)) # panics, should not trigger warning
|
|
|
|
# Test narrower to wider float range conversions (should NOT warn)
|
|
proc acceptWideFloat(v: WideFloatRange) = discard
|
|
|
|
var smallFloatRange: SmallFloat = SmallFloat(5.0)
|
|
acceptWideFloat(smallFloatRange) # OK - SmallFloat (0.0..10.0) fits in WideFloatRange (0.0..100.0)
|
|
|
|
var wf: WideFloatRange
|
|
wf = smallFloatRange # OK - SmallFloat range fits in WideFloatRange |