irbuild-classes.test 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303
  1. [case testGetAttribute]
  2. class A:
  3. x: int
  4. def f(a: A) -> int:
  5. return a.x
  6. [out]
  7. def f(a):
  8. a :: __main__.A
  9. r0 :: int
  10. L0:
  11. r0 = a.x
  12. return r0
  13. [case testSetAttribute]
  14. class A:
  15. x: int
  16. def f(a: A) -> None:
  17. a.x = 1
  18. [out]
  19. def f(a):
  20. a :: __main__.A
  21. r0 :: bool
  22. L0:
  23. a.x = 2; r0 = is_error
  24. return 1
  25. [case testUserClassInList]
  26. class C:
  27. x: int
  28. def f() -> int:
  29. c = C()
  30. c.x = 5
  31. a = [c]
  32. d = a[0]
  33. return d.x + 1
  34. [out]
  35. def f():
  36. r0, c :: __main__.C
  37. r1 :: bool
  38. r2 :: list
  39. r3, r4 :: ptr
  40. a :: list
  41. r5 :: object
  42. r6, d :: __main__.C
  43. r7, r8 :: int
  44. L0:
  45. r0 = C()
  46. c = r0
  47. c.x = 10; r1 = is_error
  48. r2 = PyList_New(1)
  49. r3 = get_element_ptr r2 ob_item :: PyListObject
  50. r4 = load_mem r3 :: ptr*
  51. set_mem r4, c :: builtins.object*
  52. keep_alive r2
  53. a = r2
  54. r5 = CPyList_GetItemShort(a, 0)
  55. r6 = cast(__main__.C, r5)
  56. d = r6
  57. r7 = borrow d.x
  58. r8 = CPyTagged_Add(r7, 2)
  59. keep_alive d
  60. return r8
  61. [case testMethodCall]
  62. class A:
  63. def f(self, x: int, y: str) -> int:
  64. return x + 10
  65. def g(a: A) -> None:
  66. a.f(1, 'hi')
  67. [out]
  68. def A.f(self, x, y):
  69. self :: __main__.A
  70. x :: int
  71. y :: str
  72. r0 :: int
  73. L0:
  74. r0 = CPyTagged_Add(x, 20)
  75. return r0
  76. def g(a):
  77. a :: __main__.A
  78. r0 :: str
  79. r1 :: int
  80. L0:
  81. r0 = 'hi'
  82. r1 = a.f(2, r0)
  83. return 1
  84. [case testForwardUse]
  85. def g(a: A) -> int:
  86. return a.n
  87. class A:
  88. n : int
  89. [out]
  90. def g(a):
  91. a :: __main__.A
  92. r0 :: int
  93. L0:
  94. r0 = a.n
  95. return r0
  96. [case testOptionalMember]
  97. from typing import Optional
  98. class Node:
  99. next: Optional[Node]
  100. def length(self) -> int:
  101. if self.next is not None:
  102. return 1 + self.next.length()
  103. return 1
  104. [out]
  105. def Node.length(self):
  106. self :: __main__.Node
  107. r0 :: union[__main__.Node, None]
  108. r1 :: object
  109. r2 :: bit
  110. r3 :: union[__main__.Node, None]
  111. r4 :: __main__.Node
  112. r5, r6 :: int
  113. L0:
  114. r0 = borrow self.next
  115. r1 = load_address _Py_NoneStruct
  116. r2 = r0 != r1
  117. keep_alive self
  118. if r2 goto L1 else goto L2 :: bool
  119. L1:
  120. r3 = self.next
  121. r4 = cast(__main__.Node, r3)
  122. r5 = r4.length()
  123. r6 = CPyTagged_Add(2, r5)
  124. return r6
  125. L2:
  126. return 2
  127. [case testSubclass]
  128. class A:
  129. def __init__(self) -> None:
  130. self.x = 10
  131. class B(A):
  132. def __init__(self) -> None:
  133. self.x = 20
  134. self.y = 30
  135. [out]
  136. def A.__init__(self):
  137. self :: __main__.A
  138. L0:
  139. self.x = 20
  140. return 1
  141. def B.__init__(self):
  142. self :: __main__.B
  143. L0:
  144. self.x = 40
  145. self.y = 60
  146. return 1
  147. [case testAttrLvalue]
  148. class O(object):
  149. def __init__(self) -> None:
  150. self.x = 1
  151. def increment(o: O) -> O:
  152. o.x += 1
  153. return o
  154. [out]
  155. def O.__init__(self):
  156. self :: __main__.O
  157. L0:
  158. self.x = 2
  159. return 1
  160. def increment(o):
  161. o :: __main__.O
  162. r0, r1 :: int
  163. r2 :: bool
  164. L0:
  165. r0 = borrow o.x
  166. r1 = CPyTagged_Add(r0, 2)
  167. o.x = r1; r2 = is_error
  168. return o
  169. [case testSubclass_toplevel]
  170. from typing import TypeVar, Generic
  171. from mypy_extensions import trait
  172. T = TypeVar('T')
  173. class C:
  174. pass
  175. @trait
  176. class S:
  177. pass
  178. class D(C, S, Generic[T]):
  179. pass
  180. [out]
  181. def __top_level__():
  182. r0, r1 :: object
  183. r2 :: bit
  184. r3 :: str
  185. r4, r5 :: object
  186. r6 :: str
  187. r7 :: dict
  188. r8, r9 :: object
  189. r10 :: str
  190. r11 :: dict
  191. r12 :: object
  192. r13 :: str
  193. r14 :: dict
  194. r15 :: str
  195. r16, r17 :: object
  196. r18 :: dict
  197. r19 :: str
  198. r20 :: int32
  199. r21 :: bit
  200. r22 :: object
  201. r23 :: str
  202. r24, r25 :: object
  203. r26 :: bool
  204. r27 :: str
  205. r28 :: tuple
  206. r29 :: int32
  207. r30 :: bit
  208. r31 :: dict
  209. r32 :: str
  210. r33 :: int32
  211. r34 :: bit
  212. r35 :: object
  213. r36 :: str
  214. r37, r38 :: object
  215. r39 :: str
  216. r40 :: tuple
  217. r41 :: int32
  218. r42 :: bit
  219. r43 :: dict
  220. r44 :: str
  221. r45 :: int32
  222. r46 :: bit
  223. r47, r48 :: object
  224. r49 :: dict
  225. r50 :: str
  226. r51 :: object
  227. r52 :: dict
  228. r53 :: str
  229. r54, r55 :: object
  230. r56 :: tuple
  231. r57 :: str
  232. r58, r59 :: object
  233. r60 :: bool
  234. r61, r62 :: str
  235. r63 :: tuple
  236. r64 :: int32
  237. r65 :: bit
  238. r66 :: dict
  239. r67 :: str
  240. r68 :: int32
  241. r69 :: bit
  242. L0:
  243. r0 = builtins :: module
  244. r1 = load_address _Py_NoneStruct
  245. r2 = r0 != r1
  246. if r2 goto L2 else goto L1 :: bool
  247. L1:
  248. r3 = 'builtins'
  249. r4 = PyImport_Import(r3)
  250. builtins = r4 :: module
  251. L2:
  252. r5 = ('TypeVar', 'Generic')
  253. r6 = 'typing'
  254. r7 = __main__.globals :: static
  255. r8 = CPyImport_ImportFromMany(r6, r5, r5, r7)
  256. typing = r8 :: module
  257. r9 = ('trait',)
  258. r10 = 'mypy_extensions'
  259. r11 = __main__.globals :: static
  260. r12 = CPyImport_ImportFromMany(r10, r9, r9, r11)
  261. mypy_extensions = r12 :: module
  262. r13 = 'T'
  263. r14 = __main__.globals :: static
  264. r15 = 'TypeVar'
  265. r16 = CPyDict_GetItem(r14, r15)
  266. r17 = PyObject_CallFunctionObjArgs(r16, r13, 0)
  267. r18 = __main__.globals :: static
  268. r19 = 'T'
  269. r20 = CPyDict_SetItem(r18, r19, r17)
  270. r21 = r20 >= 0 :: signed
  271. r22 = <error> :: object
  272. r23 = '__main__'
  273. r24 = __main__.C_template :: type
  274. r25 = CPyType_FromTemplate(r24, r22, r23)
  275. r26 = C_trait_vtable_setup()
  276. r27 = '__mypyc_attrs__'
  277. r28 = PyTuple_Pack(0)
  278. r29 = PyObject_SetAttr(r25, r27, r28)
  279. r30 = r29 >= 0 :: signed
  280. __main__.C = r25 :: type
  281. r31 = __main__.globals :: static
  282. r32 = 'C'
  283. r33 = CPyDict_SetItem(r31, r32, r25)
  284. r34 = r33 >= 0 :: signed
  285. r35 = <error> :: object
  286. r36 = '__main__'
  287. r37 = __main__.S_template :: type
  288. r38 = CPyType_FromTemplate(r37, r35, r36)
  289. r39 = '__mypyc_attrs__'
  290. r40 = PyTuple_Pack(0)
  291. r41 = PyObject_SetAttr(r38, r39, r40)
  292. r42 = r41 >= 0 :: signed
  293. __main__.S = r38 :: type
  294. r43 = __main__.globals :: static
  295. r44 = 'S'
  296. r45 = CPyDict_SetItem(r43, r44, r38)
  297. r46 = r45 >= 0 :: signed
  298. r47 = __main__.C :: type
  299. r48 = __main__.S :: type
  300. r49 = __main__.globals :: static
  301. r50 = 'Generic'
  302. r51 = CPyDict_GetItem(r49, r50)
  303. r52 = __main__.globals :: static
  304. r53 = 'T'
  305. r54 = CPyDict_GetItem(r52, r53)
  306. r55 = PyObject_GetItem(r51, r54)
  307. r56 = PyTuple_Pack(3, r47, r48, r55)
  308. r57 = '__main__'
  309. r58 = __main__.D_template :: type
  310. r59 = CPyType_FromTemplate(r58, r56, r57)
  311. r60 = D_trait_vtable_setup()
  312. r61 = '__mypyc_attrs__'
  313. r62 = '__dict__'
  314. r63 = PyTuple_Pack(1, r62)
  315. r64 = PyObject_SetAttr(r59, r61, r63)
  316. r65 = r64 >= 0 :: signed
  317. __main__.D = r59 :: type
  318. r66 = __main__.globals :: static
  319. r67 = 'D'
  320. r68 = CPyDict_SetItem(r66, r67, r59)
  321. r69 = r68 >= 0 :: signed
  322. return 1
  323. [case testIsInstance]
  324. class A: pass
  325. class B(A): pass
  326. def f(x: A) -> B:
  327. if isinstance(x, B):
  328. return x
  329. return B()
  330. [out]
  331. def f(x):
  332. x :: __main__.A
  333. r0 :: object
  334. r1 :: ptr
  335. r2 :: object
  336. r3 :: bit
  337. r4, r5 :: __main__.B
  338. L0:
  339. r0 = __main__.B :: type
  340. r1 = get_element_ptr x ob_type :: PyObject
  341. r2 = load_mem r1 :: builtins.object*
  342. keep_alive x
  343. r3 = r2 == r0
  344. if r3 goto L1 else goto L2 :: bool
  345. L1:
  346. r4 = cast(__main__.B, x)
  347. return r4
  348. L2:
  349. r5 = B()
  350. return r5
  351. [case testIsInstanceTuple]
  352. from typing import Union
  353. class R: pass
  354. class A(R): pass
  355. class B(R): pass
  356. class C(R): pass
  357. def f(x: R) -> Union[A, B]:
  358. if isinstance(x, (A, B)):
  359. return x
  360. return A()
  361. [out]
  362. def f(x):
  363. x :: __main__.R
  364. r0 :: object
  365. r1 :: ptr
  366. r2 :: object
  367. r3 :: bit
  368. r4 :: bool
  369. r5 :: object
  370. r6 :: ptr
  371. r7 :: object
  372. r8 :: bit
  373. r9 :: union[__main__.A, __main__.B]
  374. r10 :: __main__.A
  375. L0:
  376. r0 = __main__.A :: type
  377. r1 = get_element_ptr x ob_type :: PyObject
  378. r2 = load_mem r1 :: builtins.object*
  379. keep_alive x
  380. r3 = r2 == r0
  381. if r3 goto L1 else goto L2 :: bool
  382. L1:
  383. r4 = r3
  384. goto L3
  385. L2:
  386. r5 = __main__.B :: type
  387. r6 = get_element_ptr x ob_type :: PyObject
  388. r7 = load_mem r6 :: builtins.object*
  389. keep_alive x
  390. r8 = r7 == r5
  391. r4 = r8
  392. L3:
  393. if r4 goto L4 else goto L5 :: bool
  394. L4:
  395. r9 = cast(union[__main__.A, __main__.B], x)
  396. return r9
  397. L5:
  398. r10 = A()
  399. return r10
  400. [case testIsInstanceFewSubclasses]
  401. class R: pass
  402. class A(R): pass
  403. def f(x: object) -> R:
  404. if isinstance(x, R):
  405. return x
  406. return A()
  407. [out]
  408. def f(x):
  409. x, r0 :: object
  410. r1 :: ptr
  411. r2 :: object
  412. r3 :: bit
  413. r4 :: bool
  414. r5 :: object
  415. r6 :: ptr
  416. r7 :: object
  417. r8 :: bit
  418. r9 :: __main__.R
  419. r10 :: __main__.A
  420. L0:
  421. r0 = __main__.A :: type
  422. r1 = get_element_ptr x ob_type :: PyObject
  423. r2 = load_mem r1 :: builtins.object*
  424. keep_alive x
  425. r3 = r2 == r0
  426. if r3 goto L1 else goto L2 :: bool
  427. L1:
  428. r4 = r3
  429. goto L3
  430. L2:
  431. r5 = __main__.R :: type
  432. r6 = get_element_ptr x ob_type :: PyObject
  433. r7 = load_mem r6 :: builtins.object*
  434. keep_alive x
  435. r8 = r7 == r5
  436. r4 = r8
  437. L3:
  438. if r4 goto L4 else goto L5 :: bool
  439. L4:
  440. r9 = cast(__main__.R, x)
  441. return r9
  442. L5:
  443. r10 = A()
  444. return r10
  445. [case testIsInstanceFewSubclassesTrait]
  446. from mypy_extensions import trait
  447. class B: pass
  448. @trait
  449. class R: pass
  450. class A(B, R): pass
  451. class C(B, R): pass
  452. def f(x: object) -> R:
  453. if isinstance(x, R):
  454. return x
  455. return A()
  456. [out]
  457. def f(x):
  458. x, r0 :: object
  459. r1 :: ptr
  460. r2 :: object
  461. r3 :: bit
  462. r4 :: bool
  463. r5 :: object
  464. r6 :: ptr
  465. r7 :: object
  466. r8 :: bit
  467. r9 :: __main__.R
  468. r10 :: __main__.A
  469. L0:
  470. r0 = __main__.A :: type
  471. r1 = get_element_ptr x ob_type :: PyObject
  472. r2 = load_mem r1 :: builtins.object*
  473. keep_alive x
  474. r3 = r2 == r0
  475. if r3 goto L1 else goto L2 :: bool
  476. L1:
  477. r4 = r3
  478. goto L3
  479. L2:
  480. r5 = __main__.C :: type
  481. r6 = get_element_ptr x ob_type :: PyObject
  482. r7 = load_mem r6 :: builtins.object*
  483. keep_alive x
  484. r8 = r7 == r5
  485. r4 = r8
  486. L3:
  487. if r4 goto L4 else goto L5 :: bool
  488. L4:
  489. r9 = cast(__main__.R, x)
  490. return r9
  491. L5:
  492. r10 = A()
  493. return r10
  494. [case testIsInstanceManySubclasses]
  495. class R: pass
  496. class A(R): pass
  497. class B(R): pass
  498. class C(R): pass
  499. def f(x: object) -> R:
  500. if isinstance(x, R):
  501. return x
  502. return B()
  503. [out]
  504. def f(x):
  505. x, r0 :: object
  506. r1 :: bool
  507. r2 :: __main__.R
  508. r3 :: __main__.B
  509. L0:
  510. r0 = __main__.R :: type
  511. r1 = CPy_TypeCheck(x, r0)
  512. if r1 goto L1 else goto L2 :: bool
  513. L1:
  514. r2 = cast(__main__.R, x)
  515. return r2
  516. L2:
  517. r3 = B()
  518. return r3
  519. [case testFakeSuper]
  520. class A:
  521. def __init__(self, x: int) -> None:
  522. self.x = x
  523. class B(A):
  524. def __init__(self, x: int, y: int) -> None:
  525. A.__init__(self, x)
  526. self.y = y
  527. [out]
  528. def A.__init__(self, x):
  529. self :: __main__.A
  530. x :: int
  531. L0:
  532. self.x = x
  533. return 1
  534. def B.__init__(self, x, y):
  535. self :: __main__.B
  536. x, y :: int
  537. r0 :: None
  538. L0:
  539. r0 = A.__init__(self, x)
  540. self.y = y
  541. return 1
  542. [case testClassMethod]
  543. class C:
  544. @staticmethod
  545. def foo(x: int) -> int: return 10 + x
  546. @classmethod
  547. def bar(cls, x: int) -> int: return 10 + x
  548. def lol() -> int:
  549. return C.foo(1) + C.bar(2)
  550. [out]
  551. def C.foo(x):
  552. x, r0 :: int
  553. L0:
  554. r0 = CPyTagged_Add(20, x)
  555. return r0
  556. def C.bar(cls, x):
  557. cls :: object
  558. x, r0 :: int
  559. L0:
  560. r0 = CPyTagged_Add(20, x)
  561. return r0
  562. def lol():
  563. r0 :: int
  564. r1 :: object
  565. r2, r3 :: int
  566. L0:
  567. r0 = C.foo(2)
  568. r1 = __main__.C :: type
  569. r2 = C.bar(r1, 4)
  570. r3 = CPyTagged_Add(r0, r2)
  571. return r3
  572. [case testCallClassMethodViaCls]
  573. class C:
  574. @classmethod
  575. def f(cls, x: int) -> int:
  576. return cls.g(x)
  577. @classmethod
  578. def g(cls, x: int) -> int:
  579. return x
  580. class D:
  581. @classmethod
  582. def f(cls, x: int) -> int:
  583. # TODO: This could aso be optimized, since g is not ever overridden
  584. return cls.g(x)
  585. @classmethod
  586. def g(cls, x: int) -> int:
  587. return x
  588. class DD(D):
  589. pass
  590. [out]
  591. def C.f(cls, x):
  592. cls :: object
  593. x :: int
  594. r0 :: object
  595. r1 :: int
  596. L0:
  597. r0 = __main__.C :: type
  598. r1 = C.g(r0, x)
  599. return r1
  600. def C.g(cls, x):
  601. cls :: object
  602. x :: int
  603. L0:
  604. return x
  605. def D.f(cls, x):
  606. cls :: object
  607. x :: int
  608. r0 :: str
  609. r1, r2 :: object
  610. r3 :: int
  611. L0:
  612. r0 = 'g'
  613. r1 = box(int, x)
  614. r2 = CPyObject_CallMethodObjArgs(cls, r0, r1, 0)
  615. r3 = unbox(int, r2)
  616. return r3
  617. def D.g(cls, x):
  618. cls :: object
  619. x :: int
  620. L0:
  621. return x
  622. [case testCannotAssignToClsArgument]
  623. from typing import Any, cast
  624. class C:
  625. @classmethod
  626. def m(cls) -> None:
  627. cls = cast(Any, D) # E: Cannot assign to the first argument of classmethod
  628. cls, x = cast(Any, D), 1 # E: Cannot assign to the first argument of classmethod
  629. cls, x = cast(Any, [1, 2]) # E: Cannot assign to the first argument of classmethod
  630. cls.m()
  631. class D:
  632. pass
  633. [case testSuper1]
  634. class A:
  635. def __init__(self, x: int) -> None:
  636. self.x = x
  637. class B(A):
  638. def __init__(self, x: int, y: int) -> None:
  639. super().__init__(x)
  640. self.y = y
  641. [out]
  642. def A.__init__(self, x):
  643. self :: __main__.A
  644. x :: int
  645. L0:
  646. self.x = x
  647. return 1
  648. def B.__init__(self, x, y):
  649. self :: __main__.B
  650. x, y :: int
  651. r0 :: None
  652. L0:
  653. r0 = A.__init__(self, x)
  654. self.y = y
  655. return 1
  656. [case testSuper2]
  657. from mypy_extensions import trait
  658. @trait
  659. class T:
  660. def foo(self) -> None: pass
  661. class X(T):
  662. def foo(self) -> None:
  663. super().foo()
  664. [out]
  665. def T.foo(self):
  666. self :: __main__.T
  667. L0:
  668. return 1
  669. def X.foo(self):
  670. self :: __main__.X
  671. r0 :: None
  672. L0:
  673. r0 = T.foo(self)
  674. return 1
  675. [case testSuperCallToObjectInitIsOmitted]
  676. class C:
  677. def __init__(self) -> None:
  678. super().__init__()
  679. class D: pass
  680. class E(D):
  681. def __init__(self) -> None:
  682. super().__init__()
  683. class F(C):
  684. def __init__(self) -> None:
  685. super().__init__()
  686. class DictSubclass(dict):
  687. def __init__(self) -> None:
  688. super().__init__()
  689. [out]
  690. def C.__init__(self):
  691. self :: __main__.C
  692. L0:
  693. return 1
  694. def E.__init__(self):
  695. self :: __main__.E
  696. L0:
  697. return 1
  698. def F.__init__(self):
  699. self :: __main__.F
  700. r0 :: None
  701. L0:
  702. r0 = C.__init__(self)
  703. return 1
  704. def DictSubclass.__init__(self):
  705. self :: dict
  706. r0 :: object
  707. r1 :: str
  708. r2, r3, r4 :: object
  709. r5 :: str
  710. r6, r7 :: object
  711. L0:
  712. r0 = builtins :: module
  713. r1 = 'super'
  714. r2 = CPyObject_GetAttr(r0, r1)
  715. r3 = __main__.DictSubclass :: type
  716. r4 = PyObject_CallFunctionObjArgs(r2, r3, self, 0)
  717. r5 = '__init__'
  718. r6 = CPyObject_GetAttr(r4, r5)
  719. r7 = PyObject_CallFunctionObjArgs(r6, 0)
  720. return 1
  721. [case testClassVariable]
  722. from typing import ClassVar
  723. class A:
  724. x = 10 # type: ClassVar[int]
  725. def f() -> int:
  726. return A.x
  727. [out]
  728. def f():
  729. r0 :: object
  730. r1 :: str
  731. r2 :: object
  732. r3 :: int
  733. L0:
  734. r0 = __main__.A :: type
  735. r1 = 'x'
  736. r2 = CPyObject_GetAttr(r0, r1)
  737. r3 = unbox(int, r2)
  738. return r3
  739. [case testNoEqDefined]
  740. class A:
  741. pass
  742. def f(a: A, b: A) -> bool:
  743. return a == b
  744. def f2(a: A, b: A) -> bool:
  745. return a != b
  746. [out]
  747. def f(a, b):
  748. a, b :: __main__.A
  749. r0 :: bit
  750. L0:
  751. r0 = a == b
  752. return r0
  753. def f2(a, b):
  754. a, b :: __main__.A
  755. r0 :: bit
  756. L0:
  757. r0 = a != b
  758. return r0
  759. [case testEqDefined]
  760. class Base:
  761. def __eq__(self, other: object) -> bool:
  762. return False
  763. class Derived(Base):
  764. def __eq__(self, other: object) -> bool:
  765. return True
  766. def f(a: Base, b: Base) -> bool:
  767. return a == b
  768. def f2(a: Base, b: Base) -> bool:
  769. return a != b
  770. def fOpt(a: Derived, b: Derived) -> bool:
  771. return a == b
  772. def fOpt2(a: Derived, b: Derived) -> bool:
  773. return a != b
  774. [out]
  775. def Base.__eq__(self, other):
  776. self :: __main__.Base
  777. other, r0 :: object
  778. L0:
  779. r0 = box(bool, 0)
  780. return r0
  781. def Base.__ne__(__mypyc_self__, rhs):
  782. __mypyc_self__ :: __main__.Base
  783. rhs, r0, r1 :: object
  784. r2 :: bit
  785. r3 :: int32
  786. r4 :: bit
  787. r5 :: bool
  788. r6 :: object
  789. L0:
  790. r0 = __mypyc_self__.__eq__(rhs)
  791. r1 = load_address _Py_NotImplementedStruct
  792. r2 = r0 == r1
  793. if r2 goto L2 else goto L1 :: bool
  794. L1:
  795. r3 = PyObject_Not(r0)
  796. r4 = r3 >= 0 :: signed
  797. r5 = truncate r3: int32 to builtins.bool
  798. r6 = box(bool, r5)
  799. return r6
  800. L2:
  801. return r1
  802. def Derived.__eq__(self, other):
  803. self :: __main__.Derived
  804. other, r0 :: object
  805. L0:
  806. r0 = box(bool, 1)
  807. return r0
  808. def f(a, b):
  809. a, b :: __main__.Base
  810. r0 :: object
  811. r1 :: bool
  812. L0:
  813. r0 = PyObject_RichCompare(a, b, 2)
  814. r1 = unbox(bool, r0)
  815. return r1
  816. def f2(a, b):
  817. a, b :: __main__.Base
  818. r0 :: object
  819. r1 :: bool
  820. L0:
  821. r0 = PyObject_RichCompare(a, b, 3)
  822. r1 = unbox(bool, r0)
  823. return r1
  824. def fOpt(a, b):
  825. a, b :: __main__.Derived
  826. r0 :: object
  827. r1 :: bool
  828. L0:
  829. r0 = a.__eq__(b)
  830. r1 = unbox(bool, r0)
  831. return r1
  832. def fOpt2(a, b):
  833. a, b :: __main__.Derived
  834. r0 :: object
  835. r1 :: bool
  836. L0:
  837. r0 = a.__ne__(b)
  838. r1 = unbox(bool, r0)
  839. return r1
  840. [case testEqDefinedLater]
  841. def f(a: 'Base', b: 'Base') -> bool:
  842. return a == b
  843. def f2(a: 'Base', b: 'Base') -> bool:
  844. return a != b
  845. def fOpt(a: 'Derived', b: 'Derived') -> bool:
  846. return a == b
  847. def fOpt2(a: 'Derived', b: 'Derived') -> bool:
  848. return a != b
  849. class Base:
  850. pass
  851. class Derived(Base):
  852. def __eq__(self, other: object) -> bool:
  853. return True
  854. [out]
  855. def f(a, b):
  856. a, b :: __main__.Base
  857. r0 :: object
  858. r1 :: bool
  859. L0:
  860. r0 = PyObject_RichCompare(a, b, 2)
  861. r1 = unbox(bool, r0)
  862. return r1
  863. def f2(a, b):
  864. a, b :: __main__.Base
  865. r0 :: object
  866. r1 :: bool
  867. L0:
  868. r0 = PyObject_RichCompare(a, b, 3)
  869. r1 = unbox(bool, r0)
  870. return r1
  871. def fOpt(a, b):
  872. a, b :: __main__.Derived
  873. r0 :: object
  874. r1 :: bool
  875. L0:
  876. r0 = a.__eq__(b)
  877. r1 = unbox(bool, r0)
  878. return r1
  879. def fOpt2(a, b):
  880. a, b :: __main__.Derived
  881. r0 :: str
  882. r1 :: object
  883. r2 :: bool
  884. L0:
  885. r0 = '__ne__'
  886. r1 = CPyObject_CallMethodObjArgs(a, r0, b, 0)
  887. r2 = unbox(bool, r1)
  888. return r2
  889. def Derived.__eq__(self, other):
  890. self :: __main__.Derived
  891. other, r0 :: object
  892. L0:
  893. r0 = box(bool, 1)
  894. return r0
  895. def Derived.__ne__(__mypyc_self__, rhs):
  896. __mypyc_self__ :: __main__.Derived
  897. rhs, r0, r1 :: object
  898. r2 :: bit
  899. r3 :: int32
  900. r4 :: bit
  901. r5 :: bool
  902. r6 :: object
  903. L0:
  904. r0 = __mypyc_self__.__eq__(rhs)
  905. r1 = load_address _Py_NotImplementedStruct
  906. r2 = r0 == r1
  907. if r2 goto L2 else goto L1 :: bool
  908. L1:
  909. r3 = PyObject_Not(r0)
  910. r4 = r3 >= 0 :: signed
  911. r5 = truncate r3: int32 to builtins.bool
  912. r6 = box(bool, r5)
  913. return r6
  914. L2:
  915. return r1
  916. [case testDefaultVars]
  917. from typing import ClassVar, Optional
  918. class A:
  919. x = 10
  920. def lol(self) -> None:
  921. self.x = 100
  922. LOL = 'lol'
  923. class B(A):
  924. y = LOL
  925. z: Optional[str] = None
  926. b = True
  927. bogus = None # type: int
  928. [out]
  929. def A.lol(self):
  930. self :: __main__.A
  931. r0 :: bool
  932. L0:
  933. self.x = 200; r0 = is_error
  934. return 1
  935. def A.__mypyc_defaults_setup(__mypyc_self__):
  936. __mypyc_self__ :: __main__.A
  937. L0:
  938. __mypyc_self__.x = 20
  939. return 1
  940. def B.__mypyc_defaults_setup(__mypyc_self__):
  941. __mypyc_self__ :: __main__.B
  942. r0 :: dict
  943. r1 :: str
  944. r2 :: object
  945. r3 :: str
  946. r4 :: object
  947. L0:
  948. __mypyc_self__.x = 20
  949. r0 = __main__.globals :: static
  950. r1 = 'LOL'
  951. r2 = CPyDict_GetItem(r0, r1)
  952. r3 = cast(str, r2)
  953. __mypyc_self__.y = r3
  954. r4 = box(None, 1)
  955. __mypyc_self__.z = r4
  956. __mypyc_self__.b = 1
  957. return 1
  958. [case testSubclassDictSpecalized]
  959. from typing import Dict
  960. class WelpDict(Dict[str, int]):
  961. pass
  962. def foo(x: WelpDict) -> None:
  963. # we care that the specalized op gets used
  964. x.update(x)
  965. [out]
  966. def foo(x):
  967. x :: dict
  968. r0 :: int32
  969. r1 :: bit
  970. L0:
  971. r0 = CPyDict_Update(x, x)
  972. r1 = r0 >= 0 :: signed
  973. return 1
  974. [case testNoSpuriousLinearity]
  975. # Make sure that the non-trait MRO linearity check isn't affected by processing order
  976. class A(B): pass
  977. class B(C): pass
  978. class C: pass
  979. [out]
  980. [case testDeletableSemanticAnalysis]
  981. class Err1:
  982. __deletable__ = 'x' # E: "__deletable__" must be initialized with a list or tuple expression
  983. class Err2:
  984. __deletable__ = [
  985. 1 # E: Invalid "__deletable__" item; string literal expected
  986. ]
  987. class Err3:
  988. __deletable__ = ['x', ['y'], 'z'] # E: Invalid "__deletable__" item; string literal expected
  989. class Err4:
  990. __deletable__ = (1,) # E: Invalid "__deletable__" item; string literal expected
  991. a = ['x']
  992. class Err5:
  993. __deletable__ = a # E: "__deletable__" must be initialized with a list or tuple expression
  994. class Ok1:
  995. __deletable__ = ('x',)
  996. x: int
  997. class Ok2:
  998. __deletable__ = ['x']
  999. x: int
  1000. [case testInvalidDeletableAttribute]
  1001. class NotDeletable:
  1002. __deletable__ = ['x']
  1003. x: int
  1004. y: int
  1005. def g(o: NotDeletable) -> None:
  1006. del o.x
  1007. del o.y # E: "y" cannot be deleted \
  1008. # N: Using "__deletable__ = ['<attr>']" in the class body enables "del obj.<attr>"
  1009. class Base:
  1010. x: int
  1011. class Deriv(Base):
  1012. __deletable__ = ['x'] # E: Attribute "x" not defined in "Deriv" (defined in "Base")
  1013. class UndefinedDeletable:
  1014. __deletable__ = ['x'] # E: Attribute "x" not defined
  1015. class DeletableProperty:
  1016. __deletable__ = ['prop'] # E: Cannot make property "prop" deletable
  1017. @property
  1018. def prop(self) -> int:
  1019. return 5
  1020. [case testFinalDeletable]
  1021. from typing import Final
  1022. class DeletableFinal1:
  1023. x: Final[int] # E: Deletable attribute cannot be final
  1024. __deletable__ = ['x']
  1025. def __init__(self, x: int) -> None:
  1026. self.x = x
  1027. class DeletableFinal2:
  1028. X: Final = 0 # E: Deletable attribute cannot be final
  1029. __deletable__ = ['X']
  1030. [case testNeedAnnotateClassVar]
  1031. from typing import Final, ClassVar, Type
  1032. class C:
  1033. a = 'A'
  1034. b: str = 'B'
  1035. f: Final = 'F'
  1036. c: ClassVar = 'C'
  1037. class D(C):
  1038. pass
  1039. def f() -> None:
  1040. C.a # E: Cannot access instance attribute "a" through class object \
  1041. # N: (Hint: Use "x: Final = ..." or "x: ClassVar = ..." to define a class attribute)
  1042. C.b # E: Cannot access instance attribute "b" through class object \
  1043. # N: (Hint: Use "x: Final = ..." or "x: ClassVar = ..." to define a class attribute)
  1044. C.f
  1045. C.c
  1046. D.a # E: Cannot access instance attribute "a" through class object \
  1047. # N: (Hint: Use "x: Final = ..." or "x: ClassVar = ..." to define a class attribute)
  1048. D.b # E: Cannot access instance attribute "b" through class object \
  1049. # N: (Hint: Use "x: Final = ..." or "x: ClassVar = ..." to define a class attribute)
  1050. D.f
  1051. D.c
  1052. def g(c: Type[C], d: Type[D]) -> None:
  1053. c.a # E: Cannot access instance attribute "a" through class object \
  1054. # N: (Hint: Use "x: Final = ..." or "x: ClassVar = ..." to define a class attribute)
  1055. c.f
  1056. c.c
  1057. d.a # E: Cannot access instance attribute "a" through class object \
  1058. # N: (Hint: Use "x: Final = ..." or "x: ClassVar = ..." to define a class attribute)
  1059. d.f
  1060. d.c
  1061. [case testSetAttributeWithDefaultInInit]
  1062. class C:
  1063. s = ''
  1064. def __init__(self, s: str) -> None:
  1065. self.s = s
  1066. [out]
  1067. def C.__init__(self, s):
  1068. self :: __main__.C
  1069. s :: str
  1070. r0 :: bool
  1071. L0:
  1072. self.s = s; r0 = is_error
  1073. return 1
  1074. def C.__mypyc_defaults_setup(__mypyc_self__):
  1075. __mypyc_self__ :: __main__.C
  1076. r0 :: str
  1077. L0:
  1078. r0 = ''
  1079. __mypyc_self__.s = r0
  1080. return 1
  1081. [case testBorrowAttribute]
  1082. def f(d: D) -> int:
  1083. return d.c.x
  1084. class C:
  1085. x: int
  1086. class D:
  1087. c: C
  1088. [out]
  1089. def f(d):
  1090. d :: __main__.D
  1091. r0 :: __main__.C
  1092. r1 :: int
  1093. L0:
  1094. r0 = borrow d.c
  1095. r1 = r0.x
  1096. keep_alive d
  1097. return r1
  1098. [case testNoBorrowOverPropertyAccess]
  1099. class C:
  1100. d: D
  1101. class D:
  1102. @property
  1103. def e(self) -> E:
  1104. return E()
  1105. class E:
  1106. x: int
  1107. def f(c: C) -> int:
  1108. return c.d.e.x
  1109. [out]
  1110. def D.e(self):
  1111. self :: __main__.D
  1112. r0 :: __main__.E
  1113. L0:
  1114. r0 = E()
  1115. return r0
  1116. def f(c):
  1117. c :: __main__.C
  1118. r0 :: __main__.D
  1119. r1 :: __main__.E
  1120. r2 :: int
  1121. L0:
  1122. r0 = c.d
  1123. r1 = r0.e
  1124. r2 = r1.x
  1125. return r2
  1126. [case testBorrowResultOfCustomGetItemInIfStatement]
  1127. from typing import List
  1128. class C:
  1129. def __getitem__(self, x: int) -> List[int]:
  1130. return []
  1131. def f(x: C) -> None:
  1132. # In this case the keep_alive must come before the branch, as otherwise
  1133. # reference count transform will get confused.
  1134. if x[1][0] == 2:
  1135. y = 1
  1136. else:
  1137. y = 2
  1138. [out]
  1139. def C.__getitem__(self, x):
  1140. self :: __main__.C
  1141. x :: int
  1142. r0 :: list
  1143. L0:
  1144. r0 = PyList_New(0)
  1145. return r0
  1146. def f(x):
  1147. x :: __main__.C
  1148. r0 :: list
  1149. r1 :: object
  1150. r2 :: int
  1151. r3 :: bit
  1152. y :: int
  1153. L0:
  1154. r0 = x.__getitem__(2)
  1155. r1 = CPyList_GetItemShortBorrow(r0, 0)
  1156. r2 = unbox(int, r1)
  1157. r3 = r2 == 4
  1158. keep_alive r0
  1159. if r3 goto L1 else goto L2 :: bool
  1160. L1:
  1161. y = 2
  1162. goto L3
  1163. L2:
  1164. y = 4
  1165. L3:
  1166. return 1
  1167. [case testIncompatibleDefinitionOfAttributeInSubclass]
  1168. from mypy_extensions import trait
  1169. class Base:
  1170. x: int
  1171. class Bad1(Base):
  1172. x: bool # E: Type of "x" is incompatible with definition in class "Base"
  1173. class Good1(Base):
  1174. x: int
  1175. class Good2(Base):
  1176. x: int = 0
  1177. class Good3(Base):
  1178. x = 0
  1179. class Good4(Base):
  1180. def __init__(self) -> None:
  1181. self.x = 0
  1182. class Good5(Base):
  1183. def __init__(self) -> None:
  1184. self.x: int = 0
  1185. class Base2(Base):
  1186. pass
  1187. class Bad2(Base2):
  1188. x: bool = False # E: Type of "x" is incompatible with definition in class "Base"
  1189. class Bad3(Base):
  1190. x = False # E: Type of "x" is incompatible with definition in class "Base"
  1191. @trait
  1192. class T:
  1193. y: object
  1194. class E(T):
  1195. y: str # E: Type of "y" is incompatible with definition in trait "T"