discard """
  targets: "c cpp js"
"""

proc main() =
  block: # bug #16806
    let
      a = 42u16
      b = cast[int16](a)
    doAssert a.int16 == 42
    doAssert b in int16.low..int16.high

  block: # bug #16808
    doAssert cast[int8](cast[uint8](int8(-12))) == int8(-12)
    doAssert cast[int16](cast[uint16](int16(-12))) == int16(-12)
    doAssert cast[int32](cast[uint32](int32(-12))) == int32(-12)

  doAssert cast[int8](int16.high) == -1

  block: # bug #25222
    let ovf = 2 + int high char
    doAssert cast[char](ovf) == '\1'

static: main()
main()
