...
1;; Test `local.set` operator
2
3(module
4 ;; Typing
5
6 (func (export "type-local-i32") (local i32) (local.set 0 (i32.const 0)))
7 (func (export "type-local-i64") (local i64) (local.set 0 (i64.const 0)))
8 (func (export "type-local-f32") (local f32) (local.set 0 (f32.const 0)))
9 (func (export "type-local-f64") (local f64) (local.set 0 (f64.const 0)))
10
11 (func (export "type-param-i32") (param i32) (local.set 0 (i32.const 10)))
12 (func (export "type-param-i64") (param i64) (local.set 0 (i64.const 11)))
13 (func (export "type-param-f32") (param f32) (local.set 0 (f32.const 11.1)))
14 (func (export "type-param-f64") (param f64) (local.set 0 (f64.const 12.2)))
15
16 (func (export "type-mixed") (param i64 f32 f64 i32 i32) (local f32 i64 i64 f64)
17 (local.set 0 (i64.const 0))
18 (local.set 1 (f32.const 0))
19 (local.set 2 (f64.const 0))
20 (local.set 3 (i32.const 0))
21 (local.set 4 (i32.const 0))
22 (local.set 5 (f32.const 0))
23 (local.set 6 (i64.const 0))
24 (local.set 7 (i64.const 0))
25 (local.set 8 (f64.const 0))
26 )
27
28 ;; Writing
29
30 (func (export "write") (param i64 f32 f64 i32 i32) (result i64)
31 (local f32 i64 i64 f64)
32 (local.set 1 (f32.const -0.3))
33 (local.set 3 (i32.const 40))
34 (local.set 4 (i32.const -7))
35 (local.set 5 (f32.const 5.5))
36 (local.set 6 (i64.const 6))
37 (local.set 8 (f64.const 8))
38 (i64.trunc_f64_s
39 (f64.add
40 (f64.convert_i64_u (local.get 0))
41 (f64.add
42 (f64.promote_f32 (local.get 1))
43 (f64.add
44 (local.get 2)
45 (f64.add
46 (f64.convert_i32_u (local.get 3))
47 (f64.add
48 (f64.convert_i32_s (local.get 4))
49 (f64.add
50 (f64.promote_f32 (local.get 5))
51 (f64.add
52 (f64.convert_i64_u (local.get 6))
53 (f64.add
54 (f64.convert_i64_u (local.get 7))
55 (local.get 8)
56 )
57 )
58 )
59 )
60 )
61 )
62 )
63 )
64 )
65 )
66
67 ;; As parameter of control constructs and instructions
68
69 (func (export "as-block-value") (param i32)
70 (block (local.set 0 (i32.const 1)))
71 )
72 (func (export "as-loop-value") (param i32)
73 (loop (local.set 0 (i32.const 3)))
74 )
75
76 (func (export "as-br-value") (param i32)
77 (block (br 0 (local.set 0 (i32.const 9))))
78 )
79 (func (export "as-br_if-value") (param i32)
80 (block
81 (br_if 0 (local.set 0 (i32.const 8)) (i32.const 1))
82 )
83 )
84 (func (export "as-br_if-value-cond") (param i32)
85 (block
86 (br_if 0 (i32.const 6) (local.set 0 (i32.const 9)))
87 )
88 )
89 (func (export "as-br_table-value") (param i32)
90 (block
91 (br_table 0 (local.set 0 (i32.const 10)) (i32.const 1))
92 )
93 )
94
95 (func (export "as-return-value") (param i32)
96 (return (local.set 0 (i32.const 7)))
97 )
98
99 (func (export "as-if-then") (param i32)
100 (if (local.get 0) (then (local.set 0 (i32.const 3))))
101 )
102 (func (export "as-if-else") (param i32)
103 (if (local.get 0) (then) (else (local.set 0 (i32.const 1))))
104 )
105)
106
107(assert_return (invoke "type-local-i32"))
108(assert_return (invoke "type-local-i64"))
109(assert_return (invoke "type-local-f32"))
110(assert_return (invoke "type-local-f64"))
111
112(assert_return (invoke "type-param-i32" (i32.const 2)))
113(assert_return (invoke "type-param-i64" (i64.const 3)))
114(assert_return (invoke "type-param-f32" (f32.const 4.4)))
115(assert_return (invoke "type-param-f64" (f64.const 5.5)))
116
117(assert_return (invoke "as-block-value" (i32.const 0)))
118(assert_return (invoke "as-loop-value" (i32.const 0)))
119
120(assert_return (invoke "as-br-value" (i32.const 0)))
121(assert_return (invoke "as-br_if-value" (i32.const 0)))
122(assert_return (invoke "as-br_if-value-cond" (i32.const 0)))
123(assert_return (invoke "as-br_table-value" (i32.const 0)))
124
125(assert_return (invoke "as-return-value" (i32.const 0)))
126
127(assert_return (invoke "as-if-then" (i32.const 1)))
128(assert_return (invoke "as-if-else" (i32.const 0)))
129
130(assert_return
131 (invoke "type-mixed"
132 (i64.const 1) (f32.const 2.2) (f64.const 3.3) (i32.const 4) (i32.const 5)
133 )
134)
135
136(assert_return
137 (invoke "write"
138 (i64.const 1) (f32.const 2) (f64.const 3.3) (i32.const 4) (i32.const 5)
139 )
140 (i64.const 56)
141)
142
143
144;; Invalid typing of access to locals
145
146
147(assert_invalid
148 (module (func $type-local-arg-void-vs-num (local i32) (local.set 0 (nop))))
149 "type mismatch"
150)
151(assert_invalid
152 (module (func $type-local-arg-num-vs-num (local i32) (local.set 0 (f32.const 0))))
153 "type mismatch"
154)
155(assert_invalid
156 (module (func $type-local-arg-num-vs-num (local f32) (local.set 0 (f64.const 0))))
157 "type mismatch"
158)
159(assert_invalid
160 (module (func $type-local-arg-num-vs-num (local f64 i64) (local.set 1 (f64.const 0))))
161 "type mismatch"
162)
163
164
165;; Invalid typing of access to parameters
166
167
168(assert_invalid
169 (module (func $type-param-arg-void-vs-num (param i32) (local.set 0 (nop))))
170 "type mismatch"
171)
172(assert_invalid
173 (module (func $type-param-arg-num-vs-num (param i32) (local.set 0 (f32.const 0))))
174 "type mismatch"
175)
176(assert_invalid
177 (module (func $type-param-arg-num-vs-num (param f32) (local.set 0 (f64.const 0))))
178 "type mismatch"
179)
180(assert_invalid
181 (module (func $type-param-arg-num-vs-num (param f64 i64) (local.set 1 (f64.const 0))))
182 "type mismatch"
183)
184
185(assert_invalid
186 (module
187 (func $type-param-arg-empty-vs-num (param i32)
188 (local.set 0)
189 )
190 )
191 "type mismatch"
192)
193(assert_invalid
194 (module
195 (func $type-param-arg-empty-vs-num-in-block (param i32)
196 (i32.const 0)
197 (block (local.set 0))
198 )
199 )
200 "type mismatch"
201)
202(assert_invalid
203 (module
204 (func $type-param-arg-empty-vs-num-in-loop (param i32)
205 (i32.const 0)
206 (loop (local.set 0))
207 )
208 )
209 "type mismatch"
210)
211(assert_invalid
212 (module
213 (func $type-param-arg-empty-vs-num-in-then (param i32)
214 (i32.const 0)
215 (if (i32.const 1) (then (local.set 0)))
216 )
217 )
218 "type mismatch"
219)
220(assert_invalid
221 (module
222 (func $type-param-arg-empty-vs-num-in-else (param i32)
223 (i32.const 0)
224 (if (result i32) (i32.const 0) (then (i32.const 0)) (else (local.set 0)))
225 )
226 )
227 "type mismatch"
228)
229(assert_invalid
230 (module
231 (func $type-param-arg-empty-vs-num-in-br (param i32)
232 (i32.const 0)
233 (block (br 0 (local.set 0)))
234 )
235 )
236 "type mismatch"
237)
238(assert_invalid
239 (module
240 (func $type-param-arg-empty-vs-num-in-br_if (param i32)
241 (i32.const 0)
242 (block (br_if 0 (local.set 0)))
243 )
244 )
245 "type mismatch"
246)
247(assert_invalid
248 (module
249 (func $type-param-arg-empty-vs-num-in-br_table (param i32)
250 (i32.const 0)
251 (block (br_table 0 (local.set 0)))
252 )
253 )
254 "type mismatch"
255)
256(assert_invalid
257 (module
258 (func $type-param-arg-empty-vs-num-in-return (param i32)
259 (return (local.set 0))
260 )
261 )
262 "type mismatch"
263)
264(assert_invalid
265 (module
266 (func $type-param-arg-empty-vs-num-in-select (param i32)
267 (select (local.set 0) (i32.const 1) (i32.const 2))
268 )
269 )
270 "type mismatch"
271)
272(assert_invalid
273 (module
274 (func $type-param-arg-empty-vs-num-in-call (param i32)
275 (call 1 (local.set 0))
276 )
277 (func (param i32) (result i32) (local.get 0))
278 )
279 "type mismatch"
280)
281(assert_invalid
282 (module
283 (func $f (param i32) (result i32) (local.get 0))
284 (type $sig (func (param i32) (result i32)))
285 (table funcref (elem $f))
286 (func $type-param-arg-empty-vs-num-in-call_indirect (param i32)
287 (block (result i32)
288 (call_indirect (type $sig)
289 (local.set 0) (i32.const 0)
290 )
291 )
292 )
293 )
294 "type mismatch"
295)
296
297
298;; Invalid typing of access to mixed args
299
300(assert_invalid
301 (module (func $type-mixed-arg-num-vs-num (param f32) (local i32) (local.set 1 (f32.const 0))))
302 "type mismatch"
303)
304(assert_invalid
305 (module (func $type-mixed-arg-num-vs-num (param i64 i32) (local f32) (local.set 1 (f32.const 0))))
306 "type mismatch"
307)
308(assert_invalid
309 (module (func $type-mixed-arg-num-vs-num (param i64) (local f64 i64) (local.set 1 (i64.const 0))))
310 "type mismatch"
311)
312
313
314;; local.set should have no retval
315
316(assert_invalid
317 (module (func $type-empty-vs-i32 (param i32) (result i32) (local.set 0 (i32.const 1))))
318 "type mismatch"
319)
320(assert_invalid
321 (module (func $type-empty-vs-i64 (param i64) (result i64) (local.set 0 (i64.const 1))))
322 "type mismatch"
323)
324(assert_invalid
325 (module (func $type-empty-vs-f32 (param f32) (result f32) (local.set 0 (f32.const 1))))
326 "type mismatch"
327)
328(assert_invalid
329 (module (func $type-empty-vs-f64 (param f64) (result f64) (local.set 0 (f64.const 1))))
330 "type mismatch"
331)
332
333
334;; Invalid local index
335
336(assert_invalid
337 (module (func $unbound-local (local i32 i64) (local.set 3 (i32.const 0))))
338 "unknown local"
339)
340(assert_invalid
341 (module (func $large-local (local i32 i64) (local.set 14324343 (i32.const 0))))
342 "unknown local"
343)
344
345(assert_invalid
346 (module (func $unbound-param (param i32 i64) (local.set 2 (i32.const 0))))
347 "unknown local"
348)
349(assert_invalid
350 (module (func $large-param (param i32 i64) (local.set 714324343 (i32.const 0))))
351 "unknown local"
352)
353
354(assert_invalid
355 (module (func $unbound-mixed (param i32) (local i32 i64) (local.set 3 (i32.const 0))))
356 "unknown local"
357)
358(assert_invalid
359 (module (func $large-mixed (param i64) (local i32 i64) (local.set 214324343 (i32.const 0))))
360 "unknown local"
361)
362
View as plain text