8 const fn basics((a,): (u32,)) -> u32 {
9 // Deferred assignment:
13 // Immediate assignment:
17 let mut d: u32 = c + 1;
21 // No effect statements work:
26 let mut arr: [u32; 1] = [0];
32 let mut foo: Foo<u32> = Foo(0);
33 let mut bar: Bar<u32> = Bar { x: 0 };
36 d = d + foo.0 + bar.x;
39 // Array + Field projection:
40 let mut arr: [Foo<u32>; 1] = [Foo(0)];
43 let mut arr: [Bar<u32>; 1] = [Bar { x: 0 }];
48 // Field + Array projection:
49 let mut arr: Foo<[u32; 1]> = Foo([0]);
52 let mut arr: Bar<[u32; 1]> = Bar { x: [0] };
60 const fn add_assign(W(a): W) -> u32 {
62 let mut d: u32 = a + 1;
67 let mut arr: [u32; 1] = [0];
73 let mut foo: Foo<u32> = Foo(0);
74 let mut bar: Bar<u32> = Bar { x: 0 };
80 // Array + Field projection:
81 let mut arr: [Foo<u32>; 1] = [Foo(0)];
84 let mut arr: [Bar<u32>; 1] = [Bar { x: 0 }];
89 // Field + Array projection:
90 let mut arr: Foo<[u32; 1]> = Foo([0]);
93 let mut arr: Bar<[u32; 1]> = Bar { x: [0] };
101 const fn mul_assign(A { a }: A) -> u32 {
103 let mut d: u32 = a + 1;
108 let mut arr: [u32; 1] = [1];
114 let mut foo: Foo<u32> = Foo(1);
115 let mut bar: Bar<u32> = Bar { x: 1 };
121 // Array + Field projection:
122 let mut arr: [Foo<u32>; 1] = [Foo(1)];
125 let mut arr: [Bar<u32>; 1] = [Bar { x: 1 }];
130 // Field + Array projection:
131 let mut arr: Foo<[u32; 1]> = Foo([1]);
134 let mut arr: Bar<[u32; 1]> = Bar { x: [1] };
142 const fn div_assign(a: [u32; 1]) -> u32 {
145 let mut d: u32 = 1024 * a;
150 let mut arr: [u32; 1] = [4];
156 let mut foo: Foo<u32> = Foo(4);
157 let mut bar: Bar<u32> = Bar { x: 4 };
164 // Array + Field projection:
165 let mut arr: [Foo<u32>; 1] = [Foo(4)];
168 let mut arr: [Bar<u32>; 1] = [Bar { x: 4 }];
173 // Field + Array projection:
174 let mut arr: Foo<[u32; 1]> = Foo([4]);
177 let mut arr: Bar<[u32; 1]> = Bar { x: [4] };
185 const fn rem_assign(W(a): W) -> u32 {
192 let mut arr: [u32; 1] = [3];
198 let mut foo: Foo<u32> = Foo(5);
199 let mut bar: Bar<u32> = Bar { x: 7 };
202 d %= 8 + foo.0 + bar.x;
205 // Array + Field projection:
206 let mut arr: [Foo<u32>; 1] = [Foo(4)];
210 let mut arr: [Bar<u32>; 1] = [Bar { x: 7 }];
215 // Field + Array projection:
216 let mut arr: Foo<[u32; 1]> = Foo([6]);
219 let mut arr: Bar<[u32; 1]> = Bar { x: [11] };
226 const fn sub_assign(W(a): W) -> u32 {
232 let mut arr: [u32; 1] = [2];
237 let mut foo: Foo<u32> = Foo(2);
238 let mut bar: Bar<u32> = Bar { x: 2 };
243 // Array + Field projection:
244 let mut arr: [Foo<u32>; 1] = [Foo(2)];
247 let mut arr: [Bar<u32>; 1] = [Bar { x: 2 }];
251 // Field + Array projection:
252 let mut arr: Foo<[u32; 1]> = Foo([2]);
255 let mut arr: Bar<[u32; 1]> = Bar { x: [2] };
262 const fn shl_assign(W(a): W) -> u32 {
268 let mut arr: [u32; 1] = [1];
270 d <<= arr[0]; // 10 << 2
273 let mut foo: Foo<u32> = Foo(1);
274 let mut bar: Bar<u32> = Bar { x: 1 };
277 d <<= foo.0 + bar.x; // 1000 << 4
279 // Array + Field projection:
280 let mut arr: [Foo<u32>; 1] = [Foo(1)];
282 d <<= arr[0].0; // 1000_0000 << 2
283 let mut arr: [Bar<u32>; 1] = [Bar { x: 1 }];
285 d <<= arr[0].x; // 1000_0000_00 << 2
287 // Field + Array projection:
288 let mut arr: Foo<[u32; 1]> = Foo([1]);
290 d <<= (arr.0)[0]; // 1000_0000_0000 << 2
291 let mut arr: Bar<[u32; 1]> = Bar { x: [1] };
293 d <<= arr.x[0]; // 1000_0000_0000_00 << 2
298 const fn shr_assign(W(a): W) -> u32 {
304 let mut arr: [u32; 1] = [2];
306 d >>= arr[0]; // /= 4
309 let mut foo: Foo<u32> = Foo(2);
310 let mut bar: Bar<u32> = Bar { x: 2 };
313 d >>= foo.0 + bar.x; // /= 16
315 // Array + Field projection:
316 let mut arr: [Foo<u32>; 1] = [Foo(2)];
318 d >>= arr[0].0; // /= 32
319 let mut arr: [Bar<u32>; 1] = [Bar { x: 2 }];
321 d >>= arr[0].x; // /= 64
323 // Field + Array projection:
324 let mut arr: Foo<[u32; 1]> = Foo([2]);
326 d >>= (arr.0)[0]; // /= 128
327 let mut arr: Bar<[u32; 1]> = Bar { x: [2] };
329 d >>= arr.x[0]; // /= 256
334 const fn bit_and_assign(W(a): W) -> u32 {
335 let f = 0b1111_1111_1111_1111;
339 d &= 0b1111_1111_1111_1110;
342 let mut arr: [u32; 1] = [f];
343 arr[0] &= 0b1111_1111_1111_1101;
347 let mut foo: Foo<u32> = Foo(f);
348 let mut bar: Bar<u32> = Bar { x: f };
349 foo.0 &= 0b1111_1111_1111_0111;
350 bar.x &= 0b1111_1111_1101_1111;
353 // Array + Field projection:
354 let mut arr: [Foo<u32>; 1] = [Foo(f)];
355 arr[0].0 &= 0b1111_1110_1111_1111;
357 let mut arr: [Bar<u32>; 1] = [Bar { x: f }];
358 arr[0].x &= 0b1111_1101_1111_1111;
361 // Field + Array projection:
362 let mut arr: Foo<[u32; 1]> = Foo([f]);
363 (arr.0)[0] &= 0b1011_1111_1111_1111;
365 let mut arr: Bar<[u32; 1]> = Bar { x: [f] };
366 arr.x[0] &= 0b0111_1111_1111_1111;
372 const fn bit_or_assign(W(a): W) -> u32 {
373 let f = 0b0000_0000_0000_0000;
377 d |= 0b0000_0000_0000_0001;
380 let mut arr: [u32; 1] = [f];
381 arr[0] |= 0b0000_0000_0000_1001;
385 let mut foo: Foo<u32> = Foo(f);
386 let mut bar: Bar<u32> = Bar { x: f };
387 foo.0 |= 0b0000_0000_0001_0000;
388 bar.x |= 0b0000_0000_0100_0000;
391 // Array + Field projection:
392 let mut arr: [Foo<u32>; 1] = [Foo(f)];
393 arr[0].0 |= 0b0000_0001_0000_0000;
395 let mut arr: [Bar<u32>; 1] = [Bar { x: f }];
396 arr[0].x |= 0b0000_0010_0000_0000;
399 // Field + Array projection:
400 let mut arr: Foo<[u32; 1]> = Foo([f]);
401 (arr.0)[0] |= 0b1000_0000_0000_0000;
402 d |= (arr.0)[0]; // /= 128
403 let mut arr: Bar<[u32; 1]> = Bar { x: [f] };
404 arr.x[0] |= 0b1100_0000_0000_0000;
405 d |= arr.x[0]; // /= 256
410 const fn bit_xor_assign(W(a): W) -> u32 {
411 let f = 0b0000_0000_0000_0000;
415 d ^= 0b0000_0000_0000_0001;
418 let mut arr: [u32; 1] = [f];
419 arr[0] ^= 0b0000_0000_0000_0010;
423 let mut foo: Foo<u32> = Foo(f);
424 let mut bar: Bar<u32> = Bar { x: f };
425 foo.0 ^= 0b0000_0000_0001_0000;
426 bar.x ^= 0b0000_0000_1000_0000;
429 // Array + Field projection:
430 let mut arr: [Foo<u32>; 1] = [Foo(f)];
431 arr[0].0 ^= 0b0000_0001_0000_0000;
433 let mut arr: [Bar<u32>; 1] = [Bar { x: f }];
434 arr[0].x ^= 0b0000_0010_0000_0000;
437 // Field + Array projection:
438 let mut arr: Foo<[u32; 1]> = Foo([f]);
439 (arr.0)[0] ^= 0b0100_0000_0000_0000;
441 let mut arr: Bar<[u32; 1]> = Bar { x: [f] };
442 arr.x[0] ^= 0b1000_0000_0000_0000;
449 ($c:ident, $e:expr, $r:expr) => {
457 test!(BASICS, basics((2,)), 13);
458 test!(ADD, add_assign(W(1)), 10);
459 test!(MUL, mul_assign(A { a: 0 }), 256);
460 test!(DIV, div_assign([1]), 4);
461 test!(REM, rem_assign(W(5)), 5);
462 test!(SUB, sub_assign(W(8)), 0);
463 test!(SHL, shl_assign(W(1)), 0b1000_0000_0000_0000);
464 test!(SHR, shr_assign(W(256)), 1);
465 test!(AND, bit_and_assign(W(0b1011_1111_1111_1111_1111)), 0b0011_1100_1101_0100);
466 test!(OR, bit_or_assign(W(0b1011_0000_0000_0000)), 0b1111_0011_0101_1001);
467 test!(XOR, bit_xor_assign(W(0b0000_0000_0000_0000)), 0b1100_0011_1001_0011);