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