substrate_dispatch.sol 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. // RUN: --target substrate --emit cfg
  2. contract has_fallback_and_receive {
  3. // BEGIN-CHECK: Contract: has_fallback_and_receive
  4. // CHECK: block0: # entry
  5. // CHECK: ty:uint32 %input_len.temp.1 = (arg #1)
  6. // CHECK: ty:uint128 %value.temp.2 = (arg #2)
  7. // CHECK: ty:buffer_pointer %input_ptr.temp.3 = (arg #0)
  8. // CHECK: branchcond (unsigned less %input_len.temp.1 < uint32 4), block2, block1
  9. // CHECK: block1: # start_dispatch
  10. // CHECK: ty:uint32 %selector.temp.4 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  11. // CHECK: store (arg #3), %selector.temp.4
  12. // CHECK: switch %selector.temp.4:
  13. // CHECK: case uint32 3576764294: goto block #3
  14. // CHECK: default: goto block #2
  15. // CHECK: block2: # fb_or_recv
  16. // CHECK: branchcond (unsigned more %value.temp.2 > uint128 0), block5, block4
  17. // CHECK: block3: # func_3_dispatch
  18. // CHECK: = call has_fallback_and_receive::has_fallback_and_receive::constructor::861731d5
  19. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  20. // CHECK: block4: # fallback
  21. // CHECK: = call has_fallback_and_receive::has_fallback_and_receive::fallback
  22. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  23. // CHECK: block5: # receive
  24. // CHECK: = call has_fallback_and_receive::has_fallback_and_receive::receive
  25. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  26. fallback() external {}
  27. receive() payable external {}
  28. }
  29. contract has_fallback {
  30. // BEGIN-CHECK: Contract: has_fallback
  31. // CHECK: block0: # entry
  32. // CHECK: ty:uint32 %input_len.temp.5 = (arg #1)
  33. // CHECK: ty:uint128 %value.temp.6 = (arg #2)
  34. // CHECK: ty:buffer_pointer %input_ptr.temp.7 = (arg #0)
  35. // CHECK: branchcond (unsigned less %input_len.temp.5 < uint32 4), block2, block1
  36. // CHECK: block1: # start_dispatch
  37. // CHECK: ty:uint32 %selector.temp.8 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  38. // CHECK: store (arg #3), %selector.temp.8
  39. // CHECK: switch %selector.temp.8:
  40. // CHECK: case uint32 3576764294: goto block #3
  41. // CHECK: default: goto block #2
  42. // CHECK: block2: # fb_or_recv
  43. // CHECK: branchcond (unsigned more %value.temp.6 > uint128 0), block5, block4
  44. // CHECK: block3: # func_2_dispatch
  45. // CHECK: = call has_fallback::has_fallback::constructor::861731d5
  46. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  47. // CHECK: block4: # fallback
  48. // CHECK: = call has_fallback::has_fallback::fallback
  49. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  50. // CHECK: block5: # receive
  51. // CHECK: return code: function selector invalid
  52. fallback() external {}
  53. }
  54. contract has_receive {
  55. // BEGIN-CHECK: Contract: has_receive
  56. // CHECK: block0: # entry
  57. // CHECK: ty:uint32 %input_len.temp.9 = (arg #1)
  58. // CHECK: ty:uint128 %value.temp.10 = (arg #2)
  59. // CHECK: ty:buffer_pointer %input_ptr.temp.11 = (arg #0)
  60. // CHECK: branchcond (unsigned less %input_len.temp.9 < uint32 4), block2, block1
  61. // CHECK: block1: # start_dispatch
  62. // CHECK: ty:uint32 %selector.temp.12 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  63. // CHECK: store (arg #3), %selector.temp.12
  64. // CHECK: switch %selector.temp.12:
  65. // CHECK: case uint32 3576764294: goto block #3
  66. // CHECK: default: goto block #2
  67. // CHECK: block2: # fb_or_recv
  68. // CHECK: branchcond (unsigned more %value.temp.10 > uint128 0), block5, block4
  69. // CHECK: block3: # func_2_dispatch
  70. // CHECK: = call has_receive::has_receive::constructor::861731d5
  71. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  72. // CHECK: block4: # fallback
  73. // CHECK: return code: function selector invalid
  74. // CHECK: block5: # receive
  75. // CHECK: = call has_receive::has_receive::receive
  76. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  77. receive() payable external {}
  78. }
  79. contract is_payable {
  80. // BEGIN-CHECK: Contract: is_payable
  81. // CHECK: block0: # entry
  82. // CHECK: ty:uint32 %input_len.temp.13 = (arg #1)
  83. // CHECK: ty:uint128 %value.temp.14 = (arg #2)
  84. // CHECK: ty:buffer_pointer %input_ptr.temp.15 = (arg #0)
  85. // CHECK: branchcond (unsigned less %input_len.temp.13 < uint32 4), block2, block1
  86. // CHECK: block1: # start_dispatch
  87. // CHECK: ty:uint32 %selector.temp.16 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  88. // CHECK: store (arg #3), %selector.temp.16
  89. // CHECK: switch %selector.temp.16:
  90. // CHECK: case uint32 2018875586: goto block #3
  91. // CHECK: case uint32 2114960382: goto block #6
  92. // CHECK: case uint32 3576764294: goto block #7
  93. // CHECK: default: goto block #2
  94. // CHECK: block2: # fb_or_recv
  95. // CHECK: return code: function selector invalid
  96. // CHECK: block3: # func_0_dispatch
  97. // CHECK: branchcond (unsigned more %value.temp.14 > uint128 0), block4, block5
  98. // CHECK: block4: # func_0_got_value
  99. // CHECK: assert-failure
  100. // CHECK: block5: # func_0_no_value
  101. // CHECK: = call is_payable::is_payable::function::foo
  102. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  103. // CHECK: block6: # func_1_dispatch
  104. // CHECK: = call is_payable::is_payable::function::bar
  105. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  106. // CHECK: block7: # func_3_dispatch
  107. // CHECK: = call is_payable::is_payable::constructor::861731d5
  108. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  109. function foo() public pure {}
  110. function bar() public payable { require(msg.value > 0); }
  111. }
  112. contract overloaded {
  113. // BEGIN-CHECK: Contract: overloaded
  114. // CHECK: block0: # entry
  115. // CHECK: ty:uint32 %input_len.temp.17 = (arg #1)
  116. // CHECK: ty:uint128 %value.temp.18 = (arg #2)
  117. // CHECK: ty:buffer_pointer %input_ptr.temp.19 = (arg #0)
  118. // CHECK: branchcond (unsigned less %input_len.temp.17 < uint32 4), block2, block1
  119. // CHECK: block1: # start_dispatch
  120. // CHECK: ty:uint32 %selector.temp.22 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  121. // CHECK: store (arg #3), %selector.temp.22
  122. // CHECK: switch %selector.temp.22:
  123. // CHECK: case uint32 2018875586: goto block #3
  124. // CHECK: case uint32 2114960382: goto block #4
  125. // CHECK: case uint32 4028568102: goto block #5
  126. // CHECK: case uint32 2338643635: goto block #6
  127. // CHECK: default: goto block #2
  128. // CHECK: block2: # fb_or_recv
  129. // CHECK: branchcond (unsigned more %value.temp.18 > uint128 0), block14, block13
  130. // CHECK: block3: # func_0_dispatch
  131. // CHECK: = call overloaded::overloaded::constructor::c2985578
  132. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  133. // CHECK: block4: # func_1_dispatch
  134. // CHECK: = call overloaded::overloaded::constructor::febb0f7e
  135. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  136. // CHECK: block5: # func_2_dispatch
  137. // CHECK: = call overloaded::overloaded::function::f
  138. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  139. // CHECK: block6: # func_3_dispatch
  140. // CHECK: branchcond (unsigned more %value.temp.18 > uint128 0), block7, block8
  141. // CHECK: block7: # func_3_got_value
  142. // CHECK: assert-failure
  143. // CHECK: block8: # func_3_no_value
  144. // CHECK: ty:uint32 %temp.20 = (trunc uint32 (%input_len.temp.17 - uint32 4))
  145. // CHECK: branchcond (unsigned (uint32 0 + uint32 32) <= %temp.20), block9, block10
  146. // CHECK: block9: # inbounds
  147. // CHECK: ty:uint256 %temp.21 = (builtin ReadFromBuffer ((advance ptr: %input_ptr.temp.19, by: uint32 4), uint32 0))
  148. // CHECK: branchcond (unsigned less (uint32 0 + uint32 32) < %temp.20), block11, block12
  149. // CHECK: block10: # out_of_bounds
  150. // CHECK: assert-failure
  151. // CHECK: block11: # not_all_bytes_read
  152. // CHECK: assert-failure
  153. // CHECK: block12: # buffer_read
  154. // CHECK: = call overloaded::overloaded::function::f__uint256 %temp.21
  155. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  156. // CHECK: block13: # fallback
  157. // CHECK: = call overloaded::overloaded::fallback
  158. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  159. // CHECK: block14: # receive
  160. // CHECK: = call overloaded::overloaded::receive
  161. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  162. constructor foo() {}
  163. constructor bar() {}
  164. function f() public payable {}
  165. function f(uint256 i) public pure {}
  166. fallback() external {}
  167. receive() payable external {}
  168. }
  169. contract simple {
  170. // BEGIN-CHECK: Contract: simple
  171. // CHECK: block0: # entry
  172. // CHECK: ty:uint32 %input_len.temp.23 = (arg #1)
  173. // CHECK: ty:uint128 %value.temp.24 = (arg #2)
  174. // CHECK: ty:buffer_pointer %input_ptr.temp.25 = (arg #0)
  175. // CHECK: branchcond (unsigned less %input_len.temp.23 < uint32 4), block2, block1
  176. // CHECK: block1: # start_dispatch
  177. // CHECK: ty:uint32 %selector.temp.26 = (builtin ReadFromBuffer ((arg #0), uint32 0))
  178. // CHECK: store (arg #3), %selector.temp.26
  179. // CHECK: switch %selector.temp.26:
  180. // CHECK: case uint32 2018875586: goto block #3
  181. // CHECK: case uint32 3576764294: goto block #6
  182. // CHECK: default: goto block #2
  183. // CHECK: block2: # fb_or_recv
  184. // CHECK: return code: function selector invalid
  185. // CHECK: block3: # func_0_dispatch
  186. // CHECK: branchcond (unsigned more %value.temp.24 > uint128 0), block4, block5
  187. // CHECK: block4: # func_0_got_value
  188. // CHECK: assert-failure
  189. // CHECK: block5: # func_0_no_value
  190. // CHECK: = call simple::simple::function::foo
  191. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  192. // CHECK: block6: # func_2_dispatch
  193. // CHECK: = call simple::simple::constructor::861731d5
  194. // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
  195. function foo() public pure {}
  196. }