analysis.test 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. -- Test cases for data flow analysis.
  2. [case testSimple_MaybeDefined]
  3. def f(a: int) -> None:
  4. x = 1
  5. if x == a:
  6. y = 1
  7. else:
  8. z = 1
  9. [out]
  10. def f(a):
  11. a, x :: int
  12. r0 :: native_int
  13. r1, r2, r3 :: bit
  14. y, z :: int
  15. L0:
  16. x = 2
  17. r0 = x & 1
  18. r1 = r0 != 0
  19. if r1 goto L1 else goto L2 :: bool
  20. L1:
  21. r2 = CPyTagged_IsEq_(x, a)
  22. if r2 goto L3 else goto L4 :: bool
  23. L2:
  24. r3 = x == a
  25. if r3 goto L3 else goto L4 :: bool
  26. L3:
  27. y = 2
  28. goto L5
  29. L4:
  30. z = 2
  31. L5:
  32. return 1
  33. (0, 0) {a} {a, x}
  34. (0, 1) {a, x} {a, x}
  35. (0, 2) {a, x} {a, x}
  36. (0, 3) {a, x} {a, x}
  37. (1, 0) {a, x} {a, x}
  38. (1, 1) {a, x} {a, x}
  39. (2, 0) {a, x} {a, x}
  40. (2, 1) {a, x} {a, x}
  41. (3, 0) {a, x} {a, x, y}
  42. (3, 1) {a, x, y} {a, x, y}
  43. (4, 0) {a, x} {a, x, z}
  44. (4, 1) {a, x, z} {a, x, z}
  45. (5, 0) {a, x, y, z} {a, x, y, z}
  46. [case testSimple_Liveness]
  47. def f(a: int) -> int:
  48. x = 1
  49. if x == 1:
  50. return a
  51. else:
  52. return x
  53. [out]
  54. def f(a):
  55. a, x :: int
  56. r0 :: bit
  57. L0:
  58. x = 2
  59. r0 = x == 2
  60. if r0 goto L1 else goto L2 :: bool
  61. L1:
  62. return a
  63. L2:
  64. return x
  65. L3:
  66. unreachable
  67. (0, 0) {a} {a, x}
  68. (0, 1) {a, x} {a, r0, x}
  69. (0, 2) {a, r0, x} {a, x}
  70. (1, 0) {a} {}
  71. (2, 0) {x} {}
  72. (3, 0) {} {}
  73. [case testSpecial_Liveness]
  74. def f() -> int:
  75. x = 1
  76. y = 1
  77. x = 2
  78. return x
  79. [out]
  80. def f():
  81. x, y :: int
  82. L0:
  83. x = 2
  84. y = 2
  85. x = 4
  86. return x
  87. (0, 0) {} {}
  88. (0, 1) {} {}
  89. (0, 2) {} {x}
  90. (0, 3) {x} {}
  91. [case testSpecial2_Liveness]
  92. def f(a: int) -> int:
  93. a = 1
  94. a = 2
  95. a = 3
  96. return a
  97. [out]
  98. def f(a):
  99. a :: int
  100. L0:
  101. a = 2
  102. a = 4
  103. a = 6
  104. return a
  105. (0, 0) {} {}
  106. (0, 1) {} {}
  107. (0, 2) {} {a}
  108. (0, 3) {a} {}
  109. [case testSimple_MustDefined]
  110. def f(a: int) -> None:
  111. if a == 1:
  112. y = 1
  113. x = 2
  114. else:
  115. x = 2
  116. [out]
  117. def f(a):
  118. a :: int
  119. r0 :: bit
  120. y, x :: int
  121. L0:
  122. r0 = a == 2
  123. if r0 goto L1 else goto L2 :: bool
  124. L1:
  125. y = 2
  126. x = 4
  127. goto L3
  128. L2:
  129. x = 4
  130. L3:
  131. return 1
  132. (0, 0) {a} {a}
  133. (0, 1) {a} {a}
  134. (1, 0) {a} {a, y}
  135. (1, 1) {a, y} {a, x, y}
  136. (1, 2) {a, x, y} {a, x, y}
  137. (2, 0) {a} {a, x}
  138. (2, 1) {a, x} {a, x}
  139. (3, 0) {a, x} {a, x}
  140. [case testTwoArgs_MustDefined]
  141. def f(x: int, y: int) -> int:
  142. return x
  143. [out]
  144. def f(x, y):
  145. x, y :: int
  146. L0:
  147. return x
  148. (0, 0) {x, y} {x, y}
  149. [case testLoop_MustDefined]
  150. def f(n: int) -> None:
  151. while n < 5:
  152. n = n + 1
  153. m = n
  154. [out]
  155. def f(n):
  156. n :: int
  157. r0 :: native_int
  158. r1, r2, r3 :: bit
  159. r4, m :: int
  160. L0:
  161. L1:
  162. r0 = n & 1
  163. r1 = r0 != 0
  164. if r1 goto L2 else goto L3 :: bool
  165. L2:
  166. r2 = CPyTagged_IsLt_(n, 10)
  167. if r2 goto L4 else goto L5 :: bool
  168. L3:
  169. r3 = n < 10 :: signed
  170. if r3 goto L4 else goto L5 :: bool
  171. L4:
  172. r4 = CPyTagged_Add(n, 2)
  173. n = r4
  174. m = n
  175. goto L1
  176. L5:
  177. return 1
  178. (0, 0) {n} {n}
  179. (1, 0) {n} {n}
  180. (1, 1) {n} {n}
  181. (1, 2) {n} {n}
  182. (2, 0) {n} {n}
  183. (2, 1) {n} {n}
  184. (3, 0) {n} {n}
  185. (3, 1) {n} {n}
  186. (4, 0) {n} {n}
  187. (4, 1) {n} {n}
  188. (4, 2) {n} {m, n}
  189. (4, 3) {m, n} {m, n}
  190. (5, 0) {n} {n}
  191. [case testMultiPass_Liveness]
  192. def f(n: int) -> None:
  193. x = 1
  194. y = 1
  195. while n < 1:
  196. n = y
  197. while n < 2:
  198. n = 1
  199. n = x
  200. [out]
  201. def f(n):
  202. n, x, y :: int
  203. r0 :: native_int
  204. r1, r2, r3 :: bit
  205. r4 :: native_int
  206. r5, r6, r7 :: bit
  207. L0:
  208. x = 2
  209. y = 2
  210. L1:
  211. r0 = n & 1
  212. r1 = r0 != 0
  213. if r1 goto L2 else goto L3 :: bool
  214. L2:
  215. r2 = CPyTagged_IsLt_(n, 2)
  216. if r2 goto L4 else goto L10 :: bool
  217. L3:
  218. r3 = n < 2 :: signed
  219. if r3 goto L4 else goto L10 :: bool
  220. L4:
  221. n = y
  222. L5:
  223. r4 = n & 1
  224. r5 = r4 != 0
  225. if r5 goto L6 else goto L7 :: bool
  226. L6:
  227. r6 = CPyTagged_IsLt_(n, 4)
  228. if r6 goto L8 else goto L9 :: bool
  229. L7:
  230. r7 = n < 4 :: signed
  231. if r7 goto L8 else goto L9 :: bool
  232. L8:
  233. n = 2
  234. n = x
  235. goto L5
  236. L9:
  237. goto L1
  238. L10:
  239. return 1
  240. (0, 0) {n} {n, x}
  241. (0, 1) {n, x} {n, x, y}
  242. (0, 2) {n, x, y} {n, x, y}
  243. (1, 0) {n, x, y} {n, r0, x, y}
  244. (1, 1) {n, r0, x, y} {n, r1, x, y}
  245. (1, 2) {n, r1, x, y} {n, x, y}
  246. (2, 0) {n, x, y} {r2, x, y}
  247. (2, 1) {r2, x, y} {x, y}
  248. (3, 0) {n, x, y} {r3, x, y}
  249. (3, 1) {r3, x, y} {x, y}
  250. (4, 0) {x, y} {n, x, y}
  251. (4, 1) {n, x, y} {n, x, y}
  252. (5, 0) {n, x, y} {n, r4, x, y}
  253. (5, 1) {n, r4, x, y} {n, r5, x, y}
  254. (5, 2) {n, r5, x, y} {n, x, y}
  255. (6, 0) {n, x, y} {n, r6, x, y}
  256. (6, 1) {n, r6, x, y} {n, x, y}
  257. (7, 0) {n, x, y} {n, r7, x, y}
  258. (7, 1) {n, r7, x, y} {n, x, y}
  259. (8, 0) {x, y} {x, y}
  260. (8, 1) {x, y} {n, x, y}
  261. (8, 2) {n, x, y} {n, x, y}
  262. (9, 0) {n, x, y} {n, x, y}
  263. (10, 0) {} {}
  264. [case testCall_Liveness]
  265. def f(x: int) -> int:
  266. a = f(1)
  267. return f(a) + a
  268. [out]
  269. def f(x):
  270. x, r0, a, r1, r2, r3 :: int
  271. L0:
  272. r0 = f(2)
  273. if is_error(r0) goto L3 (error at f:2) else goto L1
  274. L1:
  275. a = r0
  276. r1 = f(a)
  277. if is_error(r1) goto L3 (error at f:3) else goto L2
  278. L2:
  279. r2 = CPyTagged_Add(r1, a)
  280. return r2
  281. L3:
  282. r3 = <error> :: int
  283. return r3
  284. (0, 0) {} {r0}
  285. (0, 1) {r0} {r0}
  286. (1, 0) {r0} {a}
  287. (1, 1) {a} {a, r1}
  288. (1, 2) {a, r1} {a, r1}
  289. (2, 0) {a, r1} {r2}
  290. (2, 1) {r2} {}
  291. (3, 0) {} {r3}
  292. (3, 1) {r3} {}
  293. [case testLoop_MaybeDefined]
  294. def f(a: int) -> None:
  295. while a < a:
  296. while a < a:
  297. y = a
  298. x = a
  299. [out]
  300. def f(a):
  301. a :: int
  302. r0 :: native_int
  303. r1 :: bit
  304. r2 :: native_int
  305. r3, r4, r5 :: bit
  306. r6 :: native_int
  307. r7 :: bit
  308. r8 :: native_int
  309. r9, r10, r11 :: bit
  310. y, x :: int
  311. L0:
  312. L1:
  313. r0 = a & 1
  314. r1 = r0 != 0
  315. if r1 goto L3 else goto L2 :: bool
  316. L2:
  317. r2 = a & 1
  318. r3 = r2 != 0
  319. if r3 goto L3 else goto L4 :: bool
  320. L3:
  321. r4 = CPyTagged_IsLt_(a, a)
  322. if r4 goto L5 else goto L12 :: bool
  323. L4:
  324. r5 = a < a :: signed
  325. if r5 goto L5 else goto L12 :: bool
  326. L5:
  327. L6:
  328. r6 = a & 1
  329. r7 = r6 != 0
  330. if r7 goto L8 else goto L7 :: bool
  331. L7:
  332. r8 = a & 1
  333. r9 = r8 != 0
  334. if r9 goto L8 else goto L9 :: bool
  335. L8:
  336. r10 = CPyTagged_IsLt_(a, a)
  337. if r10 goto L10 else goto L11 :: bool
  338. L9:
  339. r11 = a < a :: signed
  340. if r11 goto L10 else goto L11 :: bool
  341. L10:
  342. y = a
  343. goto L6
  344. L11:
  345. x = a
  346. goto L1
  347. L12:
  348. return 1
  349. (0, 0) {a} {a}
  350. (1, 0) {a, x, y} {a, x, y}
  351. (1, 1) {a, x, y} {a, x, y}
  352. (1, 2) {a, x, y} {a, x, y}
  353. (2, 0) {a, x, y} {a, x, y}
  354. (2, 1) {a, x, y} {a, x, y}
  355. (2, 2) {a, x, y} {a, x, y}
  356. (3, 0) {a, x, y} {a, x, y}
  357. (3, 1) {a, x, y} {a, x, y}
  358. (4, 0) {a, x, y} {a, x, y}
  359. (4, 1) {a, x, y} {a, x, y}
  360. (5, 0) {a, x, y} {a, x, y}
  361. (6, 0) {a, x, y} {a, x, y}
  362. (6, 1) {a, x, y} {a, x, y}
  363. (6, 2) {a, x, y} {a, x, y}
  364. (7, 0) {a, x, y} {a, x, y}
  365. (7, 1) {a, x, y} {a, x, y}
  366. (7, 2) {a, x, y} {a, x, y}
  367. (8, 0) {a, x, y} {a, x, y}
  368. (8, 1) {a, x, y} {a, x, y}
  369. (9, 0) {a, x, y} {a, x, y}
  370. (9, 1) {a, x, y} {a, x, y}
  371. (10, 0) {a, x, y} {a, x, y}
  372. (10, 1) {a, x, y} {a, x, y}
  373. (11, 0) {a, x, y} {a, x, y}
  374. (11, 1) {a, x, y} {a, x, y}
  375. (12, 0) {a, x, y} {a, x, y}
  376. [case testTrivial_BorrowedArgument]
  377. def f(a: int, b: int) -> int:
  378. return b
  379. [out]
  380. def f(a, b):
  381. a, b :: int
  382. L0:
  383. return b
  384. (0, 0) {a, b} {a, b}
  385. [case testSimple_BorrowedArgument]
  386. def f(a: int) -> int:
  387. b = a
  388. a = 1
  389. return a
  390. [out]
  391. def f(a):
  392. a, b :: int
  393. L0:
  394. b = a
  395. a = 2
  396. return a
  397. (0, 0) {a} {a}
  398. (0, 1) {a} {}
  399. (0, 2) {} {}
  400. [case testConditional_BorrowedArgument]
  401. def f(a: int) -> int:
  402. if a == a:
  403. x = 2
  404. a = 1
  405. else:
  406. x = 1
  407. return x
  408. [out]
  409. def f(a):
  410. a :: int
  411. r0 :: native_int
  412. r1, r2, r3 :: bit
  413. x :: int
  414. L0:
  415. r0 = a & 1
  416. r1 = r0 != 0
  417. if r1 goto L1 else goto L2 :: bool
  418. L1:
  419. r2 = CPyTagged_IsEq_(a, a)
  420. if r2 goto L3 else goto L4 :: bool
  421. L2:
  422. r3 = a == a
  423. if r3 goto L3 else goto L4 :: bool
  424. L3:
  425. x = 4
  426. a = 2
  427. goto L5
  428. L4:
  429. x = 2
  430. L5:
  431. return x
  432. (0, 0) {a} {a}
  433. (0, 1) {a} {a}
  434. (0, 2) {a} {a}
  435. (1, 0) {a} {a}
  436. (1, 1) {a} {a}
  437. (2, 0) {a} {a}
  438. (2, 1) {a} {a}
  439. (3, 0) {a} {a}
  440. (3, 1) {a} {}
  441. (3, 2) {} {}
  442. (4, 0) {a} {a}
  443. (4, 1) {a} {a}
  444. (5, 0) {} {}
  445. [case testLoop_BorrowedArgument]
  446. def f(a: int) -> int:
  447. sum = 0
  448. i = 0
  449. while i <= a:
  450. sum = sum + i
  451. i = i + 1
  452. return sum
  453. [out]
  454. def f(a):
  455. a, sum, i :: int
  456. r0 :: native_int
  457. r1 :: bit
  458. r2 :: native_int
  459. r3, r4, r5 :: bit
  460. r6, r7 :: int
  461. L0:
  462. sum = 0
  463. i = 0
  464. L1:
  465. r0 = i & 1
  466. r1 = r0 != 0
  467. if r1 goto L3 else goto L2 :: bool
  468. L2:
  469. r2 = a & 1
  470. r3 = r2 != 0
  471. if r3 goto L3 else goto L4 :: bool
  472. L3:
  473. r4 = CPyTagged_IsLt_(a, i)
  474. if r4 goto L6 else goto L5 :: bool
  475. L4:
  476. r5 = i <= a :: signed
  477. if r5 goto L5 else goto L6 :: bool
  478. L5:
  479. r6 = CPyTagged_Add(sum, i)
  480. sum = r6
  481. r7 = CPyTagged_Add(i, 2)
  482. i = r7
  483. goto L1
  484. L6:
  485. return sum
  486. (0, 0) {a} {a}
  487. (0, 1) {a} {a}
  488. (0, 2) {a} {a}
  489. (1, 0) {a} {a}
  490. (1, 1) {a} {a}
  491. (1, 2) {a} {a}
  492. (2, 0) {a} {a}
  493. (2, 1) {a} {a}
  494. (2, 2) {a} {a}
  495. (3, 0) {a} {a}
  496. (3, 1) {a} {a}
  497. (4, 0) {a} {a}
  498. (4, 1) {a} {a}
  499. (5, 0) {a} {a}
  500. (5, 1) {a} {a}
  501. (5, 2) {a} {a}
  502. (5, 3) {a} {a}
  503. (5, 4) {a} {a}
  504. (6, 0) {a} {a}
  505. [case testError]
  506. def f(x: List[int]) -> None: pass # E: Name "List" is not defined \
  507. # N: Did you forget to import it from "typing"? (Suggestion: "from typing import List")
  508. [case testExceptUndefined_Liveness]
  509. def lol(x: object) -> int:
  510. try:
  511. st = id(x)
  512. except Exception:
  513. return -1
  514. return st + 1
  515. [out]
  516. def lol(x):
  517. x :: object
  518. r0, st :: int
  519. r1 :: tuple[object, object, object]
  520. r2 :: object
  521. r3 :: str
  522. r4 :: object
  523. r5, r6 :: bit
  524. r7, r8 :: int
  525. L0:
  526. L1:
  527. r0 = CPyTagged_Id(x)
  528. st = r0
  529. goto L10
  530. L2:
  531. r1 = CPy_CatchError()
  532. r2 = builtins :: module
  533. r3 = 'Exception'
  534. r4 = CPyObject_GetAttr(r2, r3)
  535. if is_error(r4) goto L8 (error at lol:4) else goto L3
  536. L3:
  537. r5 = CPy_ExceptionMatches(r4)
  538. if r5 goto L4 else goto L5 :: bool
  539. L4:
  540. CPy_RestoreExcInfo(r1)
  541. return -2
  542. L5:
  543. CPy_Reraise()
  544. if not 0 goto L8 else goto L6 :: bool
  545. L6:
  546. unreachable
  547. L7:
  548. CPy_RestoreExcInfo(r1)
  549. goto L10
  550. L8:
  551. CPy_RestoreExcInfo(r1)
  552. r6 = CPy_KeepPropagating()
  553. if not r6 goto L11 else goto L9 :: bool
  554. L9:
  555. unreachable
  556. L10:
  557. r7 = CPyTagged_Add(st, 2)
  558. return r7
  559. L11:
  560. r8 = <error> :: int
  561. return r8
  562. (0, 0) {x} {x}
  563. (1, 0) {x} {r0}
  564. (1, 1) {r0} {st}
  565. (1, 2) {st} {st}
  566. (2, 0) {} {r1}
  567. (2, 1) {r1} {r1, r2}
  568. (2, 2) {r1, r2} {r1, r2, r3}
  569. (2, 3) {r1, r2, r3} {r1, r4}
  570. (2, 4) {r1, r4} {r1, r4}
  571. (3, 0) {r1, r4} {r1, r5}
  572. (3, 1) {r1, r5} {r1}
  573. (4, 0) {r1} {}
  574. (4, 1) {} {}
  575. (5, 0) {r1} {r1}
  576. (5, 1) {r1} {r1}
  577. (6, 0) {} {}
  578. (7, 0) {r1, st} {st}
  579. (7, 1) {st} {st}
  580. (8, 0) {r1} {}
  581. (8, 1) {} {r6}
  582. (8, 2) {r6} {}
  583. (9, 0) {} {}
  584. (10, 0) {st} {r7}
  585. (10, 1) {r7} {}
  586. (11, 0) {} {r8}
  587. (11, 1) {r8} {}