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