1;;! gc = true
2
3(module
4  (table $t 10 externref)
5
6  (func (export "fill") (param $i i32) (param $r externref) (param $n i32)
7    (table.fill $t (local.get $i) (local.get $r) (local.get $n))
8  )
9
10  (func (export "get") (param $i i32) (result externref)
11    (table.get $t (local.get $i))
12  )
13)
14
15(assert_return (invoke "get" (i32.const 1)) (ref.null extern))
16(assert_return (invoke "get" (i32.const 2)) (ref.null extern))
17(assert_return (invoke "get" (i32.const 3)) (ref.null extern))
18(assert_return (invoke "get" (i32.const 4)) (ref.null extern))
19(assert_return (invoke "get" (i32.const 5)) (ref.null extern))
20
21(assert_return (invoke "fill" (i32.const 2) (ref.extern 1) (i32.const 3)))
22(assert_return (invoke "get" (i32.const 1)) (ref.null extern))
23(assert_return (invoke "get" (i32.const 2)) (ref.extern 1))
24(assert_return (invoke "get" (i32.const 3)) (ref.extern 1))
25(assert_return (invoke "get" (i32.const 4)) (ref.extern 1))
26(assert_return (invoke "get" (i32.const 5)) (ref.null extern))
27
28(assert_return (invoke "fill" (i32.const 4) (ref.extern 2) (i32.const 2)))
29(assert_return (invoke "get" (i32.const 3)) (ref.extern 1))
30(assert_return (invoke "get" (i32.const 4)) (ref.extern 2))
31(assert_return (invoke "get" (i32.const 5)) (ref.extern 2))
32(assert_return (invoke "get" (i32.const 6)) (ref.null extern))
33
34(assert_return (invoke "fill" (i32.const 4) (ref.extern 3) (i32.const 0)))
35(assert_return (invoke "get" (i32.const 3)) (ref.extern 1))
36(assert_return (invoke "get" (i32.const 4)) (ref.extern 2))
37(assert_return (invoke "get" (i32.const 5)) (ref.extern 2))
38
39(assert_return (invoke "fill" (i32.const 8) (ref.extern 4) (i32.const 2)))
40(assert_return (invoke "get" (i32.const 7)) (ref.null extern))
41(assert_return (invoke "get" (i32.const 8)) (ref.extern 4))
42(assert_return (invoke "get" (i32.const 9)) (ref.extern 4))
43
44(assert_return (invoke "fill" (i32.const 9) (ref.null extern) (i32.const 1)))
45(assert_return (invoke "get" (i32.const 8)) (ref.extern 4))
46(assert_return (invoke "get" (i32.const 9)) (ref.null extern))
47
48(assert_return (invoke "fill" (i32.const 10) (ref.extern 5) (i32.const 0)))
49(assert_return (invoke "get" (i32.const 9)) (ref.null extern))
50
51(assert_trap
52  (invoke "fill" (i32.const 8) (ref.extern 6) (i32.const 3))
53  "out of bounds table access"
54)
55(assert_return (invoke "get" (i32.const 7)) (ref.null extern))
56(assert_return (invoke "get" (i32.const 8)) (ref.extern 4))
57(assert_return (invoke "get" (i32.const 9)) (ref.null extern))
58
59(assert_trap
60  (invoke "fill" (i32.const 11) (ref.null extern) (i32.const 0))
61  "out of bounds table access"
62)
63
64(assert_trap
65  (invoke "fill" (i32.const 11) (ref.null extern) (i32.const 10))
66  "out of bounds table access"
67)
68
69
70;; Type errors
71
72(assert_invalid
73  (module
74    (table $t 10 externref)
75    (func $type-index-value-length-empty-vs-i32-i32
76      (table.fill $t)
77    )
78  )
79  "type mismatch"
80)
81(assert_invalid
82  (module
83    (table $t 10 externref)
84    (func $type-index-empty-vs-i32
85      (table.fill $t (ref.null extern) (i32.const 1))
86    )
87  )
88  "type mismatch"
89)
90(assert_invalid
91  (module
92    (table $t 10 externref)
93    (func $type-value-empty-vs
94      (table.fill $t (i32.const 1) (i32.const 1))
95    )
96  )
97  "type mismatch"
98)
99(assert_invalid
100  (module
101    (table $t 10 externref)
102    (func $type-length-empty-vs-i32
103      (table.fill $t (i32.const 1) (ref.null extern))
104    )
105  )
106  "type mismatch"
107)
108(assert_invalid
109  (module
110    (table $t 0 externref)
111    (func $type-index-f32-vs-i32
112      (table.fill $t (f32.const 1) (ref.null extern) (i32.const 1))
113    )
114  )
115  "type mismatch"
116)
117(assert_invalid
118  (module
119    (table $t 0 funcref)
120    (func $type-value-vs-funcref (param $r externref)
121      (table.fill $t (i32.const 1) (local.get $r) (i32.const 1))
122    )
123  )
124  "type mismatch"
125)
126(assert_invalid
127  (module
128    (type $afunc (func))
129    (table $t 0 (ref null $afunc))
130    (func $type-funcref-vs-typed-func (param $r funcref)
131      (table.fill $t (i32.const 1) (local.get $r) (i32.const 1))
132    )
133  )
134  "type mismatch"
135)
136(assert_invalid
137  (module
138    (table $t 0 externref)
139    (func $type-length-f32-vs-i32
140      (table.fill $t (i32.const 1) (ref.null extern) (f32.const 1))
141    )
142  )
143  "type mismatch"
144)
145
146(assert_invalid
147  (module
148    (table $t1 1 externref)
149    (table $t2 1 funcref)
150    (func $type-value-externref-vs-funcref-multi (param $r externref)
151      (table.fill $t2 (i32.const 0) (local.get $r) (i32.const 1))
152    )
153  )
154  "type mismatch"
155)
156
157(assert_invalid
158  (module
159    (table $t 1 externref)
160    (func $type-result-empty-vs-num (result i32)
161      (table.fill $t (i32.const 0) (ref.null extern) (i32.const 1))
162    )
163  )
164  "type mismatch"
165)
166