summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/spec/gc/type-subtyping.wast.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/wasm/spec/gc/type-subtyping.wast.js')
-rw-r--r--js/src/jit-test/tests/wasm/spec/gc/type-subtyping.wast.js943
1 files changed, 943 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/wasm/spec/gc/type-subtyping.wast.js b/js/src/jit-test/tests/wasm/spec/gc/type-subtyping.wast.js
new file mode 100644
index 0000000000..474789c145
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/spec/gc/type-subtyping.wast.js
@@ -0,0 +1,943 @@
+/* Copyright 2021 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// ./test/core/gc/type-subtyping.wast
+
+// ./test/core/gc/type-subtyping.wast:3
+let $0 = instantiate(`(module
+ (type $$e0 (sub (array i32)))
+ (type $$e1 (sub $$e0 (array i32)))
+
+ (type $$e2 (sub (array anyref)))
+ (type $$e3 (sub (array (ref null $$e0))))
+ (type $$e4 (sub (array (ref $$e1))))
+
+ (type $$m1 (sub (array (mut i32))))
+ (type $$m2 (sub $$m1 (array (mut i32))))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:15
+let $1 = instantiate(`(module
+ (type $$e0 (sub (struct)))
+ (type $$e1 (sub $$e0 (struct)))
+ (type $$e2 (sub $$e1 (struct (field i32))))
+ (type $$e3 (sub $$e2 (struct (field i32 (ref null $$e0)))))
+ (type $$e4 (sub $$e3 (struct (field i32 (ref $$e0) (mut i64)))))
+ (type $$e5 (sub $$e4 (struct (field i32 (ref $$e1) (mut i64)))))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:24
+let $2 = instantiate(`(module
+ (type $$s (sub (struct)))
+ (type $$s' (sub $$s (struct)))
+
+ (type $$f1 (sub (func (param (ref $$s')) (result anyref))))
+ (type $$f2 (sub $$f1 (func (param (ref $$s)) (result (ref any)))))
+ (type $$f3 (sub $$f2 (func (param (ref null $$s)) (result (ref $$s)))))
+ (type $$f4 (sub $$f3 (func (param (ref null struct)) (result (ref $$s')))))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:37
+let $3 = instantiate(`(module
+ (type $$t (sub (struct (field anyref))))
+ (rec (type $$r (sub $$t (struct (field (ref $$r))))))
+ (type $$t' (sub $$r (struct (field (ref $$r) i32))))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:43
+let $4 = instantiate(`(module
+ (rec
+ (type $$r1 (sub (struct (field i32 (ref $$r1)))))
+ )
+ (rec
+ (type $$r2 (sub $$r1 (struct (field i32 (ref $$r3)))))
+ (type $$r3 (sub $$r1 (struct (field i32 (ref $$r2)))))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:53
+let $5 = instantiate(`(module
+ (rec
+ (type $$a1 (sub (struct (field i32 (ref $$a2)))))
+ (type $$a2 (sub (struct (field i64 (ref $$a1)))))
+ )
+ (rec
+ (type $$b1 (sub $$a2 (struct (field i64 (ref $$a1) i32))))
+ (type $$b2 (sub $$a1 (struct (field i32 (ref $$a2) i32))))
+ (type $$b3 (sub $$a2 (struct (field i64 (ref $$b2) i32))))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:68
+let $6 = instantiate(`(module
+ (rec
+ (type $$t1 (sub (func (param i32 (ref $$t3)))))
+ (type $$t2 (sub $$t1 (func (param i32 (ref $$t2)))))
+ (type $$t3 (sub $$t2 (func (param i32 (ref $$t1)))))
+ )
+
+ (func $$f1 (param $$r (ref $$t1))
+ (call $$f1 (local.get $$r))
+ )
+ (func $$f2 (param $$r (ref $$t2))
+ (call $$f1 (local.get $$r))
+ (call $$f2 (local.get $$r))
+ )
+ (func $$f3 (param $$r (ref $$t3))
+ (call $$f1 (local.get $$r))
+ (call $$f2 (local.get $$r))
+ (call $$f3 (local.get $$r))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:89
+let $7 = instantiate(`(module
+ (rec
+ (type $$t1 (sub (func (result i32 (ref $$u1)))))
+ (type $$u1 (sub (func (result f32 (ref $$t1)))))
+ )
+
+ (rec
+ (type $$t2 (sub $$t1 (func (result i32 (ref $$u3)))))
+ (type $$u2 (sub $$u1 (func (result f32 (ref $$t3)))))
+ (type $$t3 (sub $$t1 (func (result i32 (ref $$u2)))))
+ (type $$u3 (sub $$u1 (func (result f32 (ref $$t2)))))
+ )
+
+ (func $$f1 (param $$r (ref $$t1))
+ (call $$f1 (local.get $$r))
+ )
+ (func $$f2 (param $$r (ref $$t2))
+ (call $$f1 (local.get $$r))
+ (call $$f2 (local.get $$r))
+ )
+ (func $$f3 (param $$r (ref $$t3))
+ (call $$f1 (local.get $$r))
+ (call $$f3 (local.get $$r))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:115
+let $8 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$f2 (sub (func))) (type (struct (field (ref $$f2)))))
+ (rec (type $$g1 (sub $$f1 (func))) (type (struct)))
+ (rec (type $$g2 (sub $$f2 (func))) (type (struct)))
+ (func $$g (type $$g2))
+ (global (ref $$g1) (ref.func $$g))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:124
+let $9 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type $$s1 (sub (struct (field (ref $$f1))))))
+ (rec (type $$f2 (sub (func))) (type $$s2 (sub (struct (field (ref $$f2))))))
+ (rec
+ (type $$g1 (sub $$f1 (func)))
+ (type (sub $$s1 (struct (field (ref $$f1) (ref $$f1) (ref $$f2) (ref $$f2) (ref $$g1)))))
+ )
+ (rec
+ (type $$g2 (sub $$f2 (func)))
+ (type (sub $$s2 (struct (field (ref $$f1) (ref $$f2) (ref $$f1) (ref $$f2) (ref $$g2)))))
+ )
+ (func $$g (type $$g2))
+ (global (ref $$g1) (ref.func $$g))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:139
+assert_invalid(
+ () => instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$f2 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$g1 (sub $$f1 (func))) (type (struct)))
+ (rec (type $$g2 (sub $$f2 (func))) (type (struct)))
+ (func $$g (type $$g2))
+ (global (ref $$g1) (ref.func $$g))
+ )`),
+ `type mismatch`,
+);
+
+// ./test/core/gc/type-subtyping.wast:151
+let $10 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$f2 (sub (func))) (type (struct (field (ref $$f2)))))
+ (rec (type $$g (sub $$f1 (func))) (type (struct)))
+ (func $$g (type $$g))
+ (global (ref $$f1) (ref.func $$g))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:159
+let $11 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type $$s1 (sub (struct (field (ref $$f1))))))
+ (rec (type $$f2 (sub (func))) (type $$s2 (sub (struct (field (ref $$f2))))))
+ (rec
+ (type $$g1 (sub $$f1 (func)))
+ (type (sub $$s1 (struct (field (ref $$f1) (ref $$f1) (ref $$f2) (ref $$f2) (ref $$g1)))))
+ )
+ (rec
+ (type $$g2 (sub $$f2 (func)))
+ (type (sub $$s2 (struct (field (ref $$f1) (ref $$f2) (ref $$f1) (ref $$f2) (ref $$g2)))))
+ )
+ (rec (type $$h (sub $$g2 (func))) (type (struct)))
+ (func $$h (type $$h))
+ (global (ref $$f1) (ref.func $$h))
+ (global (ref $$g1) (ref.func $$h))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:177
+let $12 = instantiate(`(module
+ (rec (type $$f11 (sub (func (result (ref func))))) (type $$f12 (sub $$f11 (func (result (ref $$f11))))))
+ (rec (type $$f21 (sub (func (result (ref func))))) (type $$f22 (sub $$f21 (func (result (ref $$f21))))))
+ (func $$f11 (type $$f11) (unreachable))
+ (func $$f12 (type $$f12) (unreachable))
+ (global (ref $$f11) (ref.func $$f11))
+ (global (ref $$f21) (ref.func $$f11))
+ (global (ref $$f12) (ref.func $$f12))
+ (global (ref $$f22) (ref.func $$f12))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:188
+let $13 = instantiate(`(module
+ (rec (type $$f11 (sub (func (result (ref func))))) (type $$f12 (sub $$f11 (func (result (ref $$f11))))))
+ (rec (type $$f21 (sub (func (result (ref func))))) (type $$f22 (sub $$f21 (func (result (ref $$f21))))))
+ (rec (type $$g11 (sub $$f11 (func (result (ref func))))) (type $$g12 (sub $$g11 (func (result (ref $$g11))))))
+ (rec (type $$g21 (sub $$f21 (func (result (ref func))))) (type $$g22 (sub $$g21 (func (result (ref $$g21))))))
+ (func $$g11 (type $$g11) (unreachable))
+ (func $$g12 (type $$g12) (unreachable))
+ (global (ref $$f11) (ref.func $$g11))
+ (global (ref $$f21) (ref.func $$g11))
+ (global (ref $$f11) (ref.func $$g12))
+ (global (ref $$f21) (ref.func $$g12))
+ (global (ref $$g11) (ref.func $$g11))
+ (global (ref $$g21) (ref.func $$g11))
+ (global (ref $$g12) (ref.func $$g12))
+ (global (ref $$g22) (ref.func $$g12))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:205
+assert_invalid(
+ () => instantiate(`(module
+ (rec (type $$f11 (sub (func))) (type $$f12 (sub $$f11 (func))))
+ (rec (type $$f21 (sub (func))) (type $$f22 (sub $$f11 (func))))
+ (func $$f (type $$f21))
+ (global (ref $$f11) (ref.func $$f))
+ )`),
+ `type mismatch`,
+);
+
+// ./test/core/gc/type-subtyping.wast:215
+assert_invalid(
+ () => instantiate(`(module
+ (rec (type $$f01 (sub (func))) (type $$f02 (sub $$f01 (func))))
+ (rec (type $$f11 (sub (func))) (type $$f12 (sub $$f01 (func))))
+ (rec (type $$f21 (sub (func))) (type $$f22 (sub $$f11 (func))))
+ (func $$f (type $$f21))
+ (global (ref $$f11) (ref.func $$f))
+ )`),
+ `type mismatch`,
+);
+
+// ./test/core/gc/type-subtyping.wast:229
+let $14 = instantiate(`(module
+ (type $$t0 (sub (func (result (ref null func)))))
+ (rec (type $$t1 (sub $$t0 (func (result (ref null $$t1))))))
+ (rec (type $$t2 (sub $$t1 (func (result (ref null $$t2))))))
+
+ (func $$f0 (type $$t0) (ref.null func))
+ (func $$f1 (type $$t1) (ref.null $$t1))
+ (func $$f2 (type $$t2) (ref.null $$t2))
+ (table funcref (elem $$f0 $$f1 $$f2))
+
+ (func (export "run")
+ (block (result (ref null func)) (call_indirect (type $$t0) (i32.const 0)))
+ (block (result (ref null func)) (call_indirect (type $$t0) (i32.const 1)))
+ (block (result (ref null func)) (call_indirect (type $$t0) (i32.const 2)))
+ (block (result (ref null $$t1)) (call_indirect (type $$t1) (i32.const 1)))
+ (block (result (ref null $$t1)) (call_indirect (type $$t1) (i32.const 2)))
+ (block (result (ref null $$t2)) (call_indirect (type $$t2) (i32.const 2)))
+
+ (block (result (ref null $$t0)) (ref.cast (ref $$t0) (table.get (i32.const 0))))
+ (block (result (ref null $$t0)) (ref.cast (ref $$t0) (table.get (i32.const 1))))
+ (block (result (ref null $$t0)) (ref.cast (ref $$t0) (table.get (i32.const 2))))
+ (block (result (ref null $$t1)) (ref.cast (ref $$t1) (table.get (i32.const 1))))
+ (block (result (ref null $$t1)) (ref.cast (ref $$t1) (table.get (i32.const 2))))
+ (block (result (ref null $$t2)) (ref.cast (ref $$t2) (table.get (i32.const 2))))
+ (br 0)
+ )
+
+ (func (export "fail1")
+ (block (result (ref null $$t1)) (call_indirect (type $$t1) (i32.const 0)))
+ (br 0)
+ )
+ (func (export "fail2")
+ (block (result (ref null $$t1)) (call_indirect (type $$t2) (i32.const 0)))
+ (br 0)
+ )
+ (func (export "fail3")
+ (block (result (ref null $$t1)) (call_indirect (type $$t2) (i32.const 1)))
+ (br 0)
+ )
+
+ (func (export "fail4")
+ (ref.cast (ref $$t1) (table.get (i32.const 0)))
+ (br 0)
+ )
+ (func (export "fail5")
+ (ref.cast (ref $$t2) (table.get (i32.const 0)))
+ (br 0)
+ )
+ (func (export "fail6")
+ (ref.cast (ref $$t2) (table.get (i32.const 1)))
+ (br 0)
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:282
+assert_return(() => invoke($14, `run`, []), []);
+
+// ./test/core/gc/type-subtyping.wast:283
+assert_trap(() => invoke($14, `fail1`, []), `indirect call`);
+
+// ./test/core/gc/type-subtyping.wast:284
+assert_trap(() => invoke($14, `fail2`, []), `indirect call`);
+
+// ./test/core/gc/type-subtyping.wast:285
+assert_trap(() => invoke($14, `fail3`, []), `indirect call`);
+
+// ./test/core/gc/type-subtyping.wast:286
+assert_trap(() => invoke($14, `fail4`, []), `cast`);
+
+// ./test/core/gc/type-subtyping.wast:287
+assert_trap(() => invoke($14, `fail5`, []), `cast`);
+
+// ./test/core/gc/type-subtyping.wast:288
+assert_trap(() => invoke($14, `fail6`, []), `cast`);
+
+// ./test/core/gc/type-subtyping.wast:290
+let $15 = instantiate(`(module
+ (type $$t1 (sub (func)))
+ (type $$t2 (sub final (func)))
+
+ (func $$f1 (type $$t1))
+ (func $$f2 (type $$t2))
+ (table funcref (elem $$f1 $$f2))
+
+ (func (export "fail1")
+ (block (call_indirect (type $$t1) (i32.const 1)))
+ )
+ (func (export "fail2")
+ (block (call_indirect (type $$t2) (i32.const 0)))
+ )
+
+ (func (export "fail3")
+ (ref.cast (ref $$t1) (table.get (i32.const 1)))
+ (drop)
+ )
+ (func (export "fail4")
+ (ref.cast (ref $$t2) (table.get (i32.const 0)))
+ (drop)
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:314
+assert_trap(() => invoke($15, `fail1`, []), `indirect call`);
+
+// ./test/core/gc/type-subtyping.wast:315
+assert_trap(() => invoke($15, `fail2`, []), `indirect call`);
+
+// ./test/core/gc/type-subtyping.wast:316
+assert_trap(() => invoke($15, `fail3`, []), `cast`);
+
+// ./test/core/gc/type-subtyping.wast:317
+assert_trap(() => invoke($15, `fail4`, []), `cast`);
+
+// ./test/core/gc/type-subtyping.wast:320
+let $16 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$f2 (sub (func))) (type (struct (field (ref $$f2)))))
+ (rec (type $$g1 (sub $$f1 (func))) (type (struct)))
+ (rec (type $$g2 (sub $$f2 (func))) (type (struct)))
+ (func $$g (type $$g2)) (elem declare func $$g)
+ (func (export "run") (result i32)
+ (ref.test (ref $$g1) (ref.func $$g))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:330
+assert_return(() => invoke($16, `run`, []), [value("i32", 1)]);
+
+// ./test/core/gc/type-subtyping.wast:332
+let $17 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type $$s1 (sub (struct (field (ref $$f1))))))
+ (rec (type $$f2 (sub (func))) (type $$s2 (sub (struct (field (ref $$f2))))))
+ (rec
+ (type $$g1 (sub $$f1 (func)))
+ (type (sub $$s1 (struct (field (ref $$f1) (ref $$f1) (ref $$f2) (ref $$f2) (ref $$g1)))))
+ )
+ (rec
+ (type $$g2 (sub $$f2 (func)))
+ (type (sub $$s2 (struct (field (ref $$f1) (ref $$f2) (ref $$f1) (ref $$f2) (ref $$g2)))))
+ )
+ (func $$g (type $$g2)) (elem declare func $$g)
+ (func (export "run") (result i32)
+ (ref.test (ref $$g1) (ref.func $$g))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:348
+assert_return(() => invoke($17, `run`, []), [value("i32", 1)]);
+
+// ./test/core/gc/type-subtyping.wast:350
+let $18 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$f2 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$g1 (sub $$f1 (func))) (type (struct)))
+ (rec (type $$g2 (sub $$f2 (func))) (type (struct)))
+ (func $$g (type $$g2)) (elem declare func $$g)
+ (func (export "run") (result i32)
+ (ref.test (ref $$g1) (ref.func $$g))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:360
+assert_return(() => invoke($18, `run`, []), [value("i32", 0)]);
+
+// ./test/core/gc/type-subtyping.wast:362
+let $19 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$f2 (sub (func))) (type (struct (field (ref $$f2)))))
+ (rec (type $$g (sub $$f1 (func))) (type (struct)))
+ (func $$g (type $$g)) (elem declare func $$g)
+ (func (export "run") (result i32)
+ (ref.test (ref $$f1) (ref.func $$g))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:371
+assert_return(() => invoke($19, `run`, []), [value("i32", 1)]);
+
+// ./test/core/gc/type-subtyping.wast:373
+let $20 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type $$s1 (sub (struct (field (ref $$f1))))))
+ (rec (type $$f2 (sub (func))) (type $$s2 (sub (struct (field (ref $$f2))))))
+ (rec
+ (type $$g1 (sub $$f1 (func)))
+ (type (sub $$s1 (struct (field (ref $$f1) (ref $$f1) (ref $$f2) (ref $$f2) (ref $$g1)))))
+ )
+ (rec
+ (type $$g2 (sub $$f2 (func)))
+ (type (sub $$s2 (struct (field (ref $$f1) (ref $$f2) (ref $$f1) (ref $$f2) (ref $$g2)))))
+ )
+ (rec (type $$h (sub $$g2 (func))) (type (struct)))
+ (func $$h (type $$h)) (elem declare func $$h)
+ (func (export "run") (result i32 i32)
+ (ref.test (ref $$f1) (ref.func $$h))
+ (ref.test (ref $$g1) (ref.func $$h))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:391
+assert_return(() => invoke($20, `run`, []), [value("i32", 1), value("i32", 1)]);
+
+// ./test/core/gc/type-subtyping.wast:394
+let $21 = instantiate(`(module
+ (rec (type $$f11 (sub (func (result (ref func))))) (type $$f12 (sub $$f11 (func (result (ref $$f11))))))
+ (rec (type $$f21 (sub (func (result (ref func))))) (type $$f22 (sub $$f21 (func (result (ref $$f21))))))
+ (func $$f11 (type $$f11) (unreachable)) (elem declare func $$f11)
+ (func $$f12 (type $$f12) (unreachable)) (elem declare func $$f12)
+ (func (export "run") (result i32 i32 i32 i32)
+ (ref.test (ref $$f11) (ref.func $$f11))
+ (ref.test (ref $$f21) (ref.func $$f11))
+ (ref.test (ref $$f12) (ref.func $$f12))
+ (ref.test (ref $$f22) (ref.func $$f12))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:406
+assert_return(
+ () => invoke($21, `run`, []),
+ [value("i32", 1), value("i32", 1), value("i32", 1), value("i32", 1)],
+);
+
+// ./test/core/gc/type-subtyping.wast:410
+let $22 = instantiate(`(module
+ (rec (type $$f11 (sub (func (result (ref func))))) (type $$f12 (sub $$f11 (func (result (ref $$f11))))))
+ (rec (type $$f21 (sub (func (result (ref func))))) (type $$f22 (sub $$f21 (func (result (ref $$f21))))))
+ (rec (type $$g11 (sub $$f11 (func (result (ref func))))) (type $$g12 (sub $$g11 (func (result (ref $$g11))))))
+ (rec (type $$g21 (sub $$f21 (func (result (ref func))))) (type $$g22 (sub $$g21 (func (result (ref $$g21))))))
+ (func $$g11 (type $$g11) (unreachable)) (elem declare func $$g11)
+ (func $$g12 (type $$g12) (unreachable)) (elem declare func $$g12)
+ (func (export "run") (result i32 i32 i32 i32 i32 i32 i32 i32)
+ (ref.test (ref $$f11) (ref.func $$g11))
+ (ref.test (ref $$f21) (ref.func $$g11))
+ (ref.test (ref $$f11) (ref.func $$g12))
+ (ref.test (ref $$f21) (ref.func $$g12))
+ (ref.test (ref $$g11) (ref.func $$g11))
+ (ref.test (ref $$g21) (ref.func $$g11))
+ (ref.test (ref $$g12) (ref.func $$g12))
+ (ref.test (ref $$g22) (ref.func $$g12))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:428
+assert_return(
+ () => invoke($22, `run`, []),
+ [
+ value("i32", 1),
+ value("i32", 1),
+ value("i32", 1),
+ value("i32", 1),
+ value("i32", 1),
+ value("i32", 1),
+ value("i32", 1),
+ value("i32", 1),
+ ],
+);
+
+// ./test/core/gc/type-subtyping.wast:433
+let $23 = instantiate(`(module
+ (rec (type $$f11 (sub (func))) (type $$f12 (sub $$f11 (func))))
+ (rec (type $$f21 (sub (func))) (type $$f22 (sub $$f11 (func))))
+ (func $$f (type $$f21)) (elem declare func $$f)
+ (func (export "run") (result i32)
+ (ref.test (ref $$f11) (ref.func $$f))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:441
+assert_return(() => invoke($23, `run`, []), [value("i32", 0)]);
+
+// ./test/core/gc/type-subtyping.wast:443
+let $24 = instantiate(`(module
+ (rec (type $$f01 (sub (func))) (type $$f02 (sub $$f01 (func))))
+ (rec (type $$f11 (sub (func))) (type $$f12 (sub $$f01 (func))))
+ (rec (type $$f21 (sub (func))) (type $$f22 (sub $$f11 (func))))
+ (func $$f (type $$f21)) (elem declare func $$f)
+ (func (export "run") (result i32)
+ (ref.test (ref $$f11) (ref.func $$f))
+ )
+)`);
+
+// ./test/core/gc/type-subtyping.wast:452
+assert_return(() => invoke($24, `run`, []), [value("i32", 0)]);
+
+// ./test/core/gc/type-subtyping.wast:458
+let $25 = instantiate(`(module
+ (type $$t0 (sub (func (result (ref null func)))))
+ (rec (type $$t1 (sub $$t0 (func (result (ref null $$t1))))))
+ (rec (type $$t2 (sub $$t1 (func (result (ref null $$t2))))))
+
+ (func (export "f0") (type $$t0) (ref.null func))
+ (func (export "f1") (type $$t1) (ref.null $$t1))
+ (func (export "f2") (type $$t2) (ref.null $$t2))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:467
+register($25, `M`);
+
+// ./test/core/gc/type-subtyping.wast:469
+let $26 = instantiate(`(module
+ (type $$t0 (sub (func (result (ref null func)))))
+ (rec (type $$t1 (sub $$t0 (func (result (ref null $$t1))))))
+ (rec (type $$t2 (sub $$t1 (func (result (ref null $$t2))))))
+
+ (func (import "M" "f0") (type $$t0))
+ (func (import "M" "f1") (type $$t0))
+ (func (import "M" "f1") (type $$t1))
+ (func (import "M" "f2") (type $$t0))
+ (func (import "M" "f2") (type $$t1))
+ (func (import "M" "f2") (type $$t2))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:482
+assert_unlinkable(
+ () => instantiate(`(module
+ (type $$t0 (sub (func (result (ref null func)))))
+ (rec (type $$t1 (sub $$t0 (func (result (ref null $$t1))))))
+ (rec (type $$t2 (sub $$t1 (func (result (ref null $$t2))))))
+ (func (import "M" "f0") (type $$t1))
+ )`),
+ `incompatible import type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:492
+assert_unlinkable(
+ () => instantiate(`(module
+ (type $$t0 (sub (func (result (ref null func)))))
+ (rec (type $$t1 (sub $$t0 (func (result (ref null $$t1))))))
+ (rec (type $$t2 (sub $$t1 (func (result (ref null $$t2))))))
+ (func (import "M" "f0") (type $$t2))
+ )`),
+ `incompatible import type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:502
+assert_unlinkable(
+ () => instantiate(`(module
+ (type $$t0 (sub (func (result (ref null func)))))
+ (rec (type $$t1 (sub $$t0 (func (result (ref null $$t1))))))
+ (rec (type $$t2 (sub $$t1 (func (result (ref null $$t2))))))
+ (func (import "M" "f1") (type $$t2))
+ )`),
+ `incompatible import type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:512
+let $27 = instantiate(`(module
+ (type $$t1 (sub (func)))
+ (type $$t2 (sub final (func)))
+ (func (export "f1") (type $$t1))
+ (func (export "f2") (type $$t2))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:518
+register($27, `M2`);
+
+// ./test/core/gc/type-subtyping.wast:520
+assert_unlinkable(
+ () => instantiate(`(module
+ (type $$t1 (sub (func)))
+ (type $$t2 (sub final (func)))
+ (func (import "M2" "f1") (type $$t2))
+ )`),
+ `incompatible import type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:528
+assert_unlinkable(
+ () => instantiate(`(module
+ (type $$t1 (sub (func)))
+ (type $$t2 (sub final (func)))
+ (func (import "M2" "f2") (type $$t1))
+ )`),
+ `incompatible import type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:538
+let $28 = instantiate(`(module
+ (rec (type $$f2 (sub (func))) (type (struct (field (ref $$f2)))))
+ (rec (type $$g2 (sub $$f2 (func))) (type (struct)))
+ (func (export "g") (type $$g2))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:543
+register($28, `M3`);
+
+// ./test/core/gc/type-subtyping.wast:544
+let $29 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$g1 (sub $$f1 (func))) (type (struct)))
+ (func (import "M3" "g") (type $$g1))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:550
+let $30 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type $$s1 (sub (struct (field (ref $$f1))))))
+ (rec (type $$f2 (sub (func))) (type $$s2 (sub (struct (field (ref $$f2))))))
+ (rec
+ (type $$g2 (sub $$f2 (func)))
+ (type (sub $$s2 (struct (field (ref $$f1) (ref $$f2) (ref $$f1) (ref $$f2) (ref $$g2)))))
+ )
+ (func (export "g") (type $$g2))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:559
+register($30, `M4`);
+
+// ./test/core/gc/type-subtyping.wast:560
+let $31 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type $$s1 (sub (struct (field (ref $$f1))))))
+ (rec (type $$f2 (sub (func))) (type $$s2 (sub (struct (field (ref $$f2))))))
+ (rec
+ (type $$g1 (sub $$f1 (func)))
+ (type (sub $$s1 (struct (field (ref $$f1) (ref $$f1) (ref $$f2) (ref $$f2) (ref $$g1)))))
+ )
+ (func (import "M4" "g") (type $$g1))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:570
+let $32 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$f2 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$g2 (sub $$f2 (func))) (type (struct)))
+ (func (export "g") (type $$g2))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:576
+register($32, `M5`);
+
+// ./test/core/gc/type-subtyping.wast:577
+assert_unlinkable(
+ () => instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$g1 (sub $$f1 (func))) (type (struct)))
+ (func (import "M5" "g") (type $$g1))
+ )`),
+ `incompatible import`,
+);
+
+// ./test/core/gc/type-subtyping.wast:586
+let $33 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$f2 (sub (func))) (type (struct (field (ref $$f2)))))
+ (rec (type $$g (sub $$f1 (func))) (type (struct)))
+ (func (export "g") (type $$g))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:592
+register($33, `M6`);
+
+// ./test/core/gc/type-subtyping.wast:593
+let $34 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type (struct (field (ref $$f1)))))
+ (rec (type $$f2 (sub (func))) (type (struct (field (ref $$f2)))))
+ (rec (type $$g (sub $$f1 (func))) (type (struct)))
+ (func (import "M6" "g") (type $$f1))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:600
+let $35 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type $$s1 (sub (struct (field (ref $$f1))))))
+ (rec (type $$f2 (sub (func))) (type $$s2 (sub (struct (field (ref $$f2))))))
+ (rec
+ (type $$g2 (sub $$f2 (func)))
+ (type (sub $$s2 (struct (field (ref $$f1) (ref $$f2) (ref $$f1) (ref $$f2) (ref $$g2)))))
+ )
+ (rec (type $$h (sub $$g2 (func))) (type (struct)))
+ (func (export "h") (type $$h))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:610
+register($35, `M7`);
+
+// ./test/core/gc/type-subtyping.wast:611
+let $36 = instantiate(`(module
+ (rec (type $$f1 (sub (func))) (type $$s1 (sub (struct (field (ref $$f1))))))
+ (rec (type $$f2 (sub (func))) (type $$s2 (sub (struct (field (ref $$f2))))))
+ (rec
+ (type $$g1 (sub $$f1 (func)))
+ (type (sub $$s1 (struct (field (ref $$f1) (ref $$f1) (ref $$f2) (ref $$f2) (ref $$g1)))))
+ )
+ (rec (type $$h (sub $$g1 (func))) (type (struct)))
+ (func (import "M7" "h") (type $$f1))
+ (func (import "M7" "h") (type $$g1))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:624
+let $37 = instantiate(`(module
+ (rec (type $$f11 (sub (func (result (ref func))))) (type $$f12 (sub $$f11 (func (result (ref $$f11))))))
+ (rec (type $$f21 (sub (func (result (ref func))))) (type $$f22 (sub $$f21 (func (result (ref $$f21))))))
+ (func (export "f11") (type $$f11) (unreachable))
+ (func (export "f12") (type $$f12) (unreachable))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:630
+register($37, `M8`);
+
+// ./test/core/gc/type-subtyping.wast:631
+let $38 = instantiate(`(module
+ (rec (type $$f11 (sub (func (result (ref func))))) (type $$f12 (sub $$f11 (func (result (ref $$f11))))))
+ (rec (type $$f21 (sub (func (result (ref func))))) (type $$f22 (sub $$f21 (func (result (ref $$f21))))))
+ (func (import "M8" "f11") (type $$f11))
+ (func (import "M8" "f11") (type $$f21))
+ (func (import "M8" "f12") (type $$f12))
+ (func (import "M8" "f12") (type $$f22))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:640
+let $39 = instantiate(`(module
+ (rec (type $$f11 (sub (func (result (ref func))))) (type $$f12 (sub $$f11 (func (result (ref $$f11))))))
+ (rec (type $$f21 (sub (func (result (ref func))))) (type $$f22 (sub $$f21 (func (result (ref $$f21))))))
+ (rec (type $$g11 (sub $$f11 (func (result (ref func))))) (type $$g12 (sub $$g11 (func (result (ref $$g11))))))
+ (rec (type $$g21 (sub $$f21 (func (result (ref func))))) (type $$g22 (sub $$g21 (func (result (ref $$g21))))))
+ (func (export "g11") (type $$g11) (unreachable))
+ (func (export "g12") (type $$g12) (unreachable))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:648
+register($39, `M9`);
+
+// ./test/core/gc/type-subtyping.wast:649
+let $40 = instantiate(`(module
+ (rec (type $$f11 (sub (func (result (ref func))))) (type $$f12 (sub $$f11 (func (result (ref $$f11))))))
+ (rec (type $$f21 (sub (func (result (ref func))))) (type $$f22 (sub $$f21 (func (result (ref $$f21))))))
+ (rec (type $$g11 (sub $$f11 (func (result (ref func))))) (type $$g12 (sub $$g11 (func (result (ref $$g11))))))
+ (rec (type $$g21 (sub $$f21 (func (result (ref func))))) (type $$g22 (sub $$g21 (func (result (ref $$g21))))))
+ (func (import "M9" "g11") (type $$f11))
+ (func (import "M9" "g11") (type $$f21))
+ (func (import "M9" "g12") (type $$f11))
+ (func (import "M9" "g12") (type $$f21))
+ (func (import "M9" "g11") (type $$g11))
+ (func (import "M9" "g11") (type $$g21))
+ (func (import "M9" "g12") (type $$g12))
+ (func (import "M9" "g12") (type $$g22))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:664
+let $41 = instantiate(`(module
+ (rec (type $$f11 (sub (func))) (type $$f12 (sub $$f11 (func))))
+ (rec (type $$f21 (sub (func))) (type $$f22 (sub $$f11 (func))))
+ (func (export "f") (type $$f21))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:669
+register($41, `M10`);
+
+// ./test/core/gc/type-subtyping.wast:670
+assert_unlinkable(
+ () => instantiate(`(module
+ (rec (type $$f11 (sub (func))) (type $$f12 (sub $$f11 (func))))
+ (func (import "M10" "f") (type $$f11))
+ )`),
+ `incompatible import`,
+);
+
+// ./test/core/gc/type-subtyping.wast:678
+let $42 = instantiate(`(module
+ (rec (type $$f01 (sub (func))) (type $$f02 (sub $$f01 (func))))
+ (rec (type $$f11 (sub (func))) (type $$f12 (sub $$f01 (func))))
+ (rec (type $$f21 (sub (func))) (type $$f22 (sub $$f11 (func))))
+ (func (export "f") (type $$f21))
+)`);
+
+// ./test/core/gc/type-subtyping.wast:684
+register($42, `M11`);
+
+// ./test/core/gc/type-subtyping.wast:685
+assert_unlinkable(
+ () => instantiate(`(module
+ (rec (type $$f01 (sub (func))) (type $$f02 (sub $$f01 (func))))
+ (rec (type $$f11 (sub (func))) (type $$f12 (sub $$f01 (func))))
+ (func (import "M11" "f") (type $$f11))
+ )`),
+ `incompatible import`,
+);
+
+// ./test/core/gc/type-subtyping.wast:698
+assert_invalid(
+ () => instantiate(`(module
+ (type $$t (func))
+ (type $$s (sub $$t (func)))
+ )`),
+ `sub type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:706
+assert_invalid(
+ () => instantiate(`(module
+ (type $$t (struct))
+ (type $$s (sub $$t (struct)))
+ )`),
+ `sub type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:714
+assert_invalid(
+ () => instantiate(`(module
+ (type $$t (sub final (func)))
+ (type $$s (sub $$t (func)))
+ )`),
+ `sub type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:722
+assert_invalid(
+ () => instantiate(`(module
+ (type $$t (sub (func)))
+ (type $$s (sub final $$t (func)))
+ (type $$u (sub $$s (func)))
+ )`),
+ `sub type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:735
+assert_invalid(
+ () => instantiate(`(module
+ (type $$a0 (sub (array i32)))
+ (type $$s0 (sub $$a0 (struct)))
+ )`),
+ `sub type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:743
+assert_invalid(
+ () => instantiate(`(module
+ (type $$f0 (sub (func (param i32) (result i32))))
+ (type $$s0 (sub $$f0 (struct)))
+ )`),
+ `sub type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:751
+assert_invalid(
+ () => instantiate(`(module
+ (type $$s0 (sub (struct)))
+ (type $$a0 (sub $$s0 (array i32)))
+ )`),
+ `sub type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:759
+assert_invalid(
+ () => instantiate(`(module
+ (type $$f0 (sub (func (param i32) (result i32))))
+ (type $$a0 (sub $$f0 (array i32)))
+ )`),
+ `sub type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:767
+assert_invalid(
+ () => instantiate(`(module
+ (type $$s0 (sub (struct)))
+ (type $$f0 (sub $$s0 (func (param i32) (result i32))))
+ )`),
+ `sub type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:775
+assert_invalid(
+ () => instantiate(`(module
+ (type $$a0 (sub (array i32)))
+ (type $$f0 (sub $$a0 (func (param i32) (result i32))))
+ )`),
+ `sub type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:783
+assert_invalid(
+ () => instantiate(`(module
+ (type $$a0 (sub (array i32)))
+ (type $$a1 (sub $$a0 (array i64)))
+ )`),
+ `sub type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:791
+assert_invalid(
+ () => instantiate(`(module
+ (type $$s0 (sub (struct (field i32))))
+ (type $$s1 (sub $$s0 (struct (field i64))))
+ )`),
+ `sub type`,
+);
+
+// ./test/core/gc/type-subtyping.wast:799
+assert_invalid(
+ () => instantiate(`(module
+ (type $$f0 (sub (func)))
+ (type $$f1 (sub $$f0 (func (param i32))))
+ )`),
+ `sub type`,
+);