blob: 7dcb722ec9067dfa832ad57b89faa1bb5918658f [file] [log] [blame]
# Test cases for i32 native ints. Focus on things that are different from i64; no need to
# duplicate all i64 test cases here.
[case testI32BinaryOp]
from mypy_extensions import i32
def add_op(x: i32, y: i32) -> i32:
x = y + x
y = x + 5
y += x
y += 7
x = 5 + y
return x
def compare(x: i32, y: i32) -> None:
a = x == y
b = x == -5
c = x < y
d = x < -5
e = -5 == x
f = -5 < x
[out]
def add_op(x, y):
x, y, r0, r1, r2, r3, r4 :: i32
L0:
r0 = y + x
x = r0
r1 = x + 5
y = r1
r2 = y + x
y = r2
r3 = y + 7
y = r3
r4 = 5 + y
x = r4
return x
def compare(x, y):
x, y :: i32
r0 :: bit
a :: bool
r1 :: bit
b :: bool
r2 :: bit
c :: bool
r3 :: bit
d :: bool
r4 :: bit
e :: bool
r5 :: bit
f :: bool
L0:
r0 = x == y
a = r0
r1 = x == -5
b = r1
r2 = x < y :: signed
c = r2
r3 = x < -5 :: signed
d = r3
r4 = -5 == x
e = r4
r5 = -5 < x :: signed
f = r5
return 1
[case testI32UnaryOp]
from mypy_extensions import i32
def unary(x: i32) -> i32:
y = -x
x = ~y
y = +x
return y
[out]
def unary(x):
x, r0, y, r1 :: i32
L0:
r0 = 0 - x
y = r0
r1 = y ^ -1
x = r1
y = x
return y
[case testI32DivisionByConstant]
from mypy_extensions import i32
def div_by_constant(x: i32) -> i32:
x = x // 5
x //= 17
return x
[out]
def div_by_constant(x):
x, r0, r1 :: i32
r2, r3, r4 :: bit
r5 :: i32
r6 :: bit
r7, r8, r9 :: i32
r10, r11, r12 :: bit
r13 :: i32
r14 :: bit
r15 :: i32
L0:
r0 = x / 5
r1 = r0
r2 = x < 0 :: signed
r3 = 5 < 0 :: signed
r4 = r2 == r3
if r4 goto L3 else goto L1 :: bool
L1:
r5 = r1 * 5
r6 = r5 == x
if r6 goto L3 else goto L2 :: bool
L2:
r7 = r1 - 1
r1 = r7
L3:
x = r1
r8 = x / 17
r9 = r8
r10 = x < 0 :: signed
r11 = 17 < 0 :: signed
r12 = r10 == r11
if r12 goto L6 else goto L4 :: bool
L4:
r13 = r9 * 17
r14 = r13 == x
if r14 goto L6 else goto L5 :: bool
L5:
r15 = r9 - 1
r9 = r15
L6:
x = r9
return x
[case testI32ModByConstant]
from mypy_extensions import i32
def mod_by_constant(x: i32) -> i32:
x = x % 5
x %= 17
return x
[out]
def mod_by_constant(x):
x, r0, r1 :: i32
r2, r3, r4, r5 :: bit
r6, r7, r8 :: i32
r9, r10, r11, r12 :: bit
r13 :: i32
L0:
r0 = x % 5
r1 = r0
r2 = x < 0 :: signed
r3 = 5 < 0 :: signed
r4 = r2 == r3
if r4 goto L3 else goto L1 :: bool
L1:
r5 = r1 == 0
if r5 goto L3 else goto L2 :: bool
L2:
r6 = r1 + 5
r1 = r6
L3:
x = r1
r7 = x % 17
r8 = r7
r9 = x < 0 :: signed
r10 = 17 < 0 :: signed
r11 = r9 == r10
if r11 goto L6 else goto L4 :: bool
L4:
r12 = r8 == 0
if r12 goto L6 else goto L5 :: bool
L5:
r13 = r8 + 17
r8 = r13
L6:
x = r8
return x
[case testI32DivModByVariable]
from mypy_extensions import i32
def divmod(x: i32, y: i32) -> i32:
a = x // y
return a % y
[out]
def divmod(x, y):
x, y, r0, a, r1 :: i32
L0:
r0 = CPyInt32_Divide(x, y)
a = r0
r1 = CPyInt32_Remainder(a, y)
return r1
[case testI32BoxAndUnbox]
from typing import Any
from mypy_extensions import i32
def f(x: Any) -> Any:
y: i32 = x
return y
[out]
def f(x):
x :: object
r0, y :: i32
r1 :: object
L0:
r0 = unbox(i32, x)
y = r0
r1 = box(i32, y)
return r1
[case testI32MixedCompare1_64bit]
from mypy_extensions import i32
def f(x: int, y: i32) -> bool:
return x == y
[out]
def f(x, y):
x :: int
y :: i32
r0 :: native_int
r1, r2, r3 :: bit
r4 :: native_int
r5, r6 :: i32
r7 :: bit
L0:
r0 = x & 1
r1 = r0 == 0
if r1 goto L1 else goto L4 :: bool
L1:
r2 = x < 4294967296 :: signed
if r2 goto L2 else goto L4 :: bool
L2:
r3 = x >= -4294967296 :: signed
if r3 goto L3 else goto L4 :: bool
L3:
r4 = x >> 1
r5 = truncate r4: native_int to i32
r6 = r5
goto L5
L4:
CPyInt32_Overflow()
unreachable
L5:
r7 = r6 == y
return r7
[case testI32MixedCompare2_64bit]
from mypy_extensions import i32
def f(x: i32, y: int) -> bool:
return x == y
[out]
def f(x, y):
x :: i32
y :: int
r0 :: native_int
r1, r2, r3 :: bit
r4 :: native_int
r5, r6 :: i32
r7 :: bit
L0:
r0 = y & 1
r1 = r0 == 0
if r1 goto L1 else goto L4 :: bool
L1:
r2 = y < 4294967296 :: signed
if r2 goto L2 else goto L4 :: bool
L2:
r3 = y >= -4294967296 :: signed
if r3 goto L3 else goto L4 :: bool
L3:
r4 = y >> 1
r5 = truncate r4: native_int to i32
r6 = r5
goto L5
L4:
CPyInt32_Overflow()
unreachable
L5:
r7 = x == r6
return r7
[case testI32MixedCompare_32bit]
from mypy_extensions import i32
def f(x: int, y: i32) -> bool:
return x == y
[out]
def f(x, y):
x :: int
y :: i32
r0 :: native_int
r1 :: bit
r2, r3 :: i32
r4 :: ptr
r5 :: c_ptr
r6 :: i32
r7 :: bit
L0:
r0 = x & 1
r1 = r0 == 0
if r1 goto L1 else goto L2 :: bool
L1:
r2 = x >> 1
r3 = r2
goto L3
L2:
r4 = x ^ 1
r5 = r4
r6 = CPyLong_AsInt32(r5)
r3 = r6
keep_alive x
L3:
r7 = r3 == y
return r7
[case testI32ConvertToInt_64bit]
from mypy_extensions import i32
def i32_to_int(a: i32) -> int:
return a
[out]
def i32_to_int(a):
a :: i32
r0 :: native_int
r1 :: int
L0:
r0 = extend signed a: i32 to native_int
r1 = r0 << 1
return r1
[case testI32ConvertToInt_32bit]
from mypy_extensions import i32
def i32_to_int(a: i32) -> int:
return a
[out]
def i32_to_int(a):
a :: i32
r0, r1 :: bit
r2, r3, r4 :: int
L0:
r0 = a <= 1073741823 :: signed
if r0 goto L1 else goto L2 :: bool
L1:
r1 = a >= -1073741824 :: signed
if r1 goto L3 else goto L2 :: bool
L2:
r2 = CPyTagged_FromSsize_t(a)
r3 = r2
goto L4
L3:
r4 = a << 1
r3 = r4
L4:
return r3
[case testI32OperatorAssignmentMixed_64bit]
from mypy_extensions import i32
def f(a: i32) -> None:
x = 0
x += a
[out]
def f(a):
a :: i32
x :: int
r0 :: native_int
r1, r2, r3 :: bit
r4 :: native_int
r5, r6, r7 :: i32
r8 :: native_int
r9 :: int
L0:
x = 0
r0 = x & 1
r1 = r0 == 0
if r1 goto L1 else goto L4 :: bool
L1:
r2 = x < 4294967296 :: signed
if r2 goto L2 else goto L4 :: bool
L2:
r3 = x >= -4294967296 :: signed
if r3 goto L3 else goto L4 :: bool
L3:
r4 = x >> 1
r5 = truncate r4: native_int to i32
r6 = r5
goto L5
L4:
CPyInt32_Overflow()
unreachable
L5:
r7 = r6 + a
r8 = extend signed r7: i32 to native_int
r9 = r8 << 1
x = r9
return 1
[case testI32InitializeFromLiteral]
from mypy_extensions import i32, i64
def f() -> None:
x: i32 = 0
y: i32 = -127
z: i32 = 5 + 7
[out]
def f():
x, y, z :: i32
L0:
x = 0
y = -127
z = 12
return 1
[case testI32ExplicitConversionFromNativeInt]
from mypy_extensions import i64, i32, i16
def from_i16(x: i16) -> i32:
return i32(x)
def from_i32(x: i32) -> i32:
return i32(x)
def from_i64(x: i64) -> i32:
return i32(x)
[out]
def from_i16(x):
x :: i16
r0 :: i32
L0:
r0 = extend signed x: i16 to i32
return r0
def from_i32(x):
x :: i32
L0:
return x
def from_i64(x):
x :: i64
r0 :: i32
L0:
r0 = truncate x: i64 to i32
return r0
[case testI32ExplicitConversionFromInt_64bit]
from mypy_extensions import i32
def f(x: int) -> i32:
return i32(x)
[out]
def f(x):
x :: int
r0 :: native_int
r1, r2, r3 :: bit
r4 :: native_int
r5, r6 :: i32
L0:
r0 = x & 1
r1 = r0 == 0
if r1 goto L1 else goto L4 :: bool
L1:
r2 = x < 4294967296 :: signed
if r2 goto L2 else goto L4 :: bool
L2:
r3 = x >= -4294967296 :: signed
if r3 goto L3 else goto L4 :: bool
L3:
r4 = x >> 1
r5 = truncate r4: native_int to i32
r6 = r5
goto L5
L4:
CPyInt32_Overflow()
unreachable
L5:
return r6
[case testI32ExplicitConversionFromLiteral_64bit]
from mypy_extensions import i32
def f() -> None:
x = i32(0)
y = i32(11)
z = i32(-3)
a = i32(2**31)
[out]
def f():
x, y, z, a :: i32
L0:
x = 0
y = 11
z = -3
a = -2147483648
return 1
[case testI32ExplicitConversionFromVariousTypes_64bit]
from mypy_extensions import i32
def bool_to_i32(b: bool) -> i32:
return i32(b)
def str_to_i32(s: str) -> i32:
return i32(s)
class C:
def __int__(self) -> i32:
return 5
def instance_to_i32(c: C) -> i32:
return i32(c)
def float_to_i32(x: float) -> i32:
return i32(x)
[out]
def bool_to_i32(b):
b :: bool
r0 :: i32
L0:
r0 = extend b: builtins.bool to i32
return r0
def str_to_i32(s):
s :: str
r0 :: object
r1 :: i32
L0:
r0 = CPyLong_FromStr(s)
r1 = unbox(i32, r0)
return r1
def C.__int__(self):
self :: __main__.C
L0:
return 5
def instance_to_i32(c):
c :: __main__.C
r0 :: i32
L0:
r0 = c.__int__()
return r0
def float_to_i32(x):
x :: float
r0 :: int
r1 :: native_int
r2, r3, r4 :: bit
r5 :: native_int
r6, r7 :: i32
L0:
r0 = CPyTagged_FromFloat(x)
r1 = r0 & 1
r2 = r1 == 0
if r2 goto L1 else goto L4 :: bool
L1:
r3 = r0 < 4294967296 :: signed
if r3 goto L2 else goto L4 :: bool
L2:
r4 = r0 >= -4294967296 :: signed
if r4 goto L3 else goto L4 :: bool
L3:
r5 = r0 >> 1
r6 = truncate r5: native_int to i32
r7 = r6
goto L5
L4:
CPyInt32_Overflow()
unreachable
L5:
return r7
[case testI32ExplicitConversionFromFloat_32bit]
from mypy_extensions import i32
def float_to_i32(x: float) -> i32:
return i32(x)
[out]
def float_to_i32(x):
x :: float
r0 :: int
r1 :: native_int
r2 :: bit
r3, r4 :: i32
r5 :: ptr
r6 :: c_ptr
r7 :: i32
L0:
r0 = CPyTagged_FromFloat(x)
r1 = r0 & 1
r2 = r1 == 0
if r2 goto L1 else goto L2 :: bool
L1:
r3 = r0 >> 1
r4 = r3
goto L3
L2:
r5 = r0 ^ 1
r6 = r5
r7 = CPyLong_AsInt32(r6)
r4 = r7
keep_alive r0
L3:
return r4