]> git.proxmox.com Git - rustc.git/blob - src/binaryen/test/spec/block.wast
New upstream version 1.23.0+dfsg1
[rustc.git] / src / binaryen / test / spec / block.wast
1 ;; Test `block` operator
2
3 (module
4 ;; Auxiliary definition
5 (func $dummy)
6
7 (func (export "empty")
8 (block)
9 (block $l)
10 )
11
12 (func (export "singular") (result i32)
13 (block (nop))
14 (block i32 (i32.const 7))
15 )
16
17 (func (export "multi") (result i32)
18 (block (call $dummy) (call $dummy) (call $dummy) (call $dummy))
19 (block i32 (call $dummy) (call $dummy) (call $dummy) (i32.const 8))
20 )
21
22 (func (export "nested") (result i32)
23 (block i32
24 (block (call $dummy) (block) (nop))
25 (block i32 (call $dummy) (i32.const 9))
26 )
27 )
28
29 (func (export "deep") (result i32)
30 (block i32 (block i32 (block i32 (block i32 (block i32 (block i32
31 (block i32 (block i32 (block i32 (block i32 (block i32 (block i32
32 (block i32 (block i32 (block i32 (block i32 (block i32 (block i32
33 (block i32 (block i32 (block i32 (block i32 (block i32 (block i32
34 (block i32 (block i32 (block i32 (block i32 (block i32 (block i32
35 (block i32 (block i32 (block i32 (block i32 (block i32 (block i32
36 (block i32 (block i32 (call $dummy) (i32.const 150)))
37 ))))))
38 ))))))
39 ))))))
40 ))))))
41 ))))))
42 ))))))
43 )
44
45 (func (export "as-unary-operand") (result i32)
46 (i32.ctz (block i32 (call $dummy) (i32.const 13)))
47 )
48 (func (export "as-binary-operand") (result i32)
49 (i32.mul
50 (block i32 (call $dummy) (i32.const 3))
51 (block i32 (call $dummy) (i32.const 4))
52 )
53 )
54 (func (export "as-test-operand") (result i32)
55 (i32.eqz (block i32 (call $dummy) (i32.const 13)))
56 )
57 (func (export "as-compare-operand") (result i32)
58 (f32.gt
59 (block f32 (call $dummy) (f32.const 3))
60 (block f32 (call $dummy) (f32.const 3))
61 )
62 )
63
64 (func (export "break-bare") (result i32)
65 (block (br 0) (unreachable))
66 (block (br_if 0 (i32.const 1)) (unreachable))
67 (block (br_table 0 (i32.const 0)) (unreachable))
68 (block (br_table 0 0 0 (i32.const 1)) (unreachable))
69 (i32.const 19)
70 )
71 (func (export "break-value") (result i32)
72 (block i32 (br 0 (i32.const 18)) (i32.const 19))
73 )
74 (func (export "break-repeated") (result i32)
75 (block i32
76 (br 0 (i32.const 18))
77 (br 0 (i32.const 19))
78 (drop (br_if 0 (i32.const 20) (i32.const 0)))
79 (drop (br_if 0 (i32.const 20) (i32.const 1)))
80 (br 0 (i32.const 21))
81 (br_table 0 (i32.const 22) (i32.const 4))
82 (br_table 0 0 0 (i32.const 23) (i32.const 1))
83 (i32.const 21)
84 )
85 )
86 (func (export "break-inner") (result i32)
87 (local i32)
88 (set_local 0 (i32.const 0))
89 (set_local 0 (i32.add (get_local 0) (block i32 (block i32 (br 1 (i32.const 0x1))))))
90 (set_local 0 (i32.add (get_local 0) (block i32 (block (br 0)) (i32.const 0x2))))
91 (set_local 0
92 (i32.add (get_local 0) (block i32 (i32.ctz (br 0 (i32.const 0x4)))))
93 )
94 (set_local 0
95 (i32.add (get_local 0) (block i32 (i32.ctz (block i32 (br 1 (i32.const 0x8))))))
96 )
97 (get_local 0)
98 )
99
100 (func (export "effects") (result i32)
101 (local i32)
102 (block
103 (set_local 0 (i32.const 1))
104 (set_local 0 (i32.mul (get_local 0) (i32.const 3)))
105 (set_local 0 (i32.sub (get_local 0) (i32.const 5)))
106 (set_local 0 (i32.mul (get_local 0) (i32.const 7)))
107 (br 0)
108 (set_local 0 (i32.mul (get_local 0) (i32.const 100)))
109 )
110 (i32.eq (get_local 0) (i32.const -14))
111 )
112 )
113
114 (assert_return (invoke "empty"))
115 (assert_return (invoke "singular") (i32.const 7))
116 (assert_return (invoke "multi") (i32.const 8))
117 (assert_return (invoke "nested") (i32.const 9))
118 (assert_return (invoke "deep") (i32.const 150))
119
120 (assert_return (invoke "as-unary-operand") (i32.const 0))
121 (assert_return (invoke "as-binary-operand") (i32.const 12))
122 (assert_return (invoke "as-test-operand") (i32.const 0))
123 (assert_return (invoke "as-compare-operand") (i32.const 0))
124
125 (assert_return (invoke "break-bare") (i32.const 19))
126 (assert_return (invoke "break-value") (i32.const 18))
127 (assert_return (invoke "break-repeated") (i32.const 18))
128 (assert_return (invoke "break-inner") (i32.const 0xf))
129
130 (assert_return (invoke "effects") (i32.const 1))
131
132 (assert_invalid
133 (module (func $type-empty-i32 (result i32) (block)))
134 "type mismatch"
135 )
136 (assert_invalid
137 (module (func $type-empty-i64 (result i64) (block)))
138 "type mismatch"
139 )
140 (assert_invalid
141 (module (func $type-empty-f32 (result f32) (block)))
142 "type mismatch"
143 )
144 (assert_invalid
145 (module (func $type-empty-f64 (result f64) (block)))
146 "type mismatch"
147 )
148
149 (assert_invalid
150 (module (func $type-value-num-vs-void
151 (block (i32.const 1))
152 ))
153 "type mismatch"
154 )
155 (assert_invalid
156 (module (func $type-value-void-vs-num (result i32)
157 (block (nop))
158 ))
159 "type mismatch"
160 )
161 (assert_invalid
162 (module (func $type-value-num-vs-num (result i32)
163 (block (f32.const 0))
164 ))
165 "type mismatch"
166 )
167
168 (; TODO(stack): soft failure
169 (assert_invalid
170 (module (func $type-value-num-vs-void-after-break
171 (block (br 0) (i32.const 1))
172 ))
173 "type mismatch"
174 )
175 (assert_invalid
176 (module (func $type-value-void-vs-num-after-break (result i32)
177 (block (i32.const 1) (br 0) (nop))
178 ))
179 "type mismatch"
180 )
181 (assert_invalid
182 (module (func $type-value-num-vs-num-after-break (result i32)
183 (block (i32.const 1) (br 0) (f32.const 0))
184 ))
185 "type mismatch"
186 )
187 (assert_invalid
188 (module (func $type-break-second-void-vs-num (result i32)
189 (block i32 (br 0 (i32.const 1)) (br 0 (nop)))
190 ))
191 "type mismatch"
192 )
193 (assert_invalid
194 (module (func $type-break-second-num-vs-num (result i32)
195 (block i32 (br 0 (i32.const 1)) (br 0 (f64.const 1)))
196 ))
197 "type mismatch"
198 )
199 ;)
200
201 (assert_invalid
202 (module (func $type-break-last-void-vs-num (result i32)
203 (block i32 (br 0))
204 ))
205 "type mismatch"
206 )
207 (assert_invalid
208 (module (func $type-break-void-vs-num (result i32)
209 (block i32 (br 0) (i32.const 1))
210 ))
211 "type mismatch"
212 )
213
214 (assert_invalid
215 (module (func $type-break-void-vs-num (result i32)
216 (block (br 0 (nop)) (i32.const 1))
217 ))
218 "type mismatch"
219 )
220 (assert_invalid
221 (module (func $type-break-num-vs-num (result i32)
222 (block (br 0 (i64.const 1)) (i32.const 1))
223 ))
224 "type mismatch"
225 )
226 (assert_invalid
227 (module (func $type-break-first-void-vs-num (result i32)
228 (block (br 0 (nop)) (br 0 (i32.const 1)))
229 ))
230 "type mismatch"
231 )
232 (assert_invalid
233 (module (func $type-break-first-num-vs-num (result i32)
234 (block (br 0 (i64.const 1)) (br 0 (i32.const 1)))
235 ))
236 "type mismatch"
237 )
238
239 (assert_invalid
240 (module (func $type-break-nested-num-vs-void
241 (block i32 (block i32 (br 1 (i32.const 1))) (br 0))
242 ))
243 "type mismatch"
244 )
245 (assert_invalid
246 (module (func $type-break-nested-empty-vs-num (result i32)
247 (block (block (br 1)) (br 0 (i32.const 1)))
248 ))
249 "type mismatch"
250 )
251
252 (assert_invalid
253 (module (func $type-break-nested-void-vs-num (result i32)
254 (block (block (br 1 (nop))) (br 0 (i32.const 1)))
255 ))
256 "type mismatch"
257 )
258 (assert_invalid
259 (module (func $type-break-nested-num-vs-num (result i32)
260 (block (block (br 1 (i64.const 1))) (br 0 (i32.const 1)))
261 ))
262 "type mismatch"
263 )
264
265 (assert_invalid
266 (module (func $type-break-operand-empty-vs-num (result i32)
267 (i32.ctz (block (br 0)))
268 ))
269 "type mismatch"
270 )
271
272 (assert_invalid
273 (module (func $type-break-operand-void-vs-num (result i32)
274 (i64.ctz (block (br 0 (nop))))
275 ))
276 "type mismatch"
277 )
278 (assert_invalid
279 (module (func $type-break-operand-num-vs-num (result i32)
280 (i64.ctz (block (br 0 (i64.const 9))))
281 ))
282 "type mismatch"
283 )
284