irbuild-i64.test 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164
  1. [case testI64Basics]
  2. from mypy_extensions import i64
  3. def f() -> i64:
  4. x: i64 = 5
  5. y = x
  6. return y
  7. [out]
  8. def f():
  9. x, y :: i64
  10. L0:
  11. x = 5
  12. y = x
  13. return y
  14. [case testI64Compare]
  15. from mypy_extensions import i64
  16. def min(x: i64, y: i64) -> i64:
  17. if x < y:
  18. return x
  19. else:
  20. return y
  21. def all_comparisons(x: i64) -> int:
  22. if x == 2:
  23. y = 10
  24. elif 3 != x:
  25. y = 11
  26. elif x > 4:
  27. y = 12
  28. elif 6 >= x:
  29. y = 13
  30. elif x < 5:
  31. y = 14
  32. elif 6 <= x:
  33. y = 15
  34. else:
  35. y = 16
  36. return y
  37. [out]
  38. def min(x, y):
  39. x, y :: i64
  40. r0 :: bit
  41. L0:
  42. r0 = x < y :: signed
  43. if r0 goto L1 else goto L2 :: bool
  44. L1:
  45. return x
  46. L2:
  47. return y
  48. L3:
  49. unreachable
  50. def all_comparisons(x):
  51. x :: i64
  52. r0 :: bit
  53. y :: int
  54. r1, r2, r3, r4, r5 :: bit
  55. L0:
  56. r0 = x == 2
  57. if r0 goto L1 else goto L2 :: bool
  58. L1:
  59. y = 20
  60. goto L18
  61. L2:
  62. r1 = 3 != x
  63. if r1 goto L3 else goto L4 :: bool
  64. L3:
  65. y = 22
  66. goto L17
  67. L4:
  68. r2 = x > 4 :: signed
  69. if r2 goto L5 else goto L6 :: bool
  70. L5:
  71. y = 24
  72. goto L16
  73. L6:
  74. r3 = 6 >= x :: signed
  75. if r3 goto L7 else goto L8 :: bool
  76. L7:
  77. y = 26
  78. goto L15
  79. L8:
  80. r4 = x < 5 :: signed
  81. if r4 goto L9 else goto L10 :: bool
  82. L9:
  83. y = 28
  84. goto L14
  85. L10:
  86. r5 = 6 <= x :: signed
  87. if r5 goto L11 else goto L12 :: bool
  88. L11:
  89. y = 30
  90. goto L13
  91. L12:
  92. y = 32
  93. L13:
  94. L14:
  95. L15:
  96. L16:
  97. L17:
  98. L18:
  99. return y
  100. [case testI64Arithmetic]
  101. from mypy_extensions import i64
  102. def f(x: i64, y: i64) -> i64:
  103. z = x + y
  104. return y - z
  105. [out]
  106. def f(x, y):
  107. x, y, r0, z, r1 :: i64
  108. L0:
  109. r0 = x + y
  110. z = r0
  111. r1 = y - z
  112. return r1
  113. [case testI64Negation]
  114. from mypy_extensions import i64
  115. def f() -> i64:
  116. i: i64 = -3
  117. return -i
  118. [out]
  119. def f():
  120. i, r0 :: i64
  121. L0:
  122. i = -3
  123. r0 = 0 - i
  124. return r0
  125. [case testI64MoreUnaryOps]
  126. from mypy_extensions import i64
  127. def unary(x: i64) -> i64:
  128. y = ~x
  129. x = +y
  130. return x
  131. [out]
  132. def unary(x):
  133. x, r0, y :: i64
  134. L0:
  135. r0 = x ^ -1
  136. y = r0
  137. x = y
  138. return x
  139. [case testI64BoxingAndUnboxing]
  140. from typing import Any
  141. from mypy_extensions import i64
  142. def f(a: Any) -> None:
  143. b: i64 = a
  144. a = b
  145. [out]
  146. def f(a):
  147. a :: object
  148. r0, b :: i64
  149. r1 :: object
  150. L0:
  151. r0 = unbox(i64, a)
  152. b = r0
  153. r1 = box(i64, b)
  154. a = r1
  155. return 1
  156. [case testI64ListGetSetItem]
  157. from typing import List
  158. from mypy_extensions import i64
  159. def get(a: List[i64], i: i64) -> i64:
  160. return a[i]
  161. def set(a: List[i64], i: i64, x: i64) -> None:
  162. a[i] = x
  163. [out]
  164. def get(a, i):
  165. a :: list
  166. i :: i64
  167. r0 :: object
  168. r1 :: i64
  169. L0:
  170. r0 = CPyList_GetItemInt64(a, i)
  171. r1 = unbox(i64, r0)
  172. return r1
  173. def set(a, i, x):
  174. a :: list
  175. i, x :: i64
  176. r0 :: object
  177. r1 :: bit
  178. L0:
  179. r0 = box(i64, x)
  180. r1 = CPyList_SetItemInt64(a, i, r0)
  181. return 1
  182. [case testI64MixedArithmetic]
  183. from mypy_extensions import i64
  184. def f() -> i64:
  185. a: i64 = 1
  186. b = a + 2
  187. return 3 - b
  188. [out]
  189. def f():
  190. a, r0, b, r1 :: i64
  191. L0:
  192. a = 1
  193. r0 = a + 2
  194. b = r0
  195. r1 = 3 - b
  196. return r1
  197. [case testI64MixedComparison]
  198. from mypy_extensions import i64
  199. def f(a: i64) -> i64:
  200. if a < 3:
  201. return 1
  202. elif 3 < a:
  203. return 2
  204. return 3
  205. [out]
  206. def f(a):
  207. a :: i64
  208. r0, r1 :: bit
  209. L0:
  210. r0 = a < 3 :: signed
  211. if r0 goto L1 else goto L2 :: bool
  212. L1:
  213. return 1
  214. L2:
  215. r1 = 3 < a :: signed
  216. if r1 goto L3 else goto L4 :: bool
  217. L3:
  218. return 2
  219. L4:
  220. L5:
  221. return 3
  222. [case testI64InplaceOperations]
  223. from mypy_extensions import i64
  224. def add(a: i64) -> i64:
  225. b = a
  226. b += 1
  227. a += b
  228. return a
  229. def others(a: i64, b: i64) -> i64:
  230. a -= b
  231. a *= b
  232. a &= b
  233. a |= b
  234. a ^= b
  235. a <<= b
  236. a >>= b
  237. return a
  238. [out]
  239. def add(a):
  240. a, b, r0, r1 :: i64
  241. L0:
  242. b = a
  243. r0 = b + 1
  244. b = r0
  245. r1 = a + b
  246. a = r1
  247. return a
  248. def others(a, b):
  249. a, b, r0, r1, r2, r3, r4, r5, r6 :: i64
  250. L0:
  251. r0 = a - b
  252. a = r0
  253. r1 = a * b
  254. a = r1
  255. r2 = a & b
  256. a = r2
  257. r3 = a | b
  258. a = r3
  259. r4 = a ^ b
  260. a = r4
  261. r5 = a << b
  262. a = r5
  263. r6 = a >> b
  264. a = r6
  265. return a
  266. [case testI64BitwiseOps]
  267. from mypy_extensions import i64
  268. def forward(a: i64, b: i64) -> i64:
  269. b = a & 1
  270. a = b | 2
  271. b = a ^ 3
  272. a = b << 4
  273. b = a >> 5
  274. return b
  275. def reverse(a: i64, b: i64) -> i64:
  276. b = 1 & a
  277. a = 2 | b
  278. b = 3 ^ a
  279. a = 4 << b
  280. b = 5 >> a
  281. return b
  282. def unary(a: i64) -> i64:
  283. return ~a
  284. [out]
  285. def forward(a, b):
  286. a, b, r0, r1, r2, r3, r4 :: i64
  287. L0:
  288. r0 = a & 1
  289. b = r0
  290. r1 = b | 2
  291. a = r1
  292. r2 = a ^ 3
  293. b = r2
  294. r3 = b << 4
  295. a = r3
  296. r4 = a >> 5
  297. b = r4
  298. return b
  299. def reverse(a, b):
  300. a, b, r0, r1, r2, r3, r4 :: i64
  301. L0:
  302. r0 = 1 & a
  303. b = r0
  304. r1 = 2 | b
  305. a = r1
  306. r2 = 3 ^ a
  307. b = r2
  308. r3 = 4 << b
  309. a = r3
  310. r4 = 5 >> a
  311. b = r4
  312. return b
  313. def unary(a):
  314. a, r0 :: i64
  315. L0:
  316. r0 = a ^ -1
  317. return r0
  318. [case testI64Division]
  319. from mypy_extensions import i64
  320. def constant_divisor(x: i64) -> i64:
  321. return x // 7
  322. def variable_divisor(x: i64, y: i64) -> i64:
  323. return x // y
  324. def constant_lhs(x: i64) -> i64:
  325. return 27 // x
  326. def divide_by_neg_one(x: i64) -> i64:
  327. return x // -1
  328. def divide_by_zero(x: i64) -> i64:
  329. return x // 0
  330. [out]
  331. def constant_divisor(x):
  332. x, r0, r1 :: i64
  333. r2, r3, r4 :: bit
  334. r5 :: i64
  335. r6 :: bit
  336. r7 :: i64
  337. L0:
  338. r0 = x / 7
  339. r1 = r0
  340. r2 = x < 0 :: signed
  341. r3 = 7 < 0 :: signed
  342. r4 = r2 == r3
  343. if r4 goto L3 else goto L1 :: bool
  344. L1:
  345. r5 = r1 * 7
  346. r6 = r5 == x
  347. if r6 goto L3 else goto L2 :: bool
  348. L2:
  349. r7 = r1 - 1
  350. r1 = r7
  351. L3:
  352. return r1
  353. def variable_divisor(x, y):
  354. x, y, r0 :: i64
  355. L0:
  356. r0 = CPyInt64_Divide(x, y)
  357. return r0
  358. def constant_lhs(x):
  359. x, r0 :: i64
  360. L0:
  361. r0 = CPyInt64_Divide(27, x)
  362. return r0
  363. def divide_by_neg_one(x):
  364. x, r0 :: i64
  365. L0:
  366. r0 = CPyInt64_Divide(x, -1)
  367. return r0
  368. def divide_by_zero(x):
  369. x, r0 :: i64
  370. L0:
  371. r0 = CPyInt64_Divide(x, 0)
  372. return r0
  373. [case testI64Mod]
  374. from mypy_extensions import i64
  375. def constant_divisor(x: i64) -> i64:
  376. return x % 7
  377. def variable_divisor(x: i64, y: i64) -> i64:
  378. return x % y
  379. def constant_lhs(x: i64) -> i64:
  380. return 27 % x
  381. def mod_by_zero(x: i64) -> i64:
  382. return x % 0
  383. [out]
  384. def constant_divisor(x):
  385. x, r0, r1 :: i64
  386. r2, r3, r4, r5 :: bit
  387. r6 :: i64
  388. L0:
  389. r0 = x % 7
  390. r1 = r0
  391. r2 = x < 0 :: signed
  392. r3 = 7 < 0 :: signed
  393. r4 = r2 == r3
  394. if r4 goto L3 else goto L1 :: bool
  395. L1:
  396. r5 = r1 == 0
  397. if r5 goto L3 else goto L2 :: bool
  398. L2:
  399. r6 = r1 + 7
  400. r1 = r6
  401. L3:
  402. return r1
  403. def variable_divisor(x, y):
  404. x, y, r0 :: i64
  405. L0:
  406. r0 = CPyInt64_Remainder(x, y)
  407. return r0
  408. def constant_lhs(x):
  409. x, r0 :: i64
  410. L0:
  411. r0 = CPyInt64_Remainder(27, x)
  412. return r0
  413. def mod_by_zero(x):
  414. x, r0 :: i64
  415. L0:
  416. r0 = CPyInt64_Remainder(x, 0)
  417. return r0
  418. [case testI64InPlaceDiv]
  419. from mypy_extensions import i64
  420. def by_constant(x: i64) -> i64:
  421. x //= 7
  422. return x
  423. def by_variable(x: i64, y: i64) -> i64:
  424. x //= y
  425. return x
  426. [out]
  427. def by_constant(x):
  428. x, r0, r1 :: i64
  429. r2, r3, r4 :: bit
  430. r5 :: i64
  431. r6 :: bit
  432. r7 :: i64
  433. L0:
  434. r0 = x / 7
  435. r1 = r0
  436. r2 = x < 0 :: signed
  437. r3 = 7 < 0 :: signed
  438. r4 = r2 == r3
  439. if r4 goto L3 else goto L1 :: bool
  440. L1:
  441. r5 = r1 * 7
  442. r6 = r5 == x
  443. if r6 goto L3 else goto L2 :: bool
  444. L2:
  445. r7 = r1 - 1
  446. r1 = r7
  447. L3:
  448. x = r1
  449. return x
  450. def by_variable(x, y):
  451. x, y, r0 :: i64
  452. L0:
  453. r0 = CPyInt64_Divide(x, y)
  454. x = r0
  455. return x
  456. [case testI64InPlaceMod]
  457. from mypy_extensions import i64
  458. def by_constant(x: i64) -> i64:
  459. x %= 7
  460. return x
  461. def by_variable(x: i64, y: i64) -> i64:
  462. x %= y
  463. return x
  464. [out]
  465. def by_constant(x):
  466. x, r0, r1 :: i64
  467. r2, r3, r4, r5 :: bit
  468. r6 :: i64
  469. L0:
  470. r0 = x % 7
  471. r1 = r0
  472. r2 = x < 0 :: signed
  473. r3 = 7 < 0 :: signed
  474. r4 = r2 == r3
  475. if r4 goto L3 else goto L1 :: bool
  476. L1:
  477. r5 = r1 == 0
  478. if r5 goto L3 else goto L2 :: bool
  479. L2:
  480. r6 = r1 + 7
  481. r1 = r6
  482. L3:
  483. x = r1
  484. return x
  485. def by_variable(x, y):
  486. x, y, r0 :: i64
  487. L0:
  488. r0 = CPyInt64_Remainder(x, y)
  489. x = r0
  490. return x
  491. [case testI64ForRange]
  492. from mypy_extensions import i64
  493. def g(a: i64) -> None: pass
  494. def f(x: i64) -> None:
  495. n: i64 # TODO: Infer the type
  496. for n in range(x):
  497. g(n)
  498. [out]
  499. def g(a):
  500. a :: i64
  501. L0:
  502. return 1
  503. def f(x):
  504. x, r0, n :: i64
  505. r1 :: bit
  506. r2 :: None
  507. r3 :: i64
  508. L0:
  509. r0 = 0
  510. n = r0
  511. L1:
  512. r1 = r0 < x :: signed
  513. if r1 goto L2 else goto L4 :: bool
  514. L2:
  515. r2 = g(n)
  516. L3:
  517. r3 = r0 + 1
  518. r0 = r3
  519. n = r3
  520. goto L1
  521. L4:
  522. return 1
  523. [case testI64ConvertFromInt_64bit]
  524. from mypy_extensions import i64
  525. def int_to_i64(a: int) -> i64:
  526. return a
  527. [out]
  528. def int_to_i64(a):
  529. a :: int
  530. r0 :: native_int
  531. r1 :: bit
  532. r2, r3 :: i64
  533. r4 :: ptr
  534. r5 :: c_ptr
  535. r6 :: i64
  536. L0:
  537. r0 = a & 1
  538. r1 = r0 == 0
  539. if r1 goto L1 else goto L2 :: bool
  540. L1:
  541. r2 = a >> 1
  542. r3 = r2
  543. goto L3
  544. L2:
  545. r4 = a ^ 1
  546. r5 = r4
  547. r6 = CPyLong_AsInt64(r5)
  548. r3 = r6
  549. keep_alive a
  550. L3:
  551. return r3
  552. [case testI64ConvertToInt_64bit]
  553. from mypy_extensions import i64
  554. def i64_to_int(a: i64) -> int:
  555. return a
  556. [out]
  557. def i64_to_int(a):
  558. a :: i64
  559. r0, r1 :: bit
  560. r2, r3, r4 :: int
  561. L0:
  562. r0 = a <= 4611686018427387903 :: signed
  563. if r0 goto L1 else goto L2 :: bool
  564. L1:
  565. r1 = a >= -4611686018427387904 :: signed
  566. if r1 goto L3 else goto L2 :: bool
  567. L2:
  568. r2 = CPyTagged_FromInt64(a)
  569. r3 = r2
  570. goto L4
  571. L3:
  572. r4 = a << 1
  573. r3 = r4
  574. L4:
  575. return r3
  576. [case testI64ConvertToInt_32bit]
  577. from mypy_extensions import i64
  578. def i64_to_int(a: i64) -> int:
  579. return a
  580. [out]
  581. def i64_to_int(a):
  582. a :: i64
  583. r0, r1 :: bit
  584. r2, r3 :: int
  585. r4 :: native_int
  586. r5 :: int
  587. L0:
  588. r0 = a <= 1073741823 :: signed
  589. if r0 goto L1 else goto L2 :: bool
  590. L1:
  591. r1 = a >= -1073741824 :: signed
  592. if r1 goto L3 else goto L2 :: bool
  593. L2:
  594. r2 = CPyTagged_FromInt64(a)
  595. r3 = r2
  596. goto L4
  597. L3:
  598. r4 = truncate a: i64 to native_int
  599. r5 = r4 << 1
  600. r3 = r5
  601. L4:
  602. return r3
  603. [case testI64Tuple]
  604. from typing import Tuple
  605. from mypy_extensions import i64
  606. def f(x: i64, y: i64) -> Tuple[i64, i64]:
  607. return x, y
  608. def g() -> Tuple[i64, i64]:
  609. return 1, 2
  610. def h() -> i64:
  611. x, y = g()
  612. t = g()
  613. return x + y + t[0]
  614. [out]
  615. def f(x, y):
  616. x, y :: i64
  617. r0 :: tuple[i64, i64]
  618. L0:
  619. r0 = (x, y)
  620. return r0
  621. def g():
  622. r0 :: tuple[int, int]
  623. r1 :: tuple[i64, i64]
  624. L0:
  625. r0 = (2, 4)
  626. r1 = (1, 2)
  627. return r1
  628. def h():
  629. r0 :: tuple[i64, i64]
  630. r1, x, r2, y :: i64
  631. r3, t :: tuple[i64, i64]
  632. r4, r5, r6 :: i64
  633. L0:
  634. r0 = g()
  635. r1 = r0[0]
  636. x = r1
  637. r2 = r0[1]
  638. y = r2
  639. r3 = g()
  640. t = r3
  641. r4 = x + y
  642. r5 = t[0]
  643. r6 = r4 + r5
  644. return r6
  645. [case testI64MixWithTagged1_64bit]
  646. from mypy_extensions import i64
  647. def f(x: i64, y: int) -> i64:
  648. return x + y
  649. [out]
  650. def f(x, y):
  651. x :: i64
  652. y :: int
  653. r0 :: native_int
  654. r1 :: bit
  655. r2, r3 :: i64
  656. r4 :: ptr
  657. r5 :: c_ptr
  658. r6, r7 :: i64
  659. L0:
  660. r0 = y & 1
  661. r1 = r0 == 0
  662. if r1 goto L1 else goto L2 :: bool
  663. L1:
  664. r2 = y >> 1
  665. r3 = r2
  666. goto L3
  667. L2:
  668. r4 = y ^ 1
  669. r5 = r4
  670. r6 = CPyLong_AsInt64(r5)
  671. r3 = r6
  672. keep_alive y
  673. L3:
  674. r7 = x + r3
  675. return r7
  676. [case testI64MixWithTagged2_64bit]
  677. from mypy_extensions import i64
  678. def f(x: int, y: i64) -> i64:
  679. return x + y
  680. [out]
  681. def f(x, y):
  682. x :: int
  683. y :: i64
  684. r0 :: native_int
  685. r1 :: bit
  686. r2, r3 :: i64
  687. r4 :: ptr
  688. r5 :: c_ptr
  689. r6, r7 :: i64
  690. L0:
  691. r0 = x & 1
  692. r1 = r0 == 0
  693. if r1 goto L1 else goto L2 :: bool
  694. L1:
  695. r2 = x >> 1
  696. r3 = r2
  697. goto L3
  698. L2:
  699. r4 = x ^ 1
  700. r5 = r4
  701. r6 = CPyLong_AsInt64(r5)
  702. r3 = r6
  703. keep_alive x
  704. L3:
  705. r7 = r3 + y
  706. return r7
  707. [case testI64MixWithTaggedInPlace1_64bit]
  708. from mypy_extensions import i64
  709. def f(y: i64) -> int:
  710. x = 0
  711. x += y
  712. return x
  713. [out]
  714. def f(y):
  715. y :: i64
  716. x :: int
  717. r0 :: native_int
  718. r1 :: bit
  719. r2, r3 :: i64
  720. r4 :: ptr
  721. r5 :: c_ptr
  722. r6, r7 :: i64
  723. r8, r9 :: bit
  724. r10, r11, r12 :: int
  725. L0:
  726. x = 0
  727. r0 = x & 1
  728. r1 = r0 == 0
  729. if r1 goto L1 else goto L2 :: bool
  730. L1:
  731. r2 = x >> 1
  732. r3 = r2
  733. goto L3
  734. L2:
  735. r4 = x ^ 1
  736. r5 = r4
  737. r6 = CPyLong_AsInt64(r5)
  738. r3 = r6
  739. keep_alive x
  740. L3:
  741. r7 = r3 + y
  742. r8 = r7 <= 4611686018427387903 :: signed
  743. if r8 goto L4 else goto L5 :: bool
  744. L4:
  745. r9 = r7 >= -4611686018427387904 :: signed
  746. if r9 goto L6 else goto L5 :: bool
  747. L5:
  748. r10 = CPyTagged_FromInt64(r7)
  749. r11 = r10
  750. goto L7
  751. L6:
  752. r12 = r7 << 1
  753. r11 = r12
  754. L7:
  755. x = r11
  756. return x
  757. [case testI64MixWithTaggedInPlace2_64bit]
  758. from mypy_extensions import i64
  759. def f(y: int) -> i64:
  760. x: i64 = 0
  761. x += y
  762. return x
  763. [out]
  764. def f(y):
  765. y :: int
  766. x :: i64
  767. r0 :: native_int
  768. r1 :: bit
  769. r2, r3 :: i64
  770. r4 :: ptr
  771. r5 :: c_ptr
  772. r6, r7 :: i64
  773. L0:
  774. x = 0
  775. r0 = y & 1
  776. r1 = r0 == 0
  777. if r1 goto L1 else goto L2 :: bool
  778. L1:
  779. r2 = y >> 1
  780. r3 = r2
  781. goto L3
  782. L2:
  783. r4 = y ^ 1
  784. r5 = r4
  785. r6 = CPyLong_AsInt64(r5)
  786. r3 = r6
  787. keep_alive y
  788. L3:
  789. r7 = x + r3
  790. x = r7
  791. return x
  792. [case testI64MixedCompare1_64bit]
  793. from mypy_extensions import i64
  794. def f(x: int, y: i64) -> bool:
  795. return x == y
  796. [out]
  797. def f(x, y):
  798. x :: int
  799. y :: i64
  800. r0 :: native_int
  801. r1 :: bit
  802. r2, r3 :: i64
  803. r4 :: ptr
  804. r5 :: c_ptr
  805. r6 :: i64
  806. r7 :: bit
  807. L0:
  808. r0 = x & 1
  809. r1 = r0 == 0
  810. if r1 goto L1 else goto L2 :: bool
  811. L1:
  812. r2 = x >> 1
  813. r3 = r2
  814. goto L3
  815. L2:
  816. r4 = x ^ 1
  817. r5 = r4
  818. r6 = CPyLong_AsInt64(r5)
  819. r3 = r6
  820. keep_alive x
  821. L3:
  822. r7 = r3 == y
  823. return r7
  824. [case testI64MixedCompare2_64bit]
  825. from mypy_extensions import i64
  826. def f(x: i64, y: int) -> bool:
  827. return x == y
  828. [out]
  829. def f(x, y):
  830. x :: i64
  831. y :: int
  832. r0 :: native_int
  833. r1 :: bit
  834. r2, r3 :: i64
  835. r4 :: ptr
  836. r5 :: c_ptr
  837. r6 :: i64
  838. r7 :: bit
  839. L0:
  840. r0 = y & 1
  841. r1 = r0 == 0
  842. if r1 goto L1 else goto L2 :: bool
  843. L1:
  844. r2 = y >> 1
  845. r3 = r2
  846. goto L3
  847. L2:
  848. r4 = y ^ 1
  849. r5 = r4
  850. r6 = CPyLong_AsInt64(r5)
  851. r3 = r6
  852. keep_alive y
  853. L3:
  854. r7 = x == r3
  855. return r7
  856. [case testI64MixedCompare_32bit]
  857. from mypy_extensions import i64
  858. def f(x: int, y: i64) -> bool:
  859. return x == y
  860. [out]
  861. def f(x, y):
  862. x :: int
  863. y :: i64
  864. r0 :: native_int
  865. r1 :: bit
  866. r2, r3, r4 :: i64
  867. r5 :: ptr
  868. r6 :: c_ptr
  869. r7 :: i64
  870. r8 :: bit
  871. L0:
  872. r0 = x & 1
  873. r1 = r0 == 0
  874. if r1 goto L1 else goto L2 :: bool
  875. L1:
  876. r2 = extend signed x: builtins.int to i64
  877. r3 = r2 >> 1
  878. r4 = r3
  879. goto L3
  880. L2:
  881. r5 = x ^ 1
  882. r6 = r5
  883. r7 = CPyLong_AsInt64(r6)
  884. r4 = r7
  885. keep_alive x
  886. L3:
  887. r8 = r4 == y
  888. return r8
  889. [case testI64AsBool]
  890. from mypy_extensions import i64
  891. def f(x: i64) -> i64:
  892. if x:
  893. return 5
  894. elif not x:
  895. return 6
  896. return 3
  897. [out]
  898. def f(x):
  899. x :: i64
  900. r0, r1 :: bit
  901. L0:
  902. r0 = x != 0
  903. if r0 goto L1 else goto L2 :: bool
  904. L1:
  905. return 5
  906. L2:
  907. r1 = x != 0
  908. if r1 goto L4 else goto L3 :: bool
  909. L3:
  910. return 6
  911. L4:
  912. L5:
  913. return 3
  914. [case testI64AssignMixed_64bit]
  915. from mypy_extensions import i64
  916. def f(x: i64, y: int) -> i64:
  917. x = y
  918. return x
  919. def g(x: i64, y: int) -> int:
  920. y = x
  921. return y
  922. [out]
  923. def f(x, y):
  924. x :: i64
  925. y :: int
  926. r0 :: native_int
  927. r1 :: bit
  928. r2, r3 :: i64
  929. r4 :: ptr
  930. r5 :: c_ptr
  931. r6 :: i64
  932. L0:
  933. r0 = y & 1
  934. r1 = r0 == 0
  935. if r1 goto L1 else goto L2 :: bool
  936. L1:
  937. r2 = y >> 1
  938. r3 = r2
  939. goto L3
  940. L2:
  941. r4 = y ^ 1
  942. r5 = r4
  943. r6 = CPyLong_AsInt64(r5)
  944. r3 = r6
  945. keep_alive y
  946. L3:
  947. x = r3
  948. return x
  949. def g(x, y):
  950. x :: i64
  951. y :: int
  952. r0, r1 :: bit
  953. r2, r3, r4 :: int
  954. L0:
  955. r0 = x <= 4611686018427387903 :: signed
  956. if r0 goto L1 else goto L2 :: bool
  957. L1:
  958. r1 = x >= -4611686018427387904 :: signed
  959. if r1 goto L3 else goto L2 :: bool
  960. L2:
  961. r2 = CPyTagged_FromInt64(x)
  962. r3 = r2
  963. goto L4
  964. L3:
  965. r4 = x << 1
  966. r3 = r4
  967. L4:
  968. y = r3
  969. return y
  970. [case testBorrowOverI64Arithmetic]
  971. from mypy_extensions import i64
  972. def add_simple(c: C) -> i64:
  973. return c.x + c.y
  974. def inplace_add_simple(c: C) -> None:
  975. c.x += c.y
  976. def add_borrow(d: D) -> i64:
  977. return d.c.x + d.c.y
  978. class D:
  979. c: C
  980. class C:
  981. x: i64
  982. y: i64
  983. [out]
  984. def add_simple(c):
  985. c :: __main__.C
  986. r0, r1, r2 :: i64
  987. L0:
  988. r0 = c.x
  989. r1 = c.y
  990. r2 = r0 + r1
  991. return r2
  992. def inplace_add_simple(c):
  993. c :: __main__.C
  994. r0, r1, r2 :: i64
  995. r3 :: bool
  996. L0:
  997. r0 = c.x
  998. r1 = c.y
  999. r2 = r0 + r1
  1000. c.x = r2; r3 = is_error
  1001. return 1
  1002. def add_borrow(d):
  1003. d :: __main__.D
  1004. r0 :: __main__.C
  1005. r1 :: i64
  1006. r2 :: __main__.C
  1007. r3, r4 :: i64
  1008. L0:
  1009. r0 = borrow d.c
  1010. r1 = r0.x
  1011. r2 = borrow d.c
  1012. r3 = r2.y
  1013. r4 = r1 + r3
  1014. keep_alive d, d
  1015. return r4
  1016. [case testBorrowOverI64Bitwise]
  1017. from mypy_extensions import i64
  1018. def bitwise_simple(c: C) -> i64:
  1019. return c.x | c.y
  1020. def inplace_bitwide_simple(c: C) -> None:
  1021. c.x &= c.y
  1022. def bitwise_borrow(d: D) -> i64:
  1023. return d.c.x ^ d.c.y
  1024. class D:
  1025. c: C
  1026. class C:
  1027. x: i64
  1028. y: i64
  1029. [out]
  1030. def bitwise_simple(c):
  1031. c :: __main__.C
  1032. r0, r1, r2 :: i64
  1033. L0:
  1034. r0 = c.x
  1035. r1 = c.y
  1036. r2 = r0 | r1
  1037. return r2
  1038. def inplace_bitwide_simple(c):
  1039. c :: __main__.C
  1040. r0, r1, r2 :: i64
  1041. r3 :: bool
  1042. L0:
  1043. r0 = c.x
  1044. r1 = c.y
  1045. r2 = r0 & r1
  1046. c.x = r2; r3 = is_error
  1047. return 1
  1048. def bitwise_borrow(d):
  1049. d :: __main__.D
  1050. r0 :: __main__.C
  1051. r1 :: i64
  1052. r2 :: __main__.C
  1053. r3, r4 :: i64
  1054. L0:
  1055. r0 = borrow d.c
  1056. r1 = r0.x
  1057. r2 = borrow d.c
  1058. r3 = r2.y
  1059. r4 = r1 ^ r3
  1060. keep_alive d, d
  1061. return r4
  1062. [case testBorrowOverI64ListGetItem1]
  1063. from mypy_extensions import i64
  1064. def f(n: i64) -> str:
  1065. a = [C()]
  1066. return a[n].s
  1067. class C:
  1068. s: str
  1069. [out]
  1070. def f(n):
  1071. n :: i64
  1072. r0 :: __main__.C
  1073. r1 :: list
  1074. r2, r3 :: ptr
  1075. a :: list
  1076. r4 :: object
  1077. r5 :: __main__.C
  1078. r6 :: str
  1079. L0:
  1080. r0 = C()
  1081. r1 = PyList_New(1)
  1082. r2 = get_element_ptr r1 ob_item :: PyListObject
  1083. r3 = load_mem r2 :: ptr*
  1084. set_mem r3, r0 :: builtins.object*
  1085. keep_alive r1
  1086. a = r1
  1087. r4 = CPyList_GetItemInt64Borrow(a, n)
  1088. r5 = borrow cast(__main__.C, r4)
  1089. r6 = r5.s
  1090. keep_alive a, n, r4
  1091. return r6
  1092. [case testBorrowOverI64ListGetItem2]
  1093. from typing import List
  1094. from mypy_extensions import i64
  1095. def f(a: List[i64], n: i64) -> bool:
  1096. if a[n] == 0:
  1097. return True
  1098. return False
  1099. [out]
  1100. def f(a, n):
  1101. a :: list
  1102. n :: i64
  1103. r0 :: object
  1104. r1 :: i64
  1105. r2 :: bit
  1106. L0:
  1107. r0 = CPyList_GetItemInt64Borrow(a, n)
  1108. r1 = unbox(i64, r0)
  1109. r2 = r1 == 0
  1110. keep_alive a, n
  1111. if r2 goto L1 else goto L2 :: bool
  1112. L1:
  1113. return 1
  1114. L2:
  1115. return 0
  1116. [case testCoerceShortIntToI64]
  1117. from mypy_extensions import i64
  1118. from typing import List
  1119. def f(a: List[i64], y: i64) -> bool:
  1120. if len(a) < y:
  1121. return True
  1122. return False
  1123. def g(a: List[i64], y: i64) -> bool:
  1124. if y < len(a):
  1125. return True
  1126. return False
  1127. [out]
  1128. def f(a, y):
  1129. a :: list
  1130. y :: i64
  1131. r0 :: ptr
  1132. r1 :: native_int
  1133. r2 :: short_int
  1134. r3 :: i64
  1135. r4 :: bit
  1136. L0:
  1137. r0 = get_element_ptr a ob_size :: PyVarObject
  1138. r1 = load_mem r0 :: native_int*
  1139. keep_alive a
  1140. r2 = r1 << 1
  1141. r3 = r2 >> 1
  1142. r4 = r3 < y :: signed
  1143. if r4 goto L1 else goto L2 :: bool
  1144. L1:
  1145. return 1
  1146. L2:
  1147. return 0
  1148. def g(a, y):
  1149. a :: list
  1150. y :: i64
  1151. r0 :: ptr
  1152. r1 :: native_int
  1153. r2 :: short_int
  1154. r3 :: i64
  1155. r4 :: bit
  1156. L0:
  1157. r0 = get_element_ptr a ob_size :: PyVarObject
  1158. r1 = load_mem r0 :: native_int*
  1159. keep_alive a
  1160. r2 = r1 << 1
  1161. r3 = r2 >> 1
  1162. r4 = y < r3 :: signed
  1163. if r4 goto L1 else goto L2 :: bool
  1164. L1:
  1165. return 1
  1166. L2:
  1167. return 0
  1168. [case testMultiplyListByI64_64bit]
  1169. from mypy_extensions import i64
  1170. from typing import List
  1171. def f(n: i64) -> List[i64]:
  1172. return [n] * n
  1173. [out]
  1174. def f(n):
  1175. n :: i64
  1176. r0 :: list
  1177. r1 :: object
  1178. r2, r3 :: ptr
  1179. r4, r5 :: bit
  1180. r6, r7, r8 :: int
  1181. r9 :: list
  1182. L0:
  1183. r0 = PyList_New(1)
  1184. r1 = box(i64, n)
  1185. r2 = get_element_ptr r0 ob_item :: PyListObject
  1186. r3 = load_mem r2 :: ptr*
  1187. set_mem r3, r1 :: builtins.object*
  1188. keep_alive r0
  1189. r4 = n <= 4611686018427387903 :: signed
  1190. if r4 goto L1 else goto L2 :: bool
  1191. L1:
  1192. r5 = n >= -4611686018427387904 :: signed
  1193. if r5 goto L3 else goto L2 :: bool
  1194. L2:
  1195. r6 = CPyTagged_FromInt64(n)
  1196. r7 = r6
  1197. goto L4
  1198. L3:
  1199. r8 = n << 1
  1200. r7 = r8
  1201. L4:
  1202. r9 = CPySequence_Multiply(r0, r7)
  1203. return r9
  1204. [case testShortIntAndI64Op]
  1205. from mypy_extensions import i64
  1206. from typing import List
  1207. def add_i64(a: List[i64], n: i64) -> i64:
  1208. return len(a) + n
  1209. def add_i64_2(a: List[i64], n: i64) -> i64:
  1210. return n + len(a)
  1211. def eq_i64(a: List[i64], n: i64) -> bool:
  1212. if len(a) == n:
  1213. return True
  1214. return False
  1215. def lt_i64(a: List[i64], n: i64) -> bool:
  1216. if n < len(a):
  1217. return True
  1218. return False
  1219. [out]
  1220. def add_i64(a, n):
  1221. a :: list
  1222. n :: i64
  1223. r0 :: ptr
  1224. r1 :: native_int
  1225. r2 :: short_int
  1226. r3, r4 :: i64
  1227. L0:
  1228. r0 = get_element_ptr a ob_size :: PyVarObject
  1229. r1 = load_mem r0 :: native_int*
  1230. keep_alive a
  1231. r2 = r1 << 1
  1232. r3 = r2 >> 1
  1233. r4 = r3 + n
  1234. return r4
  1235. def add_i64_2(a, n):
  1236. a :: list
  1237. n :: i64
  1238. r0 :: ptr
  1239. r1 :: native_int
  1240. r2 :: short_int
  1241. r3, r4 :: i64
  1242. L0:
  1243. r0 = get_element_ptr a ob_size :: PyVarObject
  1244. r1 = load_mem r0 :: native_int*
  1245. keep_alive a
  1246. r2 = r1 << 1
  1247. r3 = r2 >> 1
  1248. r4 = n + r3
  1249. return r4
  1250. def eq_i64(a, n):
  1251. a :: list
  1252. n :: i64
  1253. r0 :: ptr
  1254. r1 :: native_int
  1255. r2 :: short_int
  1256. r3 :: i64
  1257. r4 :: bit
  1258. L0:
  1259. r0 = get_element_ptr a ob_size :: PyVarObject
  1260. r1 = load_mem r0 :: native_int*
  1261. keep_alive a
  1262. r2 = r1 << 1
  1263. r3 = r2 >> 1
  1264. r4 = r3 == n
  1265. if r4 goto L1 else goto L2 :: bool
  1266. L1:
  1267. return 1
  1268. L2:
  1269. return 0
  1270. def lt_i64(a, n):
  1271. a :: list
  1272. n :: i64
  1273. r0 :: ptr
  1274. r1 :: native_int
  1275. r2 :: short_int
  1276. r3 :: i64
  1277. r4 :: bit
  1278. L0:
  1279. r0 = get_element_ptr a ob_size :: PyVarObject
  1280. r1 = load_mem r0 :: native_int*
  1281. keep_alive a
  1282. r2 = r1 << 1
  1283. r3 = r2 >> 1
  1284. r4 = n < r3 :: signed
  1285. if r4 goto L1 else goto L2 :: bool
  1286. L1:
  1287. return 1
  1288. L2:
  1289. return 0
  1290. [case testOptionalI64_64bit]
  1291. from typing import Optional
  1292. from mypy_extensions import i64
  1293. def f(x: Optional[i64]) -> i64:
  1294. if x is None:
  1295. return 1
  1296. return x
  1297. [out]
  1298. def f(x):
  1299. x :: union[i64, None]
  1300. r0 :: object
  1301. r1 :: bit
  1302. r2 :: i64
  1303. L0:
  1304. r0 = load_address _Py_NoneStruct
  1305. r1 = x == r0
  1306. if r1 goto L1 else goto L2 :: bool
  1307. L1:
  1308. return 1
  1309. L2:
  1310. r2 = unbox(i64, x)
  1311. return r2
  1312. [case testI64DefaultValueSingle]
  1313. from mypy_extensions import i64
  1314. def f(x: i64, y: i64 = 0) -> i64:
  1315. return x + y
  1316. def g() -> i64:
  1317. return f(7) + f(8, 9)
  1318. [out]
  1319. def f(x, y, __bitmap):
  1320. x, y :: i64
  1321. __bitmap, r0 :: u32
  1322. r1 :: bit
  1323. r2 :: i64
  1324. L0:
  1325. r0 = __bitmap & 1
  1326. r1 = r0 == 0
  1327. if r1 goto L1 else goto L2 :: bool
  1328. L1:
  1329. y = 0
  1330. L2:
  1331. r2 = x + y
  1332. return r2
  1333. def g():
  1334. r0, r1, r2 :: i64
  1335. L0:
  1336. r0 = f(7, 0, 0)
  1337. r1 = f(8, 9, 1)
  1338. r2 = r0 + r1
  1339. return r2
  1340. [case testI64DefaultValueWithMultipleArgs]
  1341. from mypy_extensions import i64
  1342. def f(a: i64, b: i64 = 1, c: int = 2, d: i64 = 3) -> i64:
  1343. return 0
  1344. def g() -> i64:
  1345. return f(7) + f(8, 9) + f(1, 2, 3) + f(4, 5, 6, 7)
  1346. [out]
  1347. def f(a, b, c, d, __bitmap):
  1348. a, b :: i64
  1349. c :: int
  1350. d :: i64
  1351. __bitmap, r0 :: u32
  1352. r1 :: bit
  1353. r2 :: u32
  1354. r3 :: bit
  1355. L0:
  1356. r0 = __bitmap & 1
  1357. r1 = r0 == 0
  1358. if r1 goto L1 else goto L2 :: bool
  1359. L1:
  1360. b = 1
  1361. L2:
  1362. if is_error(c) goto L3 else goto L4
  1363. L3:
  1364. c = 4
  1365. L4:
  1366. r2 = __bitmap & 2
  1367. r3 = r2 == 0
  1368. if r3 goto L5 else goto L6 :: bool
  1369. L5:
  1370. d = 3
  1371. L6:
  1372. return 0
  1373. def g():
  1374. r0 :: int
  1375. r1 :: i64
  1376. r2 :: int
  1377. r3, r4, r5, r6, r7, r8 :: i64
  1378. L0:
  1379. r0 = <error> :: int
  1380. r1 = f(7, 0, r0, 0, 0)
  1381. r2 = <error> :: int
  1382. r3 = f(8, 9, r2, 0, 1)
  1383. r4 = r1 + r3
  1384. r5 = f(1, 2, 6, 0, 1)
  1385. r6 = r4 + r5
  1386. r7 = f(4, 5, 12, 7, 3)
  1387. r8 = r6 + r7
  1388. return r8
  1389. [case testI64MethodDefaultValue]
  1390. from mypy_extensions import i64
  1391. class C:
  1392. def m(self, x: i64 = 5) -> None:
  1393. pass
  1394. def f(c: C) -> None:
  1395. c.m()
  1396. c.m(6)
  1397. [out]
  1398. def C.m(self, x, __bitmap):
  1399. self :: __main__.C
  1400. x :: i64
  1401. __bitmap, r0 :: u32
  1402. r1 :: bit
  1403. L0:
  1404. r0 = __bitmap & 1
  1405. r1 = r0 == 0
  1406. if r1 goto L1 else goto L2 :: bool
  1407. L1:
  1408. x = 5
  1409. L2:
  1410. return 1
  1411. def f(c):
  1412. c :: __main__.C
  1413. r0, r1 :: None
  1414. L0:
  1415. r0 = c.m(0, 0)
  1416. r1 = c.m(6, 1)
  1417. return 1
  1418. [case testI64ExplicitConversionFromNativeInt]
  1419. from mypy_extensions import i64, i32, i16
  1420. def from_i16(x: i16) -> i64:
  1421. return i64(x)
  1422. def from_i32(x: i32) -> i64:
  1423. return i64(x)
  1424. def from_i64(x: i64) -> i64:
  1425. return i64(x)
  1426. [out]
  1427. def from_i16(x):
  1428. x :: i16
  1429. r0 :: i64
  1430. L0:
  1431. r0 = extend signed x: i16 to i64
  1432. return r0
  1433. def from_i32(x):
  1434. x :: i32
  1435. r0 :: i64
  1436. L0:
  1437. r0 = extend signed x: i32 to i64
  1438. return r0
  1439. def from_i64(x):
  1440. x :: i64
  1441. L0:
  1442. return x
  1443. [case testI64ExplicitConversionFromInt_64bit]
  1444. from mypy_extensions import i64
  1445. def f(x: int) -> i64:
  1446. return i64(x)
  1447. [out]
  1448. def f(x):
  1449. x :: int
  1450. r0 :: native_int
  1451. r1 :: bit
  1452. r2, r3 :: i64
  1453. r4 :: ptr
  1454. r5 :: c_ptr
  1455. r6 :: i64
  1456. L0:
  1457. r0 = x & 1
  1458. r1 = r0 == 0
  1459. if r1 goto L1 else goto L2 :: bool
  1460. L1:
  1461. r2 = x >> 1
  1462. r3 = r2
  1463. goto L3
  1464. L2:
  1465. r4 = x ^ 1
  1466. r5 = r4
  1467. r6 = CPyLong_AsInt64(r5)
  1468. r3 = r6
  1469. keep_alive x
  1470. L3:
  1471. return r3
  1472. [case testI64ExplicitConversionToInt_64bit]
  1473. from mypy_extensions import i64
  1474. def f(x: i64) -> int:
  1475. return int(x)
  1476. [out]
  1477. def f(x):
  1478. x :: i64
  1479. r0, r1 :: bit
  1480. r2, r3, r4 :: int
  1481. L0:
  1482. r0 = x <= 4611686018427387903 :: signed
  1483. if r0 goto L1 else goto L2 :: bool
  1484. L1:
  1485. r1 = x >= -4611686018427387904 :: signed
  1486. if r1 goto L3 else goto L2 :: bool
  1487. L2:
  1488. r2 = CPyTagged_FromInt64(x)
  1489. r3 = r2
  1490. goto L4
  1491. L3:
  1492. r4 = x << 1
  1493. r3 = r4
  1494. L4:
  1495. return r3
  1496. [case testI64ExplicitConversionFromLiteral]
  1497. from mypy_extensions import i64
  1498. def f() -> None:
  1499. x = i64(0)
  1500. y = i64(11)
  1501. z = i64(-3)
  1502. [out]
  1503. def f():
  1504. x, y, z :: i64
  1505. L0:
  1506. x = 0
  1507. y = 11
  1508. z = -3
  1509. return 1
  1510. [case testI64ForLoopOverRange]
  1511. from mypy_extensions import i64
  1512. def f() -> None:
  1513. for x in range(i64(4)):
  1514. y = x
  1515. [out]
  1516. def f():
  1517. r0, x :: i64
  1518. r1 :: bit
  1519. y, r2 :: i64
  1520. L0:
  1521. r0 = 0
  1522. x = r0
  1523. L1:
  1524. r1 = r0 < 4 :: signed
  1525. if r1 goto L2 else goto L4 :: bool
  1526. L2:
  1527. y = x
  1528. L3:
  1529. r2 = r0 + 1
  1530. r0 = r2
  1531. x = r2
  1532. goto L1
  1533. L4:
  1534. return 1
  1535. [case testI64ForLoopOverRange2]
  1536. from mypy_extensions import i64
  1537. def f() -> None:
  1538. for x in range(0, i64(4)):
  1539. y = x
  1540. [out]
  1541. def f():
  1542. r0, x :: i64
  1543. r1 :: bit
  1544. y, r2 :: i64
  1545. L0:
  1546. r0 = 0
  1547. x = r0
  1548. L1:
  1549. r1 = r0 < 4 :: signed
  1550. if r1 goto L2 else goto L4 :: bool
  1551. L2:
  1552. y = x
  1553. L3:
  1554. r2 = r0 + 1
  1555. r0 = r2
  1556. x = r2
  1557. goto L1
  1558. L4:
  1559. return 1
  1560. [case testI64MethodDefaultValueOverride]
  1561. from mypy_extensions import i64
  1562. class C:
  1563. def f(self, x: i64 = 11) -> None: pass
  1564. class D(C):
  1565. def f(self, x: i64 = 12) -> None: pass
  1566. [out]
  1567. def C.f(self, x, __bitmap):
  1568. self :: __main__.C
  1569. x :: i64
  1570. __bitmap, r0 :: u32
  1571. r1 :: bit
  1572. L0:
  1573. r0 = __bitmap & 1
  1574. r1 = r0 == 0
  1575. if r1 goto L1 else goto L2 :: bool
  1576. L1:
  1577. x = 11
  1578. L2:
  1579. return 1
  1580. def D.f(self, x, __bitmap):
  1581. self :: __main__.D
  1582. x :: i64
  1583. __bitmap, r0 :: u32
  1584. r1 :: bit
  1585. L0:
  1586. r0 = __bitmap & 1
  1587. r1 = r0 == 0
  1588. if r1 goto L1 else goto L2 :: bool
  1589. L1:
  1590. x = 12
  1591. L2:
  1592. return 1
  1593. [case testI64FinalConstants]
  1594. from typing_extensions import Final
  1595. from mypy_extensions import i64
  1596. A: Final = -1
  1597. B: Final = -(1 + 3*2)
  1598. C: Final = 0
  1599. D: Final = A - B
  1600. E: Final[i64] = 1 + 3
  1601. def f1() -> i64:
  1602. return A
  1603. def f2() -> i64:
  1604. return A + B
  1605. def f3() -> i64:
  1606. return C
  1607. def f4() -> i64:
  1608. return D
  1609. def f5() -> i64:
  1610. return E
  1611. [out]
  1612. def f1():
  1613. L0:
  1614. return -1
  1615. def f2():
  1616. L0:
  1617. return -8
  1618. def f3():
  1619. L0:
  1620. return 0
  1621. def f4():
  1622. L0:
  1623. return 6
  1624. def f5():
  1625. L0:
  1626. return 4
  1627. [case testI64OperationsWithBools]
  1628. from mypy_extensions import i64
  1629. # TODO: Other mixed operations
  1630. def add_bool_to_int(n: i64, b: bool) -> i64:
  1631. return n + b
  1632. def compare_bool_to_i64(n: i64, b: bool) -> bool:
  1633. if n == b:
  1634. return b != n
  1635. return True
  1636. [out]
  1637. def add_bool_to_int(n, b):
  1638. n :: i64
  1639. b :: bool
  1640. r0, r1 :: i64
  1641. L0:
  1642. r0 = extend b: builtins.bool to i64
  1643. r1 = n + r0
  1644. return r1
  1645. def compare_bool_to_i64(n, b):
  1646. n :: i64
  1647. b :: bool
  1648. r0 :: i64
  1649. r1 :: bit
  1650. r2 :: i64
  1651. r3 :: bit
  1652. L0:
  1653. r0 = extend b: builtins.bool to i64
  1654. r1 = n == r0
  1655. if r1 goto L1 else goto L2 :: bool
  1656. L1:
  1657. r2 = extend b: builtins.bool to i64
  1658. r3 = r2 != n
  1659. return r3
  1660. L2:
  1661. return 1
  1662. [case testI64Cast_64bit]
  1663. from typing import cast
  1664. from mypy_extensions import i64
  1665. def cast_object(o: object) -> i64:
  1666. return cast(i64, o)
  1667. def cast_int(x: int) -> i64:
  1668. return cast(i64, x)
  1669. [out]
  1670. def cast_object(o):
  1671. o :: object
  1672. r0 :: i64
  1673. L0:
  1674. r0 = unbox(i64, o)
  1675. return r0
  1676. def cast_int(x):
  1677. x :: int
  1678. r0 :: native_int
  1679. r1 :: bit
  1680. r2, r3 :: i64
  1681. r4 :: ptr
  1682. r5 :: c_ptr
  1683. r6 :: i64
  1684. L0:
  1685. r0 = x & 1
  1686. r1 = r0 == 0
  1687. if r1 goto L1 else goto L2 :: bool
  1688. L1:
  1689. r2 = x >> 1
  1690. r3 = r2
  1691. goto L3
  1692. L2:
  1693. r4 = x ^ 1
  1694. r5 = r4
  1695. r6 = CPyLong_AsInt64(r5)
  1696. r3 = r6
  1697. keep_alive x
  1698. L3:
  1699. return r3
  1700. [case testI64Cast_32bit]
  1701. from typing import cast
  1702. from mypy_extensions import i64
  1703. def cast_int(x: int) -> i64:
  1704. return cast(i64, x)
  1705. [out]
  1706. def cast_int(x):
  1707. x :: int
  1708. r0 :: native_int
  1709. r1 :: bit
  1710. r2, r3, r4 :: i64
  1711. r5 :: ptr
  1712. r6 :: c_ptr
  1713. r7 :: i64
  1714. L0:
  1715. r0 = x & 1
  1716. r1 = r0 == 0
  1717. if r1 goto L1 else goto L2 :: bool
  1718. L1:
  1719. r2 = extend signed x: builtins.int to i64
  1720. r3 = r2 >> 1
  1721. r4 = r3
  1722. goto L3
  1723. L2:
  1724. r5 = x ^ 1
  1725. r6 = r5
  1726. r7 = CPyLong_AsInt64(r6)
  1727. r4 = r7
  1728. keep_alive x
  1729. L3:
  1730. return r4
  1731. [case testI64ExplicitConversionFromVariousTypes_64bit]
  1732. from mypy_extensions import i64
  1733. def bool_to_i64(b: bool) -> i64:
  1734. return i64(b)
  1735. def str_to_i64(s: str) -> i64:
  1736. return i64(s)
  1737. def str_to_i64_with_base(s: str) -> i64:
  1738. return i64(s, 2)
  1739. class C:
  1740. def __int__(self) -> i64:
  1741. return 5
  1742. def instance_to_i64(c: C) -> i64:
  1743. return i64(c)
  1744. def float_to_i64(x: float) -> i64:
  1745. return i64(x)
  1746. [out]
  1747. def bool_to_i64(b):
  1748. b :: bool
  1749. r0 :: i64
  1750. L0:
  1751. r0 = extend b: builtins.bool to i64
  1752. return r0
  1753. def str_to_i64(s):
  1754. s :: str
  1755. r0 :: object
  1756. r1 :: i64
  1757. L0:
  1758. r0 = CPyLong_FromStr(s)
  1759. r1 = unbox(i64, r0)
  1760. return r1
  1761. def str_to_i64_with_base(s):
  1762. s :: str
  1763. r0 :: object
  1764. r1 :: i64
  1765. L0:
  1766. r0 = CPyLong_FromStrWithBase(s, 4)
  1767. r1 = unbox(i64, r0)
  1768. return r1
  1769. def C.__int__(self):
  1770. self :: __main__.C
  1771. L0:
  1772. return 5
  1773. def instance_to_i64(c):
  1774. c :: __main__.C
  1775. r0 :: i64
  1776. L0:
  1777. r0 = c.__int__()
  1778. return r0
  1779. def float_to_i64(x):
  1780. x :: float
  1781. r0 :: int
  1782. r1 :: native_int
  1783. r2 :: bit
  1784. r3, r4 :: i64
  1785. r5 :: ptr
  1786. r6 :: c_ptr
  1787. r7 :: i64
  1788. L0:
  1789. r0 = CPyTagged_FromFloat(x)
  1790. r1 = r0 & 1
  1791. r2 = r1 == 0
  1792. if r2 goto L1 else goto L2 :: bool
  1793. L1:
  1794. r3 = r0 >> 1
  1795. r4 = r3
  1796. goto L3
  1797. L2:
  1798. r5 = r0 ^ 1
  1799. r6 = r5
  1800. r7 = CPyLong_AsInt64(r6)
  1801. r4 = r7
  1802. keep_alive r0
  1803. L3:
  1804. return r4
  1805. [case testI64ExplicitConversionFromFloat_32bit]
  1806. from mypy_extensions import i64
  1807. def float_to_i64(x: float) -> i64:
  1808. return i64(x)
  1809. [out]
  1810. def float_to_i64(x):
  1811. x :: float
  1812. r0 :: int
  1813. r1 :: native_int
  1814. r2 :: bit
  1815. r3, r4, r5 :: i64
  1816. r6 :: ptr
  1817. r7 :: c_ptr
  1818. r8 :: i64
  1819. L0:
  1820. r0 = CPyTagged_FromFloat(x)
  1821. r1 = r0 & 1
  1822. r2 = r1 == 0
  1823. if r2 goto L1 else goto L2 :: bool
  1824. L1:
  1825. r3 = extend signed r0: builtins.int to i64
  1826. r4 = r3 >> 1
  1827. r5 = r4
  1828. goto L3
  1829. L2:
  1830. r6 = r0 ^ 1
  1831. r7 = r6
  1832. r8 = CPyLong_AsInt64(r7)
  1833. r5 = r8
  1834. keep_alive r0
  1835. L3:
  1836. return r5
  1837. [case testI64ConvertToFloat_64bit]
  1838. from mypy_extensions import i64
  1839. def i64_to_float(x: i64) -> float:
  1840. return float(x)
  1841. [out]
  1842. def i64_to_float(x):
  1843. x :: i64
  1844. r0, r1 :: bit
  1845. r2, r3, r4 :: int
  1846. r5 :: float
  1847. L0:
  1848. r0 = x <= 4611686018427387903 :: signed
  1849. if r0 goto L1 else goto L2 :: bool
  1850. L1:
  1851. r1 = x >= -4611686018427387904 :: signed
  1852. if r1 goto L3 else goto L2 :: bool
  1853. L2:
  1854. r2 = CPyTagged_FromInt64(x)
  1855. r3 = r2
  1856. goto L4
  1857. L3:
  1858. r4 = x << 1
  1859. r3 = r4
  1860. L4:
  1861. r5 = CPyFloat_FromTagged(r3)
  1862. return r5
  1863. [case testI64ConvertToFloat_32bit]
  1864. from mypy_extensions import i64
  1865. def i64_to_float(x: i64) -> float:
  1866. return float(x)
  1867. [out]
  1868. def i64_to_float(x):
  1869. x :: i64
  1870. r0, r1 :: bit
  1871. r2, r3 :: int
  1872. r4 :: native_int
  1873. r5 :: int
  1874. r6 :: float
  1875. L0:
  1876. r0 = x <= 1073741823 :: signed
  1877. if r0 goto L1 else goto L2 :: bool
  1878. L1:
  1879. r1 = x >= -1073741824 :: signed
  1880. if r1 goto L3 else goto L2 :: bool
  1881. L2:
  1882. r2 = CPyTagged_FromInt64(x)
  1883. r3 = r2
  1884. goto L4
  1885. L3:
  1886. r4 = truncate x: i64 to native_int
  1887. r5 = r4 << 1
  1888. r3 = r5
  1889. L4:
  1890. r6 = CPyFloat_FromTagged(r3)
  1891. return r6
  1892. [case testI64IsinstanceNarrowing]
  1893. from typing import Union
  1894. from mypy_extensions import i64
  1895. class C:
  1896. a: i64
  1897. def narrow1(x: Union[C, i64]) -> i64:
  1898. if isinstance(x, i64):
  1899. return x
  1900. return x.a
  1901. def narrow2(x: Union[C, i64]) -> i64:
  1902. if isinstance(x, int):
  1903. return x
  1904. return x.a
  1905. [out]
  1906. def narrow1(x):
  1907. x :: union[__main__.C, i64]
  1908. r0 :: object
  1909. r1 :: i32
  1910. r2 :: bit
  1911. r3 :: bool
  1912. r4 :: i64
  1913. r5 :: __main__.C
  1914. r6 :: i64
  1915. L0:
  1916. r0 = load_address PyLong_Type
  1917. r1 = PyObject_IsInstance(x, r0)
  1918. r2 = r1 >= 0 :: signed
  1919. r3 = truncate r1: i32 to builtins.bool
  1920. if r3 goto L1 else goto L2 :: bool
  1921. L1:
  1922. r4 = unbox(i64, x)
  1923. return r4
  1924. L2:
  1925. r5 = borrow cast(__main__.C, x)
  1926. r6 = r5.a
  1927. keep_alive x
  1928. return r6
  1929. def narrow2(x):
  1930. x :: union[__main__.C, i64]
  1931. r0 :: object
  1932. r1 :: i32
  1933. r2 :: bit
  1934. r3 :: bool
  1935. r4 :: i64
  1936. r5 :: __main__.C
  1937. r6 :: i64
  1938. L0:
  1939. r0 = load_address PyLong_Type
  1940. r1 = PyObject_IsInstance(x, r0)
  1941. r2 = r1 >= 0 :: signed
  1942. r3 = truncate r1: i32 to builtins.bool
  1943. if r3 goto L1 else goto L2 :: bool
  1944. L1:
  1945. r4 = unbox(i64, x)
  1946. return r4
  1947. L2:
  1948. r5 = borrow cast(__main__.C, x)
  1949. r6 = r5.a
  1950. keep_alive x
  1951. return r6
  1952. [case testI64ConvertBetweenTuples_64bit]
  1953. from __future__ import annotations
  1954. from mypy_extensions import i64
  1955. def f(t: tuple[int, i64, int]) -> None:
  1956. tt: tuple[int, i64, i64] = t
  1957. def g(n: int) -> None:
  1958. t: tuple[i64, i64] = (1, n)
  1959. [out]
  1960. def f(t):
  1961. t :: tuple[int, i64, int]
  1962. r0 :: int
  1963. r1 :: i64
  1964. r2 :: int
  1965. r3 :: native_int
  1966. r4 :: bit
  1967. r5, r6 :: i64
  1968. r7 :: ptr
  1969. r8 :: c_ptr
  1970. r9 :: i64
  1971. r10, tt :: tuple[int, i64, i64]
  1972. L0:
  1973. r0 = t[0]
  1974. r1 = t[1]
  1975. r2 = t[2]
  1976. r3 = r2 & 1
  1977. r4 = r3 == 0
  1978. if r4 goto L1 else goto L2 :: bool
  1979. L1:
  1980. r5 = r2 >> 1
  1981. r6 = r5
  1982. goto L3
  1983. L2:
  1984. r7 = r2 ^ 1
  1985. r8 = r7
  1986. r9 = CPyLong_AsInt64(r8)
  1987. r6 = r9
  1988. keep_alive r2
  1989. L3:
  1990. r10 = (r0, r1, r6)
  1991. tt = r10
  1992. return 1
  1993. def g(n):
  1994. n :: int
  1995. r0 :: tuple[int, int]
  1996. r1 :: int
  1997. r2 :: native_int
  1998. r3 :: bit
  1999. r4, r5 :: i64
  2000. r6 :: ptr
  2001. r7 :: c_ptr
  2002. r8 :: i64
  2003. r9, t :: tuple[i64, i64]
  2004. L0:
  2005. r0 = (2, n)
  2006. r1 = r0[1]
  2007. r2 = r1 & 1
  2008. r3 = r2 == 0
  2009. if r3 goto L1 else goto L2 :: bool
  2010. L1:
  2011. r4 = r1 >> 1
  2012. r5 = r4
  2013. goto L3
  2014. L2:
  2015. r6 = r1 ^ 1
  2016. r7 = r6
  2017. r8 = CPyLong_AsInt64(r7)
  2018. r5 = r8
  2019. keep_alive r1
  2020. L3:
  2021. r9 = (1, r5)
  2022. t = r9
  2023. return 1