1*60fc557cSAlex Crichton;;! gc = true
2*60fc557cSAlex Crichton
392024ad1SLuna P-C(module
492024ad1SLuna P-C  (type $res-i32 (func (result i32)))
592024ad1SLuna P-C  (table $t2 1 externref)
692024ad1SLuna P-C  (table $t3 2 funcref)
792024ad1SLuna P-C  (table $t4 1 (ref null $res-i32))
892024ad1SLuna P-C  (elem (table $t3) (i32.const 1) func $returns-five)
992024ad1SLuna P-C  (func $returns-five (result i32) (i32.const 5))
1092024ad1SLuna P-C
1192024ad1SLuna P-C  (func (export "get-externref") (param $i i32) (result externref)
1292024ad1SLuna P-C    (table.get $t2 (local.get $i))
1392024ad1SLuna P-C  )
1492024ad1SLuna P-C  (func $f3 (export "get-funcref") (param $i i32) (result funcref)
1592024ad1SLuna P-C    (table.get $t3 (local.get $i))
1692024ad1SLuna P-C  )
1792024ad1SLuna P-C  (func $f4 (export "get-typed-func") (param $i i32) (result (ref null $res-i32))
1892024ad1SLuna P-C    (table.get $t4 (local.get $i))
1992024ad1SLuna P-C  )
2092024ad1SLuna P-C
2192024ad1SLuna P-C  (func (export "set-externref") (param $i i32) (param $r externref)
2292024ad1SLuna P-C    (table.set $t2 (local.get $i) (local.get $r))
2392024ad1SLuna P-C  )
2492024ad1SLuna P-C  (func (export "set-funcref") (param $i i32) (param $r funcref)
2592024ad1SLuna P-C    (table.set $t3 (local.get $i) (local.get $r))
2692024ad1SLuna P-C  )
2792024ad1SLuna P-C  (func (export "set-funcref-from") (param $i i32) (param $j i32)
2892024ad1SLuna P-C    (table.set $t3 (local.get $i) (table.get $t3 (local.get $j)))
2992024ad1SLuna P-C  )
3092024ad1SLuna P-C  (func $f5 (export "set-typed-func") (param $i i32) (param $r (ref $res-i32))
3192024ad1SLuna P-C    (table.set $t4 (local.get $i) (local.get $r))
3292024ad1SLuna P-C  )
3392024ad1SLuna P-C
3492024ad1SLuna P-C  (func (export "is_null-funcref") (param $i i32) (result i32)
3592024ad1SLuna P-C    (ref.is_null (call $f3 (local.get $i)))
3692024ad1SLuna P-C  )
3792024ad1SLuna P-C  (func (export "is_null-typed-func") (param $i i32) (result i32)
3892024ad1SLuna P-C    (ref.is_null (call $f4 (local.get $i)))
3992024ad1SLuna P-C  )
4092024ad1SLuna P-C  (func (export "set-returns-five") (param $i i32)
4192024ad1SLuna P-C    (call $f5 (local.get $i) (ref.func $returns-five))
4292024ad1SLuna P-C  )
4392024ad1SLuna P-C  (func (export "get-typed-and-call") (param $i i32) (result i32) (call_ref $res-i32 (call $f4 (local.get $i))))
4492024ad1SLuna P-C)
4592024ad1SLuna P-C
4692024ad1SLuna P-C(assert_return (invoke "get-externref" (i32.const 0)) (ref.null extern))
4792024ad1SLuna P-C(assert_return (invoke "set-externref" (i32.const 0) (ref.extern 1)))
4892024ad1SLuna P-C(assert_return (invoke "get-externref" (i32.const 0)) (ref.extern 1))
4992024ad1SLuna P-C(assert_return (invoke "set-externref" (i32.const 0) (ref.null extern)))
5092024ad1SLuna P-C(assert_return (invoke "get-externref" (i32.const 0)) (ref.null extern))
5192024ad1SLuna P-C
5292024ad1SLuna P-C(assert_return (invoke "get-funcref" (i32.const 0)) (ref.null func))
5392024ad1SLuna P-C(assert_return (invoke "set-funcref-from" (i32.const 0) (i32.const 1)))
5492024ad1SLuna P-C(assert_return (invoke "is_null-funcref" (i32.const 0)) (i32.const 0))
5592024ad1SLuna P-C(assert_return (invoke "set-funcref" (i32.const 0) (ref.null func)))
5692024ad1SLuna P-C(assert_return (invoke "get-funcref" (i32.const 0)) (ref.null func))
5792024ad1SLuna P-C
5892024ad1SLuna P-C(assert_return (invoke "is_null-typed-func" (i32.const 0)) (i32.const 1))
5992024ad1SLuna P-C(invoke "set-returns-five" (i32.const 0))
6092024ad1SLuna P-C(assert_return (invoke "get-typed-and-call" (i32.const 0)) (i32.const 5))
6192024ad1SLuna P-C
6292024ad1SLuna P-C(assert_trap (invoke "set-externref" (i32.const 2) (ref.null extern)) "out of bounds table access")
6392024ad1SLuna P-C(assert_trap (invoke "set-funcref" (i32.const 3) (ref.null func)) "out of bounds table access")
6492024ad1SLuna P-C(assert_trap (invoke "set-returns-five" (i32.const 2)) "out of bounds table access")
6592024ad1SLuna P-C(assert_trap (invoke "set-externref" (i32.const -1) (ref.null extern)) "out of bounds table access")
6692024ad1SLuna P-C(assert_trap (invoke "set-funcref" (i32.const -1) (ref.null func)) "out of bounds table access")
6792024ad1SLuna P-C(assert_trap (invoke "set-returns-five" (i32.const -1)) "out of bounds table access")
6892024ad1SLuna P-C
6992024ad1SLuna P-C(assert_trap (invoke "set-externref" (i32.const 2) (ref.extern 0)) "out of bounds table access")
7092024ad1SLuna P-C(assert_trap (invoke "set-funcref-from" (i32.const 3) (i32.const 1)) "out of bounds table access")
7192024ad1SLuna P-C(assert_trap (invoke "set-externref" (i32.const -1) (ref.extern 0)) "out of bounds table access")
7292024ad1SLuna P-C(assert_trap (invoke "set-funcref-from" (i32.const -1) (i32.const 1)) "out of bounds table access")
7392024ad1SLuna P-C
7492024ad1SLuna P-C
7592024ad1SLuna P-C;; Type errors
7692024ad1SLuna P-C
7792024ad1SLuna P-C(assert_invalid
7892024ad1SLuna P-C  (module
7992024ad1SLuna P-C    (table $t 10 externref)
8092024ad1SLuna P-C    (func $type-index-value-empty-vs-i32-externref
8192024ad1SLuna P-C      (table.set $t)
8292024ad1SLuna P-C    )
8392024ad1SLuna P-C  )
8492024ad1SLuna P-C  "type mismatch"
8592024ad1SLuna P-C)
8692024ad1SLuna P-C(assert_invalid
8792024ad1SLuna P-C  (module
8892024ad1SLuna P-C    (table $t 10 externref)
8992024ad1SLuna P-C    (func $type-index-empty-vs-i32
9092024ad1SLuna P-C      (table.set $t (ref.null extern))
9192024ad1SLuna P-C    )
9292024ad1SLuna P-C  )
9392024ad1SLuna P-C  "type mismatch"
9492024ad1SLuna P-C)
9592024ad1SLuna P-C(assert_invalid
9692024ad1SLuna P-C  (module
9792024ad1SLuna P-C    (table $t 10 externref)
9892024ad1SLuna P-C    (func $type-value-empty-vs-externref
9992024ad1SLuna P-C      (table.set $t (i32.const 1))
10092024ad1SLuna P-C    )
10192024ad1SLuna P-C  )
10292024ad1SLuna P-C  "type mismatch"
10392024ad1SLuna P-C)
10492024ad1SLuna P-C(assert_invalid
10592024ad1SLuna P-C  (module
10692024ad1SLuna P-C    (table $t 10 externref)
10792024ad1SLuna P-C    (func $type-size-f32-vs-i32
10892024ad1SLuna P-C      (table.set $t (f32.const 1) (ref.null extern))
10992024ad1SLuna P-C    )
11092024ad1SLuna P-C  )
11192024ad1SLuna P-C  "type mismatch"
11292024ad1SLuna P-C)
11392024ad1SLuna P-C(assert_invalid
11492024ad1SLuna P-C  (module
11592024ad1SLuna P-C    (table $t 10 funcref)
11692024ad1SLuna P-C    (func $type-value-externref-vs-funcref (param $r externref)
11792024ad1SLuna P-C      (table.set $t (i32.const 1) (local.get $r))
11892024ad1SLuna P-C    )
11992024ad1SLuna P-C  )
12092024ad1SLuna P-C  "type mismatch"
12192024ad1SLuna P-C)
12292024ad1SLuna P-C
12392024ad1SLuna P-C(assert_invalid
12492024ad1SLuna P-C  (module
12592024ad1SLuna P-C    (table $t1 1 externref)
12692024ad1SLuna P-C    (table $t2 1 funcref)
12792024ad1SLuna P-C    (func $type-value-externref-vs-funcref-multi (param $r externref)
12892024ad1SLuna P-C      (table.set $t2 (i32.const 0) (local.get $r))
12992024ad1SLuna P-C    )
13092024ad1SLuna P-C  )
13192024ad1SLuna P-C  "type mismatch"
13292024ad1SLuna P-C)
13392024ad1SLuna P-C
13492024ad1SLuna P-C(assert_invalid
13592024ad1SLuna P-C  (module
13692024ad1SLuna P-C    (table $t 10 externref)
13792024ad1SLuna P-C    (func $type-result-empty-vs-num (result i32)
13892024ad1SLuna P-C      (table.set $t (i32.const 0) (ref.null extern))
13992024ad1SLuna P-C    )
14092024ad1SLuna P-C  )
14192024ad1SLuna P-C  "type mismatch"
14292024ad1SLuna P-C)
143