polkadot_dispatch.sol 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. // RUN: --target polkadot --emit cfg
  2. contract has_fallback_and_receive {
  3. // BEGIN-CHECK: Contract: has_fallback_and_receive
  4. // CHECK: # function polkadot_deploy_dispatch public:false selector: nonpayable:false
  5. // CHECK: block0: # entry
  6. // CHECK: ty:uint32 %input_len.temp.1 = (arg #1)
  7. // CHECK: ty:uint128 %value.temp.2 = (arg #2)
  8. // CHECK: ty:buffer_pointer %input_ptr.temp.3 = (arg #0)
  9. // CHECK: branchcond (unsigned less (arg #1) < uint32 4), block2, block1
  10. // CHECK: block1: # start_dispatch
  11. // CHECK: ty:uint32 %selector.temp.4 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  12. // CHECK: store (arg #3), %selector.temp.4
  13. // CHECK: switch %selector.temp.4:
  14. // CHECK: case uint32 3576764294: goto block #3
  15. // CHECK: default: goto block #2
  16. // CHECK: block2: # fb_or_recv
  17. // CHECK: return code: function selector invalid
  18. // CHECK: block3: # func_3_dispatch
  19. // CHECK: = call has_fallback_and_receive::has_fallback_and_receive::constructor::861731d5
  20. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  21. // CHECK: # function polkadot_call_dispatch public:false selector: nonpayable:false
  22. // CHECK: block0: # entry
  23. // CHECK: ty:uint32 %input_len.temp.5 = (arg #1)
  24. // CHECK: ty:uint128 %value.temp.6 = (arg #2)
  25. // CHECK: ty:buffer_pointer %input_ptr.temp.7 = (arg #0)
  26. // CHECK: branchcond (unsigned less (arg #1) < uint32 4), block2, block1
  27. // CHECK: block1: # start_dispatch
  28. // CHECK: ty:uint32 %selector.temp.8 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  29. // CHECK: store (arg #3), %selector.temp.8
  30. // CHECK: switch %selector.temp.8:
  31. // CHECK: default: goto block #2
  32. // CHECK: block2: # fb_or_recv
  33. // CHECK: branchcond (unsigned more (arg #2) > uint128 0), block4, block3
  34. // CHECK: block3: # fallback
  35. // CHECK: = call has_fallback_and_receive::has_fallback_and_receive::fallback
  36. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  37. // CHECK: block4: # receive
  38. // CHECK: = call has_fallback_and_receive::has_fallback_and_receive::receive
  39. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  40. fallback() external {}
  41. receive() payable external {}
  42. }
  43. contract has_fallback {
  44. // BEGIN-CHECK: Contract: has_fallback
  45. // CHECK: # function polkadot_deploy_dispatch public:false selector: nonpayable:false
  46. // CHECK: # params: buffer_pointer,uint32,uint128,uint32
  47. // CHECK: # returns:
  48. // CHECK: block0: # entry
  49. // CHECK: ty:uint32 %input_len.temp.9 = (arg #1)
  50. // CHECK: ty:uint128 %value.temp.10 = (arg #2)
  51. // CHECK: ty:buffer_pointer %input_ptr.temp.11 = (arg #0)
  52. // CHECK: branchcond (unsigned less (arg #1) < uint32 4), block2, block1
  53. // CHECK: block1: # start_dispatch
  54. // CHECK: ty:uint32 %selector.temp.12 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  55. // CHECK: store (arg #3), %selector.temp.12
  56. // CHECK: switch %selector.temp.12:
  57. // CHECK: case uint32 3576764294: goto block #3
  58. // CHECK: default: goto block #2
  59. // CHECK: block2: # fb_or_recv
  60. // CHECK: return code: function selector invalid
  61. // CHECK: block3: # func_2_dispatch
  62. // CHECK: = call has_fallback::has_fallback::constructor::861731d5
  63. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  64. // CHECK: # function polkadot_call_dispatch public:false selector: nonpayable:false
  65. // CHECK: block0: # entry
  66. // CHECK: ty:uint32 %input_len.temp.13 = (arg #1)
  67. // CHECK: ty:uint128 %value.temp.14 = (arg #2)
  68. // CHECK: ty:buffer_pointer %input_ptr.temp.15 = (arg #0)
  69. // CHECK: branchcond (unsigned less (arg #1) < uint32 4), block2, block1
  70. // CHECK: block1: # start_dispatch
  71. // CHECK: ty:uint32 %selector.temp.16 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  72. // CHECK: store (arg #3), %selector.temp.16
  73. // CHECK: switch %selector.temp.16:
  74. // CHECK: default: goto block #2
  75. // CHECK: block2: # fb_or_recv
  76. // CHECK: branchcond (unsigned more (arg #2) > uint128 0), block4, block3
  77. // CHECK: block3: # fallback
  78. // CHECK: = call has_fallback::has_fallback::fallback
  79. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  80. // CHECK: block4: # receive
  81. // CHECK: return code: function selector invalid
  82. fallback() external {}
  83. }
  84. contract has_receive {
  85. // BEGIN-CHECK: Contract: has_receive
  86. // CHECK: # function polkadot_deploy_dispatch public:false selector: nonpayable:false
  87. // CHECK: # params: buffer_pointer,uint32,uint128,uint32
  88. // CHECK: # returns:
  89. // CHECK: block0: # entry
  90. // CHECK: ty:uint32 %input_len.temp.17 = (arg #1)
  91. // CHECK: ty:uint128 %value.temp.18 = (arg #2)
  92. // CHECK: ty:buffer_pointer %input_ptr.temp.19 = (arg #0)
  93. // CHECK: branchcond (unsigned less (arg #1) < uint32 4), block2, block1
  94. // CHECK: block1: # start_dispatch
  95. // CHECK: ty:uint32 %selector.temp.20 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  96. // CHECK: store (arg #3), %selector.temp.20
  97. // CHECK: switch %selector.temp.20:
  98. // CHECK: case uint32 3576764294: goto block #3
  99. // CHECK: default: goto block #2
  100. // CHECK: block2: # fb_or_recv
  101. // CHECK: return code: function selector invalid
  102. // CHECK: block3: # func_2_dispatch
  103. // CHECK: = call has_receive::has_receive::constructor::861731d5
  104. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  105. // CHECK: # function polkadot_call_dispatch public:false selector: nonpayable:false
  106. // CHECK: # params: buffer_pointer,uint32,uint128,uint32
  107. // CHECK: # returns:
  108. // CHECK: block0: # entry
  109. // CHECK: ty:uint32 %input_len.temp.21 = (arg #1)
  110. // CHECK: ty:uint128 %value.temp.22 = (arg #2)
  111. // CHECK: ty:buffer_pointer %input_ptr.temp.23 = (arg #0)
  112. // CHECK: branchcond (unsigned less (arg #1) < uint32 4), block2, block1
  113. // CHECK: block1: # start_dispatch
  114. // CHECK: ty:uint32 %selector.temp.24 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  115. // CHECK: store (arg #3), %selector.temp.24
  116. // CHECK: switch %selector.temp.24:
  117. // CHECK: default: goto block #2
  118. // CHECK: block2: # fb_or_recv
  119. // CHECK: branchcond (unsigned more (arg #2) > uint128 0), block4, block3
  120. // CHECK: block3: # fallback
  121. // CHECK: return code: function selector invalid
  122. // CHECK: block4: # receive
  123. // CHECK: = call has_receive::has_receive::receive
  124. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  125. receive() payable external {}
  126. }
  127. contract is_payable {
  128. // BEGIN-CHECK: Contract: is_payable
  129. // CHECK: # function polkadot_deploy_dispatch public:false selector: nonpayable:false
  130. // CHECK: # params: buffer_pointer,uint32,uint128,uint32
  131. // CHECK: # returns:
  132. // CHECK: block0: # entry
  133. // CHECK: ty:uint32 %input_len.temp.25 = (arg #1)
  134. // CHECK: ty:uint128 %value.temp.26 = (arg #2)
  135. // CHECK: ty:buffer_pointer %input_ptr.temp.27 = (arg #0)
  136. // CHECK: branchcond (unsigned less (arg #1) < uint32 4), block2, block1
  137. // CHECK: block1: # start_dispatch
  138. // CHECK: ty:uint32 %selector.temp.28 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  139. // CHECK: store (arg #3), %selector.temp.28
  140. // CHECK: switch %selector.temp.28:
  141. // CHECK: case uint32 3576764294: goto block #3
  142. // CHECK: default: goto block #2
  143. // CHECK: block2: # fb_or_recv
  144. // CHECK: return code: function selector invalid
  145. // CHECK: block3: # func_3_dispatch
  146. // CHECK: = call is_payable::is_payable::constructor::861731d5
  147. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  148. // CHECK: # function polkadot_call_dispatch public:false selector: nonpayable:false
  149. // CHECK: # params: buffer_pointer,uint32,uint128,uint32
  150. // CHECK: # returns:
  151. // CHECK: block0: # entry
  152. // CHECK: ty:uint32 %input_len.temp.29 = (arg #1)
  153. // CHECK: ty:uint128 %value.temp.30 = (arg #2)
  154. // CHECK: ty:buffer_pointer %input_ptr.temp.31 = (arg #0)
  155. // CHECK: branchcond (unsigned less (arg #1) < uint32 4), block2, block1
  156. // CHECK: block1: # start_dispatch
  157. // CHECK: ty:uint32 %selector.temp.32 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  158. // CHECK: store (arg #3), %selector.temp.32
  159. // CHECK: switch %selector.temp.32:
  160. // CHECK: case uint32 2018875586: goto block #3
  161. // CHECK: case uint32 2114960382: goto block #6
  162. // CHECK: default: goto block #2
  163. // CHECK: block2: # fb_or_recv
  164. // CHECK: return code: function selector invalid
  165. // CHECK: block3: # func_0_dispatch
  166. // CHECK: branchcond (unsigned more (arg #2) > uint128 0), block4, block5
  167. // CHECK: block4: # func_0_got_value
  168. // CHECK: assert-failure
  169. // CHECK: block5: # func_0_no_value
  170. // CHECK: = call is_payable::is_payable::function::foo
  171. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  172. // CHECK: block6: # func_1_dispatch
  173. // CHECK: = call is_payable::is_payable::function::bar
  174. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  175. function foo() public pure {}
  176. function bar() public payable { require(msg.value > 0); }
  177. }
  178. contract overloaded {
  179. // BEGIN-CHECK: Contract: overloaded
  180. // CHECK: # function polkadot_deploy_dispatch public:false selector: nonpayable:false
  181. // CHECK: block0: # entry
  182. // CHECK: ty:uint32 %input_len.temp.33 = (arg #1)
  183. // CHECK: ty:uint128 %value.temp.34 = (arg #2)
  184. // CHECK: ty:buffer_pointer %input_ptr.temp.35 = (arg #0)
  185. // CHECK: branchcond (unsigned less (arg #1) < uint32 4), block2, block1
  186. // CHECK: block1: # start_dispatch
  187. // CHECK: ty:uint32 %selector.temp.36 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  188. // CHECK: store (arg #3), %selector.temp.36
  189. // CHECK: switch %selector.temp.36:
  190. // CHECK: case uint32 2018875586: goto block #3
  191. // CHECK: case uint32 2114960382: goto block #4
  192. // CHECK: default: goto block #2
  193. // CHECK: block2: # fb_or_recv
  194. // CHECK: return code: function selector invalid
  195. // CHECK: block3: # func_0_dispatch
  196. // CHECK: = call overloaded::overloaded::constructor::c2985578
  197. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  198. // CHECK: block4: # func_1_dispatch
  199. // CHECK: = call overloaded::overloaded::constructor::febb0f7e
  200. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  201. // CHECK: # function polkadot_call_dispatch public:false selector: nonpayable:false
  202. // CHECK: # params: buffer_pointer,uint32,uint128,uint32
  203. // CHECK: # returns:
  204. // CHECK: block0: # entry
  205. // CHECK: ty:uint32 %input_len.temp.37 = (arg #1)
  206. // CHECK: ty:uint128 %value.temp.38 = (arg #2)
  207. // CHECK: ty:buffer_pointer %input_ptr.temp.39 = (arg #0)
  208. // CHECK: branchcond (unsigned less (arg #1) < uint32 4), block2, block1
  209. // CHECK: block1: # start_dispatch
  210. // CHECK: ty:uint32 %selector.temp.42 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  211. // CHECK: store (arg #3), %selector.temp.42
  212. // CHECK: switch %selector.temp.42:
  213. // CHECK: case uint32 4028568102: goto block #3
  214. // CHECK: case uint32 2338643635: goto block #4
  215. // CHECK: default: goto block #2
  216. // CHECK: block2: # fb_or_recv
  217. // CHECK: branchcond (unsigned more (arg #2) > uint128 0), block12, block11
  218. // CHECK: block3: # func_2_dispatch
  219. // CHECK: = call overloaded::overloaded::function::f
  220. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  221. // CHECK: block4: # func_3_dispatch
  222. // CHECK: branchcond (unsigned more (arg #2) > uint128 0), block5, block6
  223. // CHECK: block5: # func_3_got_value
  224. // CHECK: assert-failure
  225. // CHECK: block6: # func_3_no_value
  226. // CHECK: branchcond (unsigned uint32 32 <= (trunc uint32 ((arg #1) - uint32 4))), block7, block8
  227. // CHECK: block7: # inbounds
  228. // CHECK: ty:uint256 %temp.41 = (builtin ReadFromBuffer ((advance ptr: %input_ptr.temp.39, by: uint32 4), uint32 0))
  229. // CHECK: branchcond (unsigned less uint32 32 < (trunc uint32 ((arg #1) - uint32 4))), block9, block10
  230. // CHECK: block8: # out_of_bounds
  231. // CHECK: assert-failure
  232. // CHECK: block9: # not_all_bytes_read
  233. // CHECK: assert-failure
  234. // CHECK: block10: # buffer_read
  235. // CHECK: = call overloaded::overloaded::function::f__uint256 %temp.41
  236. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  237. // CHECK: block11: # fallback
  238. // CHECK: = call overloaded::overloaded::fallback
  239. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  240. // CHECK: block12: # receive
  241. // CHECK: = call overloaded::overloaded::receive
  242. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  243. constructor foo() payable {}
  244. constructor bar() payable {}
  245. function f() public payable {}
  246. function f(uint256 i) public pure {}
  247. fallback() external {}
  248. receive() payable external {}
  249. }
  250. contract simple {
  251. // BEGIN-CHECK: Contract: simple
  252. // CHECK: # function polkadot_deploy_dispatch public:false selector: nonpayable:false
  253. // CHECK: # params: buffer_pointer,uint32,uint128,uint32
  254. // CHECK: # returns:
  255. // CHECK: block0: # entry
  256. // CHECK: ty:uint32 %input_len.temp.43 = (arg #1)
  257. // CHECK: ty:uint128 %value.temp.44 = (arg #2)
  258. // CHECK: ty:buffer_pointer %input_ptr.temp.45 = (arg #0)
  259. // CHECK: branchcond (unsigned less (arg #1) < uint32 4), block2, block1
  260. // CHECK: block1: # start_dispatch
  261. // CHECK: ty:uint32 %selector.temp.46 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  262. // CHECK: store (arg #3), %selector.temp.46
  263. // CHECK: switch %selector.temp.46:
  264. // CHECK: case uint32 3576764294: goto block #3
  265. // NOT-CHECK: case uint32 2018875586: goto block #3
  266. // CHECK: default: goto block #2
  267. // CHECK: block2: # fb_or_recv
  268. // CHECK: return code: function selector invalid
  269. // CHECK: block3: # func_2_dispatch
  270. // CHECK: = call simple::simple::constructor::861731d5
  271. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  272. // CHECK: # function polkadot_call_dispatch public:false selector: nonpayable:false
  273. // CHECK: # params: buffer_pointer,uint32,uint128,uint32
  274. // CHECK: # returns:
  275. // CHECK: block0: # entry
  276. // CHECK: ty:uint32 %input_len.temp.47 = (arg #1)
  277. // CHECK: ty:uint128 %value.temp.48 = (arg #2)
  278. // CHECK: ty:buffer_pointer %input_ptr.temp.49 = (arg #0)
  279. // CHECK: branchcond (unsigned less (arg #1) < uint32 4), block2, block1
  280. // CHECK: block1: # start_dispatch
  281. // CHECK: ty:uint32 %selector.temp.50 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  282. // CHECK: store (arg #3), %selector.temp.50
  283. // CHECK: switch %selector.temp.50:
  284. // CHECK: case uint32 2018875586: goto block #3
  285. // NOT-CHECK: case uint32 3576764294: goto block #3
  286. // CHECK: default: goto block #2
  287. // CHECK: block2: # fb_or_recv
  288. // CHECK: return code: function selector invalid
  289. // CHECK: block3: # func_0_dispatch
  290. // CHECK: branchcond (unsigned more (arg #2) > uint128 0), block4, block5
  291. // CHECK: block4: # func_0_got_value
  292. // CHECK: assert-failure
  293. // CHECK: block5: # func_0_no_value
  294. // CHECK: = call simple::simple::function::foo
  295. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  296. function foo() public pure {}
  297. }
  298. contract nonpayableConstructor {
  299. // BEGIN-CHECK: Contract: nonpayableConstructor
  300. // CHECK: # function polkadot_deploy_dispatch public:false selector: nonpayable:false
  301. // CHECK: switch %selector.temp.54:
  302. // CHECK: case uint32 2371928013: goto block #3
  303. // CHECK: block3: # func_0_dispatch
  304. // CHCEK: branchcond (unsigned more %value.temp.52 > uint128 0), block4, block5
  305. // CHECK: block4: # func_0_got_value
  306. // CHECK: print
  307. // CHECK: assert-failure
  308. // CHECK: block5: # func_0_no_value
  309. // CHECK: = call nonpayableConstructor::nonpayableConstructor::constructor::cdbf608d
  310. constructor () {}
  311. function foo() public pure {}
  312. }