...
1;; Store operator as the argument of control constructs and instructions
2
3(module
4 (memory 1)
5
6 (func (export "as-block-value")
7 (block (i32.store (i32.const 0) (i32.const 1)))
8 )
9 (func (export "as-loop-value")
10 (loop (i32.store (i32.const 0) (i32.const 1)))
11 )
12
13 (func (export "as-br-value")
14 (block (br 0 (i32.store (i32.const 0) (i32.const 1))))
15 )
16 (func (export "as-br_if-value")
17 (block
18 (br_if 0 (i32.store (i32.const 0) (i32.const 1)) (i32.const 1))
19 )
20 )
21 (func (export "as-br_if-value-cond")
22 (block
23 (br_if 0 (i32.const 6) (i32.store (i32.const 0) (i32.const 1)))
24 )
25 )
26 (func (export "as-br_table-value")
27 (block
28 (br_table 0 (i32.store (i32.const 0) (i32.const 1)) (i32.const 1))
29 )
30 )
31
32 (func (export "as-return-value")
33 (return (i32.store (i32.const 0) (i32.const 1)))
34 )
35
36 (func (export "as-if-then")
37 (if (i32.const 1) (then (i32.store (i32.const 0) (i32.const 1))))
38 )
39 (func (export "as-if-else")
40 (if (i32.const 0) (then) (else (i32.store (i32.const 0) (i32.const 1))))
41 )
42)
43
44(assert_return (invoke "as-block-value"))
45(assert_return (invoke "as-loop-value"))
46
47(assert_return (invoke "as-br-value"))
48(assert_return (invoke "as-br_if-value"))
49(assert_return (invoke "as-br_if-value-cond"))
50(assert_return (invoke "as-br_table-value"))
51
52(assert_return (invoke "as-return-value"))
53
54(assert_return (invoke "as-if-then"))
55(assert_return (invoke "as-if-else"))
56
57(assert_malformed
58 (module quote
59 "(memory 1)"
60 "(func (param i32) (i32.store32 (local.get 0) (i32.const 0)))"
61 )
62 "unknown operator"
63)
64(assert_malformed
65 (module quote
66 "(memory 1)"
67 "(func (param i32) (i32.store64 (local.get 0) (i64.const 0)))"
68 )
69 "unknown operator"
70)
71
72(assert_malformed
73 (module quote
74 "(memory 1)"
75 "(func (param i32) (i64.store64 (local.get 0) (i64.const 0)))"
76 )
77 "unknown operator"
78)
79
80(assert_malformed
81 (module quote
82 "(memory 1)"
83 "(func (param i32) (f32.store32 (local.get 0) (f32.const 0)))"
84 )
85 "unknown operator"
86)
87(assert_malformed
88 (module quote
89 "(memory 1)"
90 "(func (param i32) (f32.store64 (local.get 0) (f64.const 0)))"
91 )
92 "unknown operator"
93)
94
95(assert_malformed
96 (module quote
97 "(memory 1)"
98 "(func (param i32) (f64.store32 (local.get 0) (f32.const 0)))"
99 )
100 "unknown operator"
101)
102(assert_malformed
103 (module quote
104 "(memory 1)"
105 "(func (param i32) (f64.store64 (local.get 0) (f64.const 0)))"
106 )
107 "unknown operator"
108)
109;; store should have no retval
110
111(assert_invalid
112 (module (memory 1) (func (param i32) (result i32) (i32.store (i32.const 0) (i32.const 1))))
113 "type mismatch"
114)
115(assert_invalid
116 (module (memory 1) (func (param i64) (result i64) (i64.store (i32.const 0) (i64.const 1))))
117 "type mismatch"
118)
119(assert_invalid
120 (module (memory 1) (func (param f32) (result f32) (f32.store (i32.const 0) (f32.const 1))))
121 "type mismatch"
122)
123(assert_invalid
124 (module (memory 1) (func (param f64) (result f64) (f64.store (i32.const 0) (f64.const 1))))
125 "type mismatch"
126)
127(assert_invalid
128 (module (memory 1) (func (param i32) (result i32) (i32.store8 (i32.const 0) (i32.const 1))))
129 "type mismatch"
130)
131(assert_invalid
132 (module (memory 1) (func (param i32) (result i32) (i32.store16 (i32.const 0) (i32.const 1))))
133 "type mismatch"
134)
135(assert_invalid
136 (module (memory 1) (func (param i64) (result i64) (i64.store8 (i32.const 0) (i64.const 1))))
137 "type mismatch"
138)
139(assert_invalid
140 (module (memory 1) (func (param i64) (result i64) (i64.store16 (i32.const 0) (i64.const 1))))
141 "type mismatch"
142)
143(assert_invalid
144 (module (memory 1) (func (param i64) (result i64) (i64.store32 (i32.const 0) (i64.const 1))))
145 "type mismatch"
146)
147
148
149(assert_invalid
150 (module
151 (memory 1)
152 (func $type-address-empty
153 (i32.store)
154 )
155 )
156 "type mismatch"
157)
158(assert_invalid
159 (module
160 (memory 1)
161 (func $type-value-empty
162 (i32.const 0) (i32.store)
163 )
164 )
165 "type mismatch"
166)
167(assert_invalid
168 (module
169 (memory 1)
170 (func $type-address-empty-in-block
171 (i32.const 0) (i32.const 0)
172 (block (i32.store))
173 )
174 )
175 "type mismatch"
176)
177(assert_invalid
178 (module
179 (memory 1)
180 (func $type-value-empty-in-block
181 (i32.const 0)
182 (block (i32.const 0) (i32.store))
183 )
184 )
185 "type mismatch"
186)
187(assert_invalid
188 (module
189 (memory 1)
190 (func $type-address-empty-in-loop
191 (i32.const 0) (i32.const 0)
192 (loop (i32.store))
193 )
194 )
195 "type mismatch"
196)
197(assert_invalid
198 (module
199 (memory 1)
200 (func $type-value-empty-in-loop
201 (i32.const 0)
202 (loop (i32.const 0) (i32.store))
203 )
204 )
205 "type mismatch"
206)
207(assert_invalid
208 (module
209 (memory 1)
210 (func $type-address-empty-in-then
211 (i32.const 0) (i32.const 0)
212 (if (then (i32.store)))
213 )
214 )
215 "type mismatch"
216)
217(assert_invalid
218 (module
219 (memory 1)
220 (func $type-value-empty-in-then
221 (i32.const 0)
222 (if (then (i32.const 0) (i32.store)))
223 )
224 )
225 "type mismatch"
226)
227(assert_invalid
228 (module
229 (memory 1)
230 (func $type-address-empty-in-else
231 (i32.const 0) (i32.const 0)
232 (if (result i32) (then (i32.const 0)) (else (i32.store)))
233 )
234 )
235 "type mismatch"
236)
237(assert_invalid
238 (module
239 (memory 1)
240 (func $type-value-empty-in-else
241 (i32.const 0)
242 (if (result i32) (then (i32.const 0)) (else (i32.const 0) (i32.store)))
243 )
244 )
245 "type mismatch"
246)
247(assert_invalid
248 (module
249 (memory 1)
250 (func $type-address-empty-in-br
251 (i32.const 0) (i32.const 0)
252 (block (br 0 (i32.store)))
253 )
254 )
255 "type mismatch"
256)
257(assert_invalid
258 (module
259 (memory 1)
260 (func $type-value-empty-in-br
261 (i32.const 0)
262 (block (br 0 (i32.const 0) (i32.store)))
263 )
264 )
265 "type mismatch"
266)
267(assert_invalid
268 (module
269 (memory 1)
270 (func $type-address-empty-in-br_if
271 (i32.const 0) (i32.const 0)
272 (block (br_if 0 (i32.store) (i32.const 1)) )
273 )
274 )
275 "type mismatch"
276)
277(assert_invalid
278 (module
279 (memory 1)
280 (func $type-value-empty-in-br_if
281 (i32.const 0)
282 (block (br_if 0 (i32.const 0) (i32.store) (i32.const 1)) )
283 )
284 )
285 "type mismatch"
286)
287(assert_invalid
288 (module
289 (memory 1)
290 (func $type-address-empty-in-br_table
291 (i32.const 0) (i32.const 0)
292 (block (br_table 0 (i32.store)))
293 )
294 )
295 "type mismatch"
296)
297(assert_invalid
298 (module
299 (memory 1)
300 (func $type-value-empty-in-br_table
301 (i32.const 0)
302 (block (br_table 0 (i32.const 0) (i32.store)))
303 )
304 )
305 "type mismatch"
306)
307(assert_invalid
308 (module
309 (memory 1)
310 (func $type-address-empty-in-return
311 (return (i32.store))
312 )
313 )
314 "type mismatch"
315)
316(assert_invalid
317 (module
318 (memory 1)
319 (func $type-value-empty-in-return
320 (return (i32.const 0) (i32.store))
321 )
322 )
323 "type mismatch"
324)
325(assert_invalid
326 (module
327 (memory 1)
328 (func $type-address-empty-in-select
329 (select (i32.store) (i32.const 1) (i32.const 2))
330 )
331 )
332 "type mismatch"
333)
334(assert_invalid
335 (module
336 (memory 1)
337 (func $type-value-empty-in-select
338 (select (i32.const 0) (i32.store) (i32.const 1) (i32.const 2))
339 )
340 )
341 "type mismatch"
342)
343(assert_invalid
344 (module
345 (memory 1)
346 (func $type-address-empty-in-call
347 (call 1 (i32.store))
348 )
349 (func (param i32) (result i32) (local.get 0))
350 )
351 "type mismatch"
352)
353(assert_invalid
354 (module
355 (memory 1)
356 (func $type-value-empty-in-call
357 (call 1 (i32.const 0) (i32.store))
358 )
359 (func (param i32) (result i32) (local.get 0))
360 )
361 "type mismatch"
362)
363(assert_invalid
364 (module
365 (memory 1)
366 (func $f (param i32) (result i32) (local.get 0))
367 (type $sig (func (param i32) (result i32)))
368 (table funcref (elem $f))
369 (func $type-address-empty-in-call_indirect
370 (block (result i32)
371 (call_indirect (type $sig)
372 (i32.store) (i32.const 0)
373 )
374 )
375 )
376 )
377 "type mismatch"
378)
379(assert_invalid
380 (module
381 (memory 1)
382 (func $f (param i32) (result i32) (local.get 0))
383 (type $sig (func (param i32) (result i32)))
384 (table funcref (elem $f))
385 (func $type-value-empty-in-call_indirect
386 (block (result i32)
387 (call_indirect (type $sig)
388 (i32.const 0) (i32.store) (i32.const 0)
389 )
390 )
391 )
392 )
393 "type mismatch"
394)
395
396
397;; Type check
398
399(assert_invalid (module (memory 1) (func (i32.store (f32.const 0) (i32.const 0)))) "type mismatch")
400(assert_invalid (module (memory 1) (func (i32.store8 (f32.const 0) (i32.const 0)))) "type mismatch")
401(assert_invalid (module (memory 1) (func (i32.store16 (f32.const 0) (i32.const 0)))) "type mismatch")
402(assert_invalid (module (memory 1) (func (i64.store (f32.const 0) (i32.const 0)))) "type mismatch")
403(assert_invalid (module (memory 1) (func (i64.store8 (f32.const 0) (i64.const 0)))) "type mismatch")
404(assert_invalid (module (memory 1) (func (i64.store16 (f32.const 0) (i64.const 0)))) "type mismatch")
405(assert_invalid (module (memory 1) (func (i64.store32 (f32.const 0) (i64.const 0)))) "type mismatch")
406(assert_invalid (module (memory 1) (func (f32.store (f32.const 0) (f32.const 0)))) "type mismatch")
407(assert_invalid (module (memory 1) (func (f64.store (f32.const 0) (f64.const 0)))) "type mismatch")
408
409(assert_invalid (module (memory 1) (func (i32.store (i32.const 0) (f32.const 0)))) "type mismatch")
410(assert_invalid (module (memory 1) (func (i32.store8 (i32.const 0) (f32.const 0)))) "type mismatch")
411(assert_invalid (module (memory 1) (func (i32.store16 (i32.const 0) (f32.const 0)))) "type mismatch")
412(assert_invalid (module (memory 1) (func (i64.store (i32.const 0) (f32.const 0)))) "type mismatch")
413(assert_invalid (module (memory 1) (func (i64.store8 (i32.const 0) (f64.const 0)))) "type mismatch")
414(assert_invalid (module (memory 1) (func (i64.store16 (i32.const 0) (f64.const 0)))) "type mismatch")
415(assert_invalid (module (memory 1) (func (i64.store32 (i32.const 0) (f64.const 0)))) "type mismatch")
416(assert_invalid (module (memory 1) (func (f32.store (i32.const 0) (i32.const 0)))) "type mismatch")
417(assert_invalid (module (memory 1) (func (f64.store (i32.const 0) (i64.const 0)))) "type mismatch")
View as plain text