4 (elem declare func $dummy)
6 (func $consume (param i32))
7 (func $produce (result i32) (i32.const 7))
9 (func (export "syntax") (param $x1 i32) (param $x2 i64)
12 (local.set $y2 (i32.const 5))
19 (let (result) (local))
20 (let $l (result) (local))
22 (let (call $dummy) (call $consume (local.get $x1)))
23 (let $l (call $dummy) (call $consume (local.get $y2)))
24 (let (local) (call $dummy) (call $consume (local.get $y2)))
25 (let $l (local) (call $dummy) (call $consume (local.get $x1)))
27 (let (call $dummy) (call $dummy) (br 0))
28 (let $l (call $dummy) (call $dummy) (br $l))
29 (let (local) (call $dummy) (call $dummy) (br 0))
30 (let $l (local) (call $dummy) (call $dummy) (br $l))
34 (let $l (param i32) (result i64) (local f32) (br $l (i64.const 3)))
37 (let (result i32) (call $dummy) (call $produce) (call $dummy))
39 (let $l (result i32) (call $dummy) (call $produce) (call $dummy))
41 (let (result i32) (local) (call $dummy) (call $produce) (call $dummy))
43 (let $l (result i32) (local) (call $dummy) (call $produce) (call $dummy))
47 (let (local i32) (call $dummy) (call $consume (local.get 0)))
49 (let $l (local i32) (call $dummy) (call $consume (local.get 0)))
51 (let (local i32) (call $dummy) (call $consume (local.get 0)))
53 (let $l (local i32) (call $dummy) (call $consume (local.get 0)))
55 (i32.const 1) (f32.const 2) (i32.const 3) (i64.const 4)
56 (let (local i32 f32) (local) (local $z i32) (local i64)
57 (call $consume (local.get 0))
58 (call $consume (local.get 2)) ;; $z
59 (call $consume (local.get 4)) ;; $x1
60 (call $consume (local.get 7)) ;; $y2
61 (call $consume (local.get $z))
62 (call $consume (local.get $x1))
63 (call $consume (local.get $y2))
66 (f32.const 1) (i32.const 2) (i64.const 3) (i32.const 4)
67 (let (result i32) (local $z1 f32) (local $z2 i32) (local) (local i64 i32)
69 (call $consume (local.get 1)) ;; $z2
70 (call $consume (local.get 3))
71 (call $consume (local.get 4)) ;; $x1
72 (call $consume (local.get 7)) ;; $y2
73 (call $consume (local.get $z2))
74 (call $consume (local.get $x1))
75 (call $consume (local.get $y2))
80 (let (local (ref $dummy)))
83 (func $pow (export "pow") (param $x i64) (param $n i32) (result i64)
86 (if (result i64) (i32.and (local.get $n) (i32.const 1))
87 (then (local.get $x)) (else (i64.const 1))
92 (if (result i64) (i32.le_u (local.get $n) (i32.const 1))
96 (i64.mul (local.get $x) (local.get $x))
97 (i32.shr_u (local.get $n) (i32.const 1))
104 (func (export "semantics-idx") (param i64 i64) (result i64)
106 (local.set 2 (i64.const 5))
107 (local.set 3 (i64.const 7))
109 (i64.const 11) (i64.const 13)
110 (let (result i64) (local i64 i64)
111 (i64.const 17) (i64.const 19)
112 (let (result i64) (local i64 i64)
114 (i64.add (call $pow (local.get 0) (i32.const 0))) ;; 17^0 = 1
115 (i64.add (call $pow (local.get 1) (i32.const 1))) ;; 19^1 = 19
116 (i64.add (call $pow (local.get 2) (i32.const 2))) ;; 11^2 = 121
117 (i64.add (call $pow (local.get 3) (i32.const 3))) ;; 13^3 = 2197
118 (i64.add (call $pow (local.get 4) (i32.const 4))) ;; 2^4 = 16
119 (i64.add (call $pow (local.get 5) (i32.const 5))) ;; 3^5 = 243
120 (i64.add (call $pow (local.get 6) (i32.const 6))) ;; 5^6 = 15625
121 (i64.add (call $pow (local.get 7) (i32.const 7))) ;; 7^7 = 823543
126 (func (export "semantics-sym") (param $x1 i64) (param $x2 i64) (result i64)
129 (local.set $y1 (i64.const 5))
130 (local.set $y2 (i64.const 7))
132 (i64.const 11) (i64.const 13)
133 (let (result i64) (local $z1 i64) (local $z2 i64)
134 (i64.const 17) (i64.const 19)
135 (let (result i64) (local $u1 i64) (local $u2 i64)
137 (i64.add (call $pow (local.get $u1) (i32.const 0))) ;; 17^0 = 1
138 (i64.add (call $pow (local.get $u2) (i32.const 1))) ;; 19^1 = 19
139 (i64.add (call $pow (local.get $z1) (i32.const 2))) ;; 11^2 = 121
140 (i64.add (call $pow (local.get $z2) (i32.const 3))) ;; 13^3 = 2197
141 (i64.add (call $pow (local.get $x1) (i32.const 4))) ;; 2^4 = 16
142 (i64.add (call $pow (local.get $x2) (i32.const 5))) ;; 3^5 = 243
143 (i64.add (call $pow (local.get $y1) (i32.const 6))) ;; 5^6 = 15625
144 (i64.add (call $pow (local.get $y2) (i32.const 7))) ;; 7^7 = 823543
149 (func (export "mutate") (param $x1 i64) (param $x2 i64) (result i64)
153 (i64.const 0) (i64.const 0)
154 (let (result i64) (local $z1 i64) (local $z2 i64)
155 (i64.const 0) (i64.const 0)
156 (let (result i64) (local $u1 i64) (local $u2 i64)
157 (local.set $y1 (i64.const 5))
158 (local.set $y2 (i64.const 7))
159 (local.set $z1 (i64.const 11))
160 (local.set $z2 (i64.const 13))
161 (local.set $u1 (i64.const 17))
162 (local.set $u2 (i64.const 19))
164 (i64.add (call $pow (local.get $u1) (i32.const 0))) ;; 17^0 = 1
165 (i64.add (call $pow (local.get $u2) (i32.const 1))) ;; 19^1 = 19
166 (i64.add (call $pow (local.get $z1) (i32.const 2))) ;; 11^2 = 121
167 (i64.add (call $pow (local.get $z2) (i32.const 3))) ;; 13^3 = 2197
168 (i64.add (call $pow (local.get $x1) (i32.const 4))) ;; 2^4 = 16
169 (i64.add (call $pow (local.get $x2) (i32.const 5))) ;; 3^5 = 243
170 (i64.add (call $pow (local.get $y1) (i32.const 6))) ;; 5^6 = 15625
171 (i64.add (call $pow (local.get $y2) (i32.const 7))) ;; 7^7 = 823543
177 (assert_return (invoke "syntax" (i32.const 1) (i64.const 2)))
179 (assert_return (invoke "pow" (i64.const 17) (i32.const 0)) (i64.const 1))
180 (assert_return (invoke "pow" (i64.const 19) (i32.const 1)) (i64.const 19))
181 (assert_return (invoke "pow" (i64.const 11) (i32.const 2)) (i64.const 121))
182 (assert_return (invoke "pow" (i64.const 13) (i32.const 3)) (i64.const 2197))
183 (assert_return (invoke "pow" (i64.const 2) (i32.const 4)) (i64.const 16))
184 (assert_return (invoke "pow" (i64.const 3) (i32.const 5)) (i64.const 243))
185 (assert_return (invoke "pow" (i64.const 5) (i32.const 6)) (i64.const 15625))
186 (assert_return (invoke "pow" (i64.const 7) (i32.const 7)) (i64.const 823543))
188 (assert_return (invoke "semantics-idx" (i64.const 2) (i64.const 3)) (i64.const 841_765))
189 (assert_return (invoke "semantics-sym" (i64.const 2) (i64.const 3)) (i64.const 841_765))
190 (assert_return (invoke "mutate" (i64.const 2) (i64.const 3)) (i64.const 841_765))
195 ;; Shadowing is fine across nested let blocks (analogous to labels).
197 (func (export "f1") (param $x i32) (result i32)
199 (let (local $x i32) (return (local.get $x)))
202 (func (export "f2") (result i32)
205 (let (local $x i32) (return (local.get $x)))
208 (func (export "f3") (result i32)
212 (let (local $x i32) (return (local.get $x)))
216 (func (export "f4") (result i32)
221 (let (local $x i32) (return (local.get $x)))
227 (assert_return (invoke "f1" (i32.const 0)) (i32.const 1))
228 (assert_return (invoke "f2") (i32.const 1))
229 (assert_return (invoke "f3") (i32.const 1))
230 (assert_return (invoke "f4") (i32.const 2))
232 ;; Duplicate labels within a single let block are still disallowed.
234 (module quote "(func (let (local $x i32) (local $x i64)))")
242 (module quote "(func (let (local) (param)))")
248 " (i32.const 0) (i32.const 0)"
249 " (let (local i32) (param i32) (drop))"
256 (module quote "(func (let (local) (result)))")
263 " (let (local i32) (result i32) (local.get 0))"
271 " (let (local $x i32) (result i32) (local.get 0))"
278 (module quote "(func (let (result) (param)))")
285 " (let (result i32) (param i32))"
292 (module quote "(func (let (param) $l))")
296 (module quote "(func (let (result) $l))")
300 (module quote "(func (let (local) $l))")