blob: c51e6b05719351f154fdfd17fff1b129756aa600 [file] [log] [blame] [edit]
(module
(type $t0 (sub (struct)))
(type $t1 (sub $t0 (struct (field i32))))
(type $t1' (sub $t1 (struct (field i32))))
(type $t2 (sub $t1 (struct (field i32) (field i32))))
(type $t2' (sub $t2 (struct (field i32) (field i32))))
(type $t3 (sub $t2 (struct (field i32) (field i32))))
(global $tab.0 (mut (ref null struct)) (ref.null struct))
(global $tab.1 (mut (ref null struct)) (ref.null struct))
(global $tab.2 (mut (ref null struct)) (ref.null struct))
(global $tab.3 (mut (ref null struct)) (ref.null struct))
(global $tab.4 (mut (ref null struct)) (ref.null struct))
(global $tab.10 (mut (ref null struct)) (ref.null struct))
(global $tab.11 (mut (ref null struct)) (ref.null struct))
(global $tab.12 (mut (ref null struct)) (ref.null struct))
(func $init
(global.set $tab.0 (struct.new_default $t0))
(global.set $tab.10 (struct.new_default $t0))
(global.set $tab.1 (struct.new_default $t1))
(global.set $tab.11 (struct.new_default $t1'))
(global.set $tab.2 (struct.new_default $t2))
(global.set $tab.12 (struct.new_default $t2'))
(global.set $tab.3 (struct.new_default $t3))
(global.set $tab.4 (struct.new_default $t3))
)
(func (export "test-sub")
(call $init)
(drop (ref.cast (ref null $t0) (ref.null struct)))
(drop (ref.cast (ref null $t0) (struct.new_default $t0)))
(drop (ref.cast (ref null $t0) (global.get $tab.0)))
(drop (ref.cast (ref null $t0) (global.get $tab.1)))
(drop (ref.cast (ref null $t0) (global.get $tab.2)))
(drop (ref.cast (ref null $t0) (global.get $tab.3)))
(drop (ref.cast (ref null $t0) (global.get $tab.4)))
(drop (ref.cast (ref $t0) (global.get $tab.0)))
(drop (ref.cast (ref $t0) (global.get $tab.1)))
(drop (ref.cast (ref $t0) (global.get $tab.2)))
(drop (ref.cast (ref $t0) (global.get $tab.3)))
(drop (ref.cast (ref $t0) (global.get $tab.4)))
(drop (ref.cast (ref null $t1) (ref.null struct)))
(drop (ref.cast (ref null $t1) (struct.new_default $t1)))
(drop (ref.cast (ref null $t1) (global.get $tab.1)))
(drop (ref.cast (ref null $t1) (global.get $tab.2)))
(drop (ref.cast (ref $t1) (global.get $tab.1)))
(drop (ref.cast (ref $t1) (global.get $tab.2)))
(drop (ref.cast (ref null $t2) (ref.null struct)))
(drop (ref.cast (ref null $t2) (struct.new_default $t2)))
(drop (ref.cast (ref null $t2) (global.get $tab.2)))
(drop (ref.cast (ref $t2) (global.get $tab.2)))
(drop (ref.cast (ref null $t3) (ref.null struct)))
(drop (ref.cast (ref null $t3) (struct.new_default $t3)))
(drop (ref.cast (ref null $t3) (global.get $tab.3)))
(drop (ref.cast (ref $t3) (global.get $tab.3)))
)
(func (export "test-canon")
(call $init)
(drop (ref.cast (ref null $t0) (global.get $tab.10)))
(drop (ref.cast (ref null $t0) (global.get $tab.11)))
(drop (ref.cast (ref null $t0) (global.get $tab.12)))
(drop (ref.cast (ref null $t1) (global.get $tab.11)))
(drop (ref.cast (ref null $t1) (global.get $tab.12)))
(drop (ref.cast (ref null $t2) (global.get $tab.12)))
)
(func (export "test-ref-test-t0") (result i32)
(ref.test (ref $t0) (struct.new $t0))
)
(func (export "test-ref-test-struct") (result i32)
(ref.test (ref struct) (struct.new $t0))
)
(func (export "test-ref-test-any") (result i32)
(ref.test (ref any) (struct.new $t0))
)
(func (export "test-ref-cast-struct")
(drop
(ref.cast (ref struct) (struct.new $t0))
)
)
(func (export "test-br-on-cast-struct") (result i32)
(drop
(block $l (result (ref struct))
(drop
(br_on_cast $l anyref (ref struct) (struct.new $t0))
)
(return (i32.const 0))
)
)
(i32.const 1)
)
(func (export "test-br-on-cast-null-struct") (result i32)
(drop
(block $l (result (ref null struct))
(drop
(br_on_cast $l anyref structref (ref.null none))
)
(return (i32.const 0))
)
)
(i32.const 1)
)
(func (export "test-br-on-cast-fail-struct") (result i32)
(drop
(block $l (result (ref struct))
(drop
(br_on_cast_fail $l anyref (ref struct) (struct.new $t0))
)
(return (i32.const 0))
)
)
(i32.const 1)
)
(func (export "test-br-on-cast-fail-null-struct") (result i32)
(drop
(block $l (result (ref struct))
(drop
(br_on_cast_fail $l anyref structref (ref.null none))
)
(return (i32.const 0))
)
)
(i32.const 1)
)
(func (export "test-trap-null")
(drop
(ref.cast (ref $t0)
(ref.null $t0)
)
)
)
)
(invoke "test-sub")
(invoke "test-canon")
(assert_return (invoke "test-ref-test-t0") (i32.const 1))
(assert_return (invoke "test-ref-test-struct") (i32.const 1))
(assert_return (invoke "test-ref-test-any") (i32.const 1))
(assert_return (invoke "test-ref-cast-struct"))
(assert_return (invoke "test-br-on-cast-struct") (i32.const 1))
(assert_return (invoke "test-br-on-cast-null-struct") (i32.const 1))
(assert_return (invoke "test-br-on-cast-fail-struct") (i32.const 0))
(assert_return (invoke "test-br-on-cast-fail-null-struct") (i32.const 0))
(assert_trap (invoke "test-trap-null") "null")
(assert_invalid
(module
(type $t0 (struct))
(func (export "test-ref-test-extern") (result i32)
(ref.test (ref extern) (struct.new $t0))
)
)
"common supertype"
)
(assert_invalid
(module
(type $t0 (struct))
(func (export "test-ref-cast-extern") (result anyref)
(ref.cast (ref extern) (struct.new $t0))
)
)
"common supertype"
)
(assert_malformed
(module quote "(func (ref.cast i32 (unreachable)))")
"expected reftype"
)