// numbers are printed as `i64`, so over/underflows in `u60` arithmetic might
// change the sign when printed
@main = x
// underflow
& x ~ [n x] & #0 ~ <u8.- #1 n> // 255
& x ~ [n x] & #0 ~ <u16.- #1 n> // 65535
& x ~ [n x] & #0 ~ <u32.- #1 n> // 4294967295
& x ~ [n x] & #0 ~ <u60.- #1 n> // -1
// max
& x ~ [n x] & #1 ~ <u8.+ #254 n> // 255
& x ~ [n x] & #1 ~ <u16.+ #65534 n> // 65535
& x ~ [n x] & #1 ~ <u32.+ #4294967294 n> // 4294967295
& x ~ [n x] & #1 ~ <u60.+ #1152921504606846974 n> // -1
// overflow
& x ~ [n x] & #1 ~ <u8.+ #255 n> // 0
& x ~ [n x] & #1 ~ <u16.+ #65535 n> // 0
& x ~ [n x] & #1 ~ <u32.+ #4294967295 n> // 0
& x ~ [n x] & #1 ~ <u60.+ #1152921504606846975 n> // 0
// sign extension
& x ~ [n x] & #0 ~ <i8.- #1 n> // -1
& x ~ [n x] & #0 ~ <i16.- #1 n> // -1
& x ~ [n x] & #0 ~ <i32.- #1 n> // -1
// signed overflow
& x ~ [n x] & #2 ~ <i8.* #127 n> // -2
& x ~ [n x] & #2 ~ <i16.* #32767 n> // -2
& x ~ [n x] & #2 ~ <i32.* #2147483647 n> // -2
// all ops
& x ~ [n x] & #10 ~ <u32.+ #2 n> // 12
& x ~ [n x] & #10 ~ <u32.- #2 n> // 8
& x ~ [n x] & #10 ~ <u32.* #2 n> // 20
& x ~ [n x] & #10 ~ <u32./ #2 n> // 5
& x ~ [n x] & #10 ~ <u32.% #2 n> // 0
& x ~ [n x] & #10 ~ <u32.== #2 n> // 0
& x ~ [n x] & #10 ~ <u32.!= #2 n> // 1
& x ~ [n x] & #10 ~ <u32.< #2 n> // 0
& x ~ [n x] & #10 ~ <u32.> #2 n> // 1
& x ~ [n x] & #10 ~ <u32.& #2 n> // 2
& x ~ [n x] & #10 ~ <u32.| #2 n> // 10
& x ~ [n x] & #10 ~ <u32.^ #2 n> // 8
& x ~ [n x] & #10 ~ <u32.<< #2 n> // 40
& x ~ [n x] & #10 ~ <u32.>> #2 n> // 2
& x ~ [n x] & #9 ~ <u32./ #0 n> // 0
& x ~ *