irbuild-constant-fold.test 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. [case testIntConstantFolding]
  2. def bin_ops() -> None:
  3. add = 15 + 47
  4. add_mul = (2 + 3) * 5
  5. sub = 7 - 11
  6. bit_and = 6 & 10
  7. bit_or = 6 | 10
  8. bit_xor = 6 ^ 10
  9. lshift = 5 << 2
  10. rshift = 13 >> 2
  11. lshift0 = 5 << 0
  12. rshift0 = 13 >> 0
  13. def unary_ops() -> None:
  14. neg1 = -5
  15. neg2 = --1
  16. neg3 = -0
  17. pos = +5
  18. inverted1 = ~0
  19. inverted2 = ~5
  20. inverted3 = ~3
  21. def pow() -> None:
  22. p0 = 3**0
  23. p1 = 3**5
  24. p2 = (-5)**3
  25. p3 = 0**0
  26. [out]
  27. def bin_ops():
  28. add, add_mul, sub, bit_and, bit_or, bit_xor, lshift, rshift, lshift0, rshift0 :: int
  29. L0:
  30. add = 124
  31. add_mul = 50
  32. sub = -8
  33. bit_and = 4
  34. bit_or = 28
  35. bit_xor = 24
  36. lshift = 40
  37. rshift = 6
  38. lshift0 = 10
  39. rshift0 = 26
  40. return 1
  41. def unary_ops():
  42. neg1, neg2, neg3, pos, inverted1, inverted2, inverted3 :: int
  43. L0:
  44. neg1 = -10
  45. neg2 = 2
  46. neg3 = 0
  47. pos = 10
  48. inverted1 = -2
  49. inverted2 = -12
  50. inverted3 = -8
  51. return 1
  52. def pow():
  53. p0, p1, p2, p3 :: int
  54. L0:
  55. p0 = 2
  56. p1 = 486
  57. p2 = -250
  58. p3 = 2
  59. return 1
  60. [case testIntConstantFoldingDivMod]
  61. def div() -> None:
  62. div1 = 25 // 5
  63. div2 = 24 // 5
  64. div3 = 29 // 5
  65. div4 = 30 // 5
  66. div_zero = 0 // 5
  67. neg1 = -1 // 3
  68. neg2 = -2 // 3
  69. neg3 = -3 // 3
  70. neg4 = -4 // 3
  71. neg_neg = -765467 // -234
  72. pos_neg = 983745 // -7864
  73. def mod() -> None:
  74. mod1 = 25 % 5
  75. mod2 = 24 % 5
  76. mod3 = 29 % 5
  77. mod4 = 30 % 5
  78. mod_zero = 0 % 5
  79. neg1 = -4 % 3
  80. neg2 = -5 % 3
  81. neg3 = -6 % 3
  82. neg4 = -7 % 3
  83. neg_neg = -765467 % -234
  84. pos_neg = 983745 % -7864
  85. [out]
  86. def div():
  87. div1, div2, div3, div4, div_zero, neg1, neg2, neg3, neg4, neg_neg, pos_neg :: int
  88. L0:
  89. div1 = 10
  90. div2 = 8
  91. div3 = 10
  92. div4 = 12
  93. div_zero = 0
  94. neg1 = -2
  95. neg2 = -2
  96. neg3 = -2
  97. neg4 = -4
  98. neg_neg = 6542
  99. pos_neg = -252
  100. return 1
  101. def mod():
  102. mod1, mod2, mod3, mod4, mod_zero, neg1, neg2, neg3, neg4, neg_neg, pos_neg :: int
  103. L0:
  104. mod1 = 0
  105. mod2 = 8
  106. mod3 = 8
  107. mod4 = 0
  108. mod_zero = 0
  109. neg1 = 4
  110. neg2 = 2
  111. neg3 = 0
  112. neg4 = 4
  113. neg_neg = -106
  114. pos_neg = -14238
  115. return 1
  116. [case testIntConstantFoldingUnsupportedCases]
  117. def error_cases() -> None:
  118. div_by_zero = 5 // 0
  119. mod_by_zero = 5 % 0
  120. lshift_neg = 6 << -1
  121. rshift_neg = 7 >> -1
  122. def unsupported_div() -> None:
  123. x = 4 / 6
  124. y = 10 / 5
  125. def unsupported_pow() -> None:
  126. p = 3 ** (-1)
  127. [out]
  128. def error_cases():
  129. r0, div_by_zero, r1, mod_by_zero, r2, lshift_neg, r3, rshift_neg :: int
  130. L0:
  131. r0 = CPyTagged_FloorDivide(10, 0)
  132. div_by_zero = r0
  133. r1 = CPyTagged_Remainder(10, 0)
  134. mod_by_zero = r1
  135. r2 = CPyTagged_Lshift(12, -2)
  136. lshift_neg = r2
  137. r3 = CPyTagged_Rshift(14, -2)
  138. rshift_neg = r3
  139. return 1
  140. def unsupported_div():
  141. r0, x, r1, y :: float
  142. L0:
  143. r0 = CPyTagged_TrueDivide(8, 12)
  144. x = r0
  145. r1 = CPyTagged_TrueDivide(20, 10)
  146. y = r1
  147. return 1
  148. def unsupported_pow():
  149. r0, r1, r2 :: object
  150. r3, p :: float
  151. L0:
  152. r0 = object 3
  153. r1 = object -1
  154. r2 = CPyNumber_Power(r0, r1)
  155. r3 = unbox(float, r2)
  156. p = r3
  157. return 1
  158. [case testIntConstantFoldingBigIntResult_64bit]
  159. def long_and_short() -> None:
  160. # The smallest and largest representable short integers
  161. short1 = 0x3ffffffffffffff0 + 0xf # (1 << 62) - 1
  162. short2 = -0x3fffffffffffffff - 1 # -(1 << 62)
  163. short3 = -0x4000000000000000
  164. # Smallest big integers by absolute value
  165. big1 = 1 << 62
  166. big2 = 0x4000000000000000 # 1 << 62
  167. big3 = -(1 << 62) - 1
  168. big4 = -0x4000000000000001 # -(1 << 62) - 1
  169. big5 = 123**41
  170. [out]
  171. def long_and_short():
  172. short1, short2, short3, r0, big1, r1, big2, r2, big3, r3, big4, r4, big5 :: int
  173. L0:
  174. short1 = 9223372036854775806
  175. short2 = -9223372036854775808
  176. short3 = -9223372036854775808
  177. r0 = object 4611686018427387904
  178. big1 = r0
  179. r1 = object 4611686018427387904
  180. big2 = r1
  181. r2 = object -4611686018427387905
  182. big3 = r2
  183. r3 = object -4611686018427387905
  184. big4 = r3
  185. r4 = object 48541095000524544750127162673405880068636916264012200797813591925035550682238127143323
  186. big5 = r4
  187. return 1
  188. [case testIntConstantFoldingFinal]
  189. from typing_extensions import Final
  190. X: Final = 5
  191. Y: Final = 2 + 4
  192. def f() -> None:
  193. a = X + 1
  194. a = Y + 1
  195. [out]
  196. def f():
  197. a :: int
  198. L0:
  199. a = 12
  200. a = 14
  201. return 1
  202. [case testIntConstantFoldingClassFinal]
  203. from typing_extensions import Final
  204. class C:
  205. X: Final = 5
  206. def f() -> None:
  207. a = C.X + 1
  208. [out]
  209. def C.__mypyc_defaults_setup(__mypyc_self__):
  210. __mypyc_self__ :: __main__.C
  211. L0:
  212. __mypyc_self__.X = 10
  213. return 1
  214. def f():
  215. a :: int
  216. L0:
  217. a = 12
  218. return 1
  219. [case testStrConstantFolding]
  220. from typing_extensions import Final
  221. S: Final = 'z'
  222. def f() -> None:
  223. x = 'foo' + 'bar'
  224. y = 'x' + 'y' + S
  225. [out]
  226. def f():
  227. r0, x, r1, y :: str
  228. L0:
  229. r0 = 'foobar'
  230. x = r0
  231. r1 = 'xyz'
  232. y = r1
  233. return 1