| -- Test cases for data flow analysis. |
| |
| [case testSimple_MaybeDefined] |
| def f(a: int) -> None: |
| x = 1 |
| if x == a: |
| y = 1 |
| else: |
| z = 1 |
| [out] |
| def f(a): |
| a :: int |
| r0 :: short_int |
| x :: int |
| r1 :: bool |
| r2 :: short_int |
| y :: int |
| r3 :: short_int |
| z :: int |
| r4 :: None |
| L0: |
| r0 = 1 |
| x = r0 |
| r1 = x == a :: int |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = 1 |
| y = r2 |
| goto L3 |
| L2: |
| r3 = 1 |
| z = r3 |
| L3: |
| r4 = None |
| return r4 |
| (0, 0) {a} {a} |
| (0, 1) {a} {a, x} |
| (0, 2) {a, x} {a, x} |
| (0, 3) {a, x} {a, x} |
| (1, 0) {a, x} {a, x} |
| (1, 1) {a, x} {a, x, y} |
| (1, 2) {a, x, y} {a, x, y} |
| (2, 0) {a, x} {a, x} |
| (2, 1) {a, x} {a, x, z} |
| (2, 2) {a, x, z} {a, x, z} |
| (3, 0) {a, x, y, z} {a, x, y, z} |
| (3, 1) {a, x, y, z} {a, x, y, z} |
| |
| [case testSimple_Liveness] |
| def f(a: int) -> int: |
| x = 1 |
| if x == 1: |
| return a |
| else: |
| return x |
| [out] |
| def f(a): |
| a :: int |
| r0 :: short_int |
| x :: int |
| r1 :: short_int |
| r2 :: bool |
| L0: |
| r0 = 1 |
| x = r0 |
| r1 = 1 |
| r2 = x == r1 :: int |
| if r2 goto L1 else goto L2 :: bool |
| L1: |
| return a |
| L2: |
| return x |
| L3: |
| unreachable |
| (0, 0) {a} {a, r0} |
| (0, 1) {a, r0} {a, x} |
| (0, 2) {a, x} {a, r1, x} |
| (0, 3) {a, r1, x} {a, r2, x} |
| (0, 4) {a, r2, x} {a, x} |
| (1, 0) {a} {} |
| (2, 0) {x} {} |
| (3, 0) {} {} |
| |
| [case testSpecial_Liveness] |
| def f() -> int: |
| x = 1 |
| y = 1 |
| x = 2 |
| return x |
| [out] |
| def f(): |
| r0 :: short_int |
| x :: int |
| r1 :: short_int |
| y :: int |
| r2 :: short_int |
| L0: |
| r0 = 1 |
| x = r0 |
| r1 = 1 |
| y = r1 |
| r2 = 2 |
| x = r2 |
| return x |
| (0, 0) {} {r0} |
| (0, 1) {r0} {} |
| (0, 2) {} {r1} |
| (0, 3) {r1} {} |
| (0, 4) {} {r2} |
| (0, 5) {r2} {x} |
| (0, 6) {x} {} |
| |
| [case testSpecial2_Liveness] |
| def f(a: int) -> int: |
| a = 1 |
| a = 2 |
| a = 3 |
| return a |
| [out] |
| def f(a): |
| a :: int |
| r0, r1, r2 :: short_int |
| L0: |
| r0 = 1 |
| a = r0 |
| r1 = 2 |
| a = r1 |
| r2 = 3 |
| a = r2 |
| return a |
| (0, 0) {} {r0} |
| (0, 1) {r0} {} |
| (0, 2) {} {r1} |
| (0, 3) {r1} {} |
| (0, 4) {} {r2} |
| (0, 5) {r2} {a} |
| (0, 6) {a} {} |
| |
| [case testSimple_MustDefined] |
| def f(a: int) -> None: |
| if a == 1: |
| y = 1 |
| x = 2 |
| else: |
| x = 2 |
| [out] |
| def f(a): |
| a :: int |
| r0 :: short_int |
| r1 :: bool |
| r2 :: short_int |
| y :: int |
| r3 :: short_int |
| x :: int |
| r4 :: short_int |
| r5 :: None |
| L0: |
| r0 = 1 |
| r1 = a == r0 :: int |
| if r1 goto L1 else goto L2 :: bool |
| L1: |
| r2 = 1 |
| y = r2 |
| r3 = 2 |
| x = r3 |
| goto L3 |
| L2: |
| r4 = 2 |
| x = r4 |
| L3: |
| r5 = None |
| return r5 |
| (0, 0) {a} {a} |
| (0, 1) {a} {a} |
| (0, 2) {a} {a} |
| (1, 0) {a} {a} |
| (1, 1) {a} {a, y} |
| (1, 2) {a, y} {a, y} |
| (1, 3) {a, y} {a, x, y} |
| (1, 4) {a, x, y} {a, x, y} |
| (2, 0) {a} {a} |
| (2, 1) {a} {a, x} |
| (2, 2) {a, x} {a, x} |
| (3, 0) {a, x} {a, x} |
| (3, 1) {a, x} {a, x} |
| |
| [case testTwoArgs_MustDefined] |
| def f(x: int, y: int) -> int: |
| return x |
| [out] |
| def f(x, y): |
| x, y :: int |
| L0: |
| return x |
| (0, 0) {x, y} {x, y} |
| |
| [case testLoop_MustDefined] |
| def f(n: int) -> None: |
| while n < 5: |
| n = n + 1 |
| m = n |
| [out] |
| def f(n): |
| n :: int |
| r0 :: short_int |
| r1 :: bool |
| r2 :: short_int |
| r3, m :: int |
| r4 :: None |
| L0: |
| L1: |
| r0 = 5 |
| r1 = n < r0 :: int |
| if r1 goto L2 else goto L3 :: bool |
| L2: |
| r2 = 1 |
| r3 = n + r2 :: int |
| n = r3 |
| m = n |
| goto L1 |
| L3: |
| r4 = None |
| return r4 |
| (0, 0) {n} {n} |
| (1, 0) {n} {n} |
| (1, 1) {n} {n} |
| (1, 2) {n} {n} |
| (2, 0) {n} {n} |
| (2, 1) {n} {n} |
| (2, 2) {n} {n} |
| (2, 3) {n} {m, n} |
| (2, 4) {m, n} {m, n} |
| (3, 0) {n} {n} |
| (3, 1) {n} {n} |
| |
| [case testMultiPass_Liveness] |
| def f(n: int) -> None: |
| x = 1 |
| y = 1 |
| while n < 1: |
| n = y |
| while n < 2: |
| n = 1 |
| n = x |
| [out] |
| def f(n): |
| n :: int |
| r0 :: short_int |
| x :: int |
| r1 :: short_int |
| y :: int |
| r2 :: short_int |
| r3 :: bool |
| r4 :: short_int |
| r5 :: bool |
| r6 :: short_int |
| r7 :: None |
| L0: |
| r0 = 1 |
| x = r0 |
| r1 = 1 |
| y = r1 |
| L1: |
| r2 = 1 |
| r3 = n < r2 :: int |
| if r3 goto L2 else goto L6 :: bool |
| L2: |
| n = y |
| L3: |
| r4 = 2 |
| r5 = n < r4 :: int |
| if r5 goto L4 else goto L5 :: bool |
| L4: |
| r6 = 1 |
| n = r6 |
| n = x |
| goto L3 |
| L5: |
| goto L1 |
| L6: |
| r7 = None |
| return r7 |
| (0, 0) {n} {n, r0} |
| (0, 1) {n, r0} {n, x} |
| (0, 2) {n, x} {n, r1, x} |
| (0, 3) {n, r1, x} {n, x, y} |
| (0, 4) {n, x, y} {n, x, y} |
| (1, 0) {n, x, y} {n, r2, x, y} |
| (1, 1) {n, r2, x, y} {r3, x, y} |
| (1, 2) {r3, x, y} {x, y} |
| (2, 0) {x, y} {n, x, y} |
| (2, 1) {n, x, y} {n, x, y} |
| (3, 0) {n, x, y} {n, r4, x, y} |
| (3, 1) {n, r4, x, y} {n, r5, x, y} |
| (3, 2) {n, r5, x, y} {n, x, y} |
| (4, 0) {x, y} {r6, x, y} |
| (4, 1) {r6, x, y} {x, y} |
| (4, 2) {x, y} {n, x, y} |
| (4, 3) {n, x, y} {n, x, y} |
| (5, 0) {n, x, y} {n, x, y} |
| (6, 0) {} {r7} |
| (6, 1) {r7} {} |
| |
| [case testCall_Liveness] |
| def f(x: int) -> int: |
| a = f(1) |
| return f(a) + a |
| [out] |
| def f(x): |
| x :: int |
| r0 :: short_int |
| r1, a, r2, r3, r4 :: int |
| L0: |
| r0 = 1 |
| r1 = f(r0) |
| if is_error(r1) goto L3 (error at f:2) else goto L1 |
| L1: |
| a = r1 |
| r2 = f(a) |
| if is_error(r2) goto L3 (error at f:3) else goto L2 |
| L2: |
| r3 = r2 + a :: int |
| return r3 |
| L3: |
| r4 = <error> :: int |
| return r4 |
| (0, 0) {} {r0} |
| (0, 1) {r0} {r1} |
| (0, 2) {r1} {r1} |
| (1, 0) {r1} {a} |
| (1, 1) {a} {a, r2} |
| (1, 2) {a, r2} {a, r2} |
| (2, 0) {a, r2} {r3} |
| (2, 1) {r3} {} |
| (3, 0) {} {r4} |
| (3, 1) {r4} {} |
| |
| [case testLoop_MaybeDefined] |
| def f(a: int) -> None: |
| while a < a: |
| while a < a: |
| y = a |
| x = a |
| [out] |
| def f(a): |
| a :: int |
| r0, r1 :: bool |
| y, x :: int |
| r2 :: None |
| L0: |
| L1: |
| r0 = a < a :: int |
| if r0 goto L2 else goto L6 :: bool |
| L2: |
| L3: |
| r1 = a < a :: int |
| if r1 goto L4 else goto L5 :: bool |
| L4: |
| y = a |
| goto L3 |
| L5: |
| x = a |
| goto L1 |
| L6: |
| r2 = None |
| return r2 |
| (0, 0) {a} {a} |
| (1, 0) {a, x, y} {a, x, y} |
| (1, 1) {a, x, y} {a, x, y} |
| (2, 0) {a, x, y} {a, x, y} |
| (3, 0) {a, x, y} {a, x, y} |
| (3, 1) {a, x, y} {a, x, y} |
| (4, 0) {a, x, y} {a, x, y} |
| (4, 1) {a, x, y} {a, x, y} |
| (5, 0) {a, x, y} {a, x, y} |
| (5, 1) {a, x, y} {a, x, y} |
| (6, 0) {a, x, y} {a, x, y} |
| (6, 1) {a, x, y} {a, x, y} |
| |
| [case testTrivial_BorrowedArgument] |
| def f(a: int, b: int) -> int: |
| return b |
| [out] |
| def f(a, b): |
| a, b :: int |
| L0: |
| return b |
| (0, 0) {a, b} {a, b} |
| |
| [case testSimple_BorrowedArgument] |
| def f(a: int) -> int: |
| b = a |
| a = 1 |
| return a |
| [out] |
| def f(a): |
| a, b :: int |
| r0 :: short_int |
| L0: |
| b = a |
| r0 = 1 |
| a = r0 |
| return a |
| (0, 0) {a} {a} |
| (0, 1) {a} {a} |
| (0, 2) {a} {} |
| (0, 3) {} {} |
| |
| [case testConditional_BorrowedArgument] |
| def f(a: int) -> int: |
| if a == a: |
| x = 2 |
| a = 1 |
| else: |
| x = 1 |
| return x |
| [out] |
| def f(a): |
| a :: int |
| r0 :: bool |
| r1 :: short_int |
| x :: int |
| r2, r3 :: short_int |
| L0: |
| r0 = a == a :: int |
| if r0 goto L1 else goto L2 :: bool |
| L1: |
| r1 = 2 |
| x = r1 |
| r2 = 1 |
| a = r2 |
| goto L3 |
| L2: |
| r3 = 1 |
| x = r3 |
| L3: |
| return x |
| (0, 0) {a} {a} |
| (0, 1) {a} {a} |
| (1, 0) {a} {a} |
| (1, 1) {a} {a} |
| (1, 2) {a} {a} |
| (1, 3) {a} {} |
| (1, 4) {} {} |
| (2, 0) {a} {a} |
| (2, 1) {a} {a} |
| (2, 2) {a} {a} |
| (3, 0) {} {} |
| |
| [case testLoop_BorrowedArgument] |
| def f(a: int) -> int: |
| sum = 0 |
| i = 0 |
| while i <= a: |
| sum = sum + i |
| i = i + 1 |
| return sum |
| [out] |
| def f(a): |
| a :: int |
| r0 :: short_int |
| sum :: int |
| r1 :: short_int |
| i :: int |
| r2 :: bool |
| r3 :: int |
| r4 :: short_int |
| r5 :: int |
| L0: |
| r0 = 0 |
| sum = r0 |
| r1 = 0 |
| i = r1 |
| L1: |
| r2 = i <= a :: int |
| if r2 goto L2 else goto L3 :: bool |
| L2: |
| r3 = sum + i :: int |
| sum = r3 |
| r4 = 1 |
| r5 = i + r4 :: int |
| i = r5 |
| goto L1 |
| L3: |
| return sum |
| (0, 0) {a} {a} |
| (0, 1) {a} {a} |
| (0, 2) {a} {a} |
| (0, 3) {a} {a} |
| (0, 4) {a} {a} |
| (1, 0) {a} {a} |
| (1, 1) {a} {a} |
| (2, 0) {a} {a} |
| (2, 1) {a} {a} |
| (2, 2) {a} {a} |
| (2, 3) {a} {a} |
| (2, 4) {a} {a} |
| (2, 5) {a} {a} |
| (3, 0) {a} {a} |
| |
| [case testError] |
| def f(x: List[int]) -> None: pass # E: Name 'List' is not defined \ |
| # N: Did you forget to import it from "typing"? (Suggestion: "from typing import List") |
| |
| [case testExceptUndefined_Liveness] |
| def lol(x: object) -> int: |
| try: |
| st = id(x) |
| except Exception: |
| return -1 |
| return st + 1 |
| [out] |
| def lol(x): |
| x :: object |
| r0, st :: int |
| r1 :: tuple[object, object, object] |
| r2 :: object |
| r3 :: str |
| r4 :: object |
| r5 :: bool |
| r6 :: short_int |
| r7 :: int |
| r8, r9 :: bool |
| r10 :: short_int |
| r11, r12 :: int |
| L0: |
| L1: |
| r0 = id x :: object |
| st = r0 |
| goto L10 |
| L2: |
| r1 = error_catch |
| r2 = builtins :: module |
| r3 = unicode_1 :: static ('Exception') |
| r4 = getattr r2, r3 |
| if is_error(r4) goto L8 (error at lol:4) else goto L3 |
| L3: |
| r5 = exc_matches r4 |
| if r5 goto L4 else goto L5 :: bool |
| L4: |
| r6 = 1 |
| r7 = -r6 :: int |
| restore_exc_info r1 |
| return r7 |
| L5: |
| reraise_exc; r8 = 0 |
| if not r8 goto L8 else goto L6 :: bool |
| L6: |
| unreachable |
| L7: |
| restore_exc_info r1 |
| goto L10 |
| L8: |
| restore_exc_info r1 |
| r9 = keep_propagating |
| if not r9 goto L11 else goto L9 :: bool |
| L9: |
| unreachable |
| L10: |
| r10 = 1 |
| r11 = st + r10 :: int |
| return r11 |
| L11: |
| r12 = <error> :: int |
| return r12 |
| (0, 0) {x} {x} |
| (1, 0) {x} {r0} |
| (1, 1) {r0} {st} |
| (1, 2) {st} {st} |
| (2, 0) {} {r1} |
| (2, 1) {r1} {r1, r2} |
| (2, 2) {r1, r2} {r1, r2, r3} |
| (2, 3) {r1, r2, r3} {r1, r4} |
| (2, 4) {r1, r4} {r1, r4} |
| (3, 0) {r1, r4} {r1, r5} |
| (3, 1) {r1, r5} {r1} |
| (4, 0) {r1} {r1, r6} |
| (4, 1) {r1, r6} {r1, r7} |
| (4, 2) {r1, r7} {r7} |
| (4, 3) {r7} {} |
| (5, 0) {r1} {r1, r8} |
| (5, 1) {r1, r8} {r1} |
| (6, 0) {} {} |
| (7, 0) {r1, st} {st} |
| (7, 1) {st} {st} |
| (8, 0) {r1} {} |
| (8, 1) {} {r9} |
| (8, 2) {r9} {} |
| (9, 0) {} {} |
| (10, 0) {st} {r10, st} |
| (10, 1) {r10, st} {r11} |
| (10, 2) {r11} {} |
| (11, 0) {} {r12} |
| (11, 1) {r12} {} |
| |