| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- // RUN: --target substrate --emit cfg
- contract has_fallback_and_receive {
- // BEGIN-CHECK: Contract: has_fallback_and_receive
- // CHECK: block0: # entry
- // CHECK: ty:uint32 %input_len.temp.1 = (arg #1)
- // CHECK: ty:uint128 %value.temp.2 = (arg #2)
- // CHECK: ty:buffer_pointer %input_ptr.temp.3 = (arg #0)
- // CHECK: branchcond (unsigned less %input_len.temp.1 < uint32 4), block2, block1
- // CHECK: block1: # start_dispatch
- // CHECK: ty:uint32 %selector.temp.4 = (builtin ReadFromBuffer ((arg #0), uint32 0))
- // CHECK: store (arg #3), %selector.temp.4
- // CHECK: switch %selector.temp.4:
- // CHECK: case uint32 3576764294: goto block #3
- // CHECK: default: goto block #2
- // CHECK: block2: # fb_or_recv
- // CHECK: branchcond (unsigned more %value.temp.2 > uint128 0), block5, block4
- // CHECK: block3: # func_3_dispatch
- // CHECK: = call has_fallback_and_receive::has_fallback_and_receive::constructor::861731d5
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block4: # fallback
- // CHECK: = call has_fallback_and_receive::has_fallback_and_receive::fallback
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block5: # receive
- // CHECK: = call has_fallback_and_receive::has_fallback_and_receive::receive
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- fallback() external {}
- receive() payable external {}
- }
- contract has_fallback {
- // BEGIN-CHECK: Contract: has_fallback
- // CHECK: block0: # entry
- // CHECK: ty:uint32 %input_len.temp.5 = (arg #1)
- // CHECK: ty:uint128 %value.temp.6 = (arg #2)
- // CHECK: ty:buffer_pointer %input_ptr.temp.7 = (arg #0)
- // CHECK: branchcond (unsigned less %input_len.temp.5 < uint32 4), block2, block1
- // CHECK: block1: # start_dispatch
- // CHECK: ty:uint32 %selector.temp.8 = (builtin ReadFromBuffer ((arg #0), uint32 0))
- // CHECK: store (arg #3), %selector.temp.8
- // CHECK: switch %selector.temp.8:
- // CHECK: case uint32 3576764294: goto block #3
- // CHECK: default: goto block #2
- // CHECK: block2: # fb_or_recv
- // CHECK: branchcond (unsigned more %value.temp.6 > uint128 0), block5, block4
- // CHECK: block3: # func_2_dispatch
- // CHECK: = call has_fallback::has_fallback::constructor::861731d5
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block4: # fallback
- // CHECK: = call has_fallback::has_fallback::fallback
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block5: # receive
- // CHECK: return code: function selector invalid
- fallback() external {}
- }
- contract has_receive {
- // BEGIN-CHECK: Contract: has_receive
- // CHECK: block0: # entry
- // CHECK: ty:uint32 %input_len.temp.9 = (arg #1)
- // CHECK: ty:uint128 %value.temp.10 = (arg #2)
- // CHECK: ty:buffer_pointer %input_ptr.temp.11 = (arg #0)
- // CHECK: branchcond (unsigned less %input_len.temp.9 < uint32 4), block2, block1
- // CHECK: block1: # start_dispatch
- // CHECK: ty:uint32 %selector.temp.12 = (builtin ReadFromBuffer ((arg #0), uint32 0))
- // CHECK: store (arg #3), %selector.temp.12
- // CHECK: switch %selector.temp.12:
- // CHECK: case uint32 3576764294: goto block #3
- // CHECK: default: goto block #2
- // CHECK: block2: # fb_or_recv
- // CHECK: branchcond (unsigned more %value.temp.10 > uint128 0), block5, block4
- // CHECK: block3: # func_2_dispatch
- // CHECK: = call has_receive::has_receive::constructor::861731d5
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block4: # fallback
- // CHECK: return code: function selector invalid
- // CHECK: block5: # receive
- // CHECK: = call has_receive::has_receive::receive
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- receive() payable external {}
- }
- contract is_payable {
- // BEGIN-CHECK: Contract: is_payable
- // CHECK: block0: # entry
- // CHECK: ty:uint32 %input_len.temp.13 = (arg #1)
- // CHECK: ty:uint128 %value.temp.14 = (arg #2)
- // CHECK: ty:buffer_pointer %input_ptr.temp.15 = (arg #0)
- // CHECK: branchcond (unsigned less %input_len.temp.13 < uint32 4), block2, block1
- // CHECK: block1: # start_dispatch
- // CHECK: ty:uint32 %selector.temp.16 = (builtin ReadFromBuffer ((arg #0), uint32 0))
- // CHECK: store (arg #3), %selector.temp.16
- // CHECK: switch %selector.temp.16:
- // CHECK: case uint32 2018875586: goto block #3
- // CHECK: case uint32 2114960382: goto block #6
- // CHECK: case uint32 3576764294: goto block #7
- // CHECK: default: goto block #2
- // CHECK: block2: # fb_or_recv
- // CHECK: return code: function selector invalid
- // CHECK: block3: # func_0_dispatch
- // CHECK: branchcond (unsigned more %value.temp.14 > uint128 0), block4, block5
- // CHECK: block4: # func_0_got_value
- // CHECK: assert-failure
- // CHECK: block5: # func_0_no_value
- // CHECK: = call is_payable::is_payable::function::foo
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block6: # func_1_dispatch
- // CHECK: = call is_payable::is_payable::function::bar
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block7: # func_3_dispatch
- // CHECK: = call is_payable::is_payable::constructor::861731d5
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- function foo() public pure {}
- function bar() public payable { require(msg.value > 0); }
- }
- contract overloaded {
- // BEGIN-CHECK: Contract: overloaded
- // CHECK: block0: # entry
- // CHECK: ty:uint32 %input_len.temp.17 = (arg #1)
- // CHECK: ty:uint128 %value.temp.18 = (arg #2)
- // CHECK: ty:buffer_pointer %input_ptr.temp.19 = (arg #0)
- // CHECK: branchcond (unsigned less %input_len.temp.17 < uint32 4), block2, block1
- // CHECK: block1: # start_dispatch
- // CHECK: ty:uint32 %selector.temp.22 = (builtin ReadFromBuffer ((arg #0), uint32 0))
- // CHECK: store (arg #3), %selector.temp.22
- // CHECK: switch %selector.temp.22:
- // CHECK: case uint32 2018875586: goto block #3
- // CHECK: case uint32 2114960382: goto block #4
- // CHECK: case uint32 4028568102: goto block #5
- // CHECK: case uint32 2338643635: goto block #6
- // CHECK: default: goto block #2
- // CHECK: block2: # fb_or_recv
- // CHECK: branchcond (unsigned more %value.temp.18 > uint128 0), block14, block13
- // CHECK: block3: # func_0_dispatch
- // CHECK: = call overloaded::overloaded::constructor::c2985578
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block4: # func_1_dispatch
- // CHECK: = call overloaded::overloaded::constructor::febb0f7e
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block5: # func_2_dispatch
- // CHECK: = call overloaded::overloaded::function::f
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block6: # func_3_dispatch
- // CHECK: branchcond (unsigned more %value.temp.18 > uint128 0), block7, block8
- // CHECK: block7: # func_3_got_value
- // CHECK: assert-failure
- // CHECK: block8: # func_3_no_value
- // CHECK: ty:uint32 %temp.20 = (trunc uint32 (%input_len.temp.17 - uint32 4))
- // CHECK: branchcond (unsigned (uint32 0 + uint32 32) <= %temp.20), block9, block10
- // CHECK: block9: # inbounds
- // CHECK: ty:uint256 %temp.21 = (builtin ReadFromBuffer ((advance ptr: %input_ptr.temp.19, by: uint32 4), uint32 0))
- // CHECK: branchcond (unsigned less (uint32 0 + uint32 32) < %temp.20), block11, block12
- // CHECK: block10: # out_of_bounds
- // CHECK: assert-failure
- // CHECK: block11: # not_all_bytes_read
- // CHECK: assert-failure
- // CHECK: block12: # buffer_read
- // CHECK: = call overloaded::overloaded::function::f__uint256 %temp.21
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block13: # fallback
- // CHECK: = call overloaded::overloaded::fallback
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block14: # receive
- // CHECK: = call overloaded::overloaded::receive
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- constructor foo() {}
- constructor bar() {}
- function f() public payable {}
- function f(uint256 i) public pure {}
- fallback() external {}
- receive() payable external {}
- }
- contract simple {
- // BEGIN-CHECK: Contract: simple
- // CHECK: block0: # entry
- // CHECK: ty:uint32 %input_len.temp.23 = (arg #1)
- // CHECK: ty:uint128 %value.temp.24 = (arg #2)
- // CHECK: ty:buffer_pointer %input_ptr.temp.25 = (arg #0)
- // CHECK: branchcond (unsigned less %input_len.temp.23 < uint32 4), block2, block1
- // CHECK: block1: # start_dispatch
- // CHECK: ty:uint32 %selector.temp.26 = (builtin ReadFromBuffer ((arg #0), uint32 0))
- // CHECK: store (arg #3), %selector.temp.26
- // CHECK: switch %selector.temp.26:
- // CHECK: case uint32 2018875586: goto block #3
- // CHECK: case uint32 3576764294: goto block #6
- // CHECK: default: goto block #2
- // CHECK: block2: # fb_or_recv
- // CHECK: return code: function selector invalid
- // CHECK: block3: # func_0_dispatch
- // CHECK: branchcond (unsigned more %value.temp.24 > uint128 0), block4, block5
- // CHECK: block4: # func_0_got_value
- // CHECK: assert-failure
- // CHECK: block5: # func_0_no_value
- // CHECK: = call simple::simple::function::foo
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- // CHECK: block6: # func_2_dispatch
- // CHECK: = call simple::simple::constructor::861731d5
- // CHECK: return data (alloc bytes len uint32 0), data length: uint32 0
- function foo() public pure {}
- }
|