| (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" |
| ) |