1 // build-pass (FIXME(62277): could be check-pass?)
10 const fn basics((a,): (f32,)) -> f32 {
11 // Deferred assignment:
15 // Immediate assignment:
19 let mut d: f32 = c + 1.0;
23 // No effect statements work:
28 let mut arr: [f32; 1] = [0.0];
34 let mut foo: Foo<f32> = Foo(0.0);
35 let mut bar: Bar<f32> = Bar { x: 0.0 };
38 d = d + foo.0 + bar.x;
41 // Array + Field projection:
42 let mut arr: [Foo<f32>; 1] = [Foo(0.0)];
45 let mut arr: [Bar<f32>; 1] = [Bar { x: 0.0 }];
50 // Field + Array projection:
51 let mut arr: Foo<[f32; 1]> = Foo([0.0]);
54 let mut arr: Bar<[f32; 1]> = Bar { x: [0.0] };
62 const fn add_assign(W(a): W) -> f32 {
64 let mut d: f32 = a + 1.0;
69 let mut arr: [f32; 1] = [0.0];
75 let mut foo: Foo<f32> = Foo(0.0);
76 let mut bar: Bar<f32> = Bar { x: 0.0 };
82 // Array + Field projection:
83 let mut arr: [Foo<f32>; 1] = [Foo(0.0)];
86 let mut arr: [Bar<f32>; 1] = [Bar { x: 0.0 }];
91 // Field + Array projection:
92 let mut arr: Foo<[f32; 1]> = Foo([0.0]);
95 let mut arr: Bar<[f32; 1]> = Bar { x: [0.0] };
103 const fn mul_assign(A { a }: A) -> f32 {
105 let mut d: f32 = a + 1.0;
110 let mut arr: [f32; 1] = [1.0];
116 let mut foo: Foo<f32> = Foo(1.0);
117 let mut bar: Bar<f32> = Bar { x: 1.0 };
123 // Array + Field projection:
124 let mut arr: [Foo<f32>; 1] = [Foo(1.0)];
127 let mut arr: [Bar<f32>; 1] = [Bar { x: 1.0 }];
132 // Field + Array projection:
133 let mut arr: Foo<[f32; 1]> = Foo([1.0]);
136 let mut arr: Bar<[f32; 1]> = Bar { x: [1.0] };
144 const fn div_assign(a: [f32; 1]) -> f32 {
147 let mut d: f32 = 1024.0 * a;
152 let mut arr: [f32; 1] = [4.0];
158 let mut foo: Foo<f32> = Foo(4.0);
159 let mut bar: Bar<f32> = Bar { x: 4.0 };
166 // Array + Field projection:
167 let mut arr: [Foo<f32>; 1] = [Foo(4.0)];
170 let mut arr: [Bar<f32>; 1] = [Bar { x: 4.0 }];
175 // Field + Array projection:
176 let mut arr: Foo<[f32; 1]> = Foo([4.0]);
179 let mut arr: Bar<[f32; 1]> = Bar { x: [4.0] };
187 const fn rem_assign(W(a): W) -> f32 {
194 let mut arr: [f32; 1] = [3.0];
200 let mut foo: Foo<f32> = Foo(5.0);
201 let mut bar: Bar<f32> = Bar { x: 7.0 };
204 d %= 8.0 + foo.0 + bar.x;
207 // Array + Field projection:
208 let mut arr: [Foo<f32>; 1] = [Foo(4.0)];
212 let mut arr: [Bar<f32>; 1] = [Bar { x: 7.0 }];
217 // Field + Array projection:
218 let mut arr: Foo<[f32; 1]> = Foo([6.0]);
220 d %= 9.0 + (arr.0)[0];
221 let mut arr: Bar<[f32; 1]> = Bar { x: [11.0] };
228 const fn sub_assign(W(a): W) -> f32 {
234 let mut arr: [f32; 1] = [2.0];
239 let mut foo: Foo<f32> = Foo(2.0);
240 let mut bar: Bar<f32> = Bar { x: 2.0 };
245 // Array + Field projection:
246 let mut arr: [Foo<f32>; 1] = [Foo(2.0)];
249 let mut arr: [Bar<f32>; 1] = [Bar { x: 2.0 }];
253 // Field + Array projection:
254 let mut arr: Foo<[f32; 1]> = Foo([2.0]);
257 let mut arr: Bar<[f32; 1]> = Bar { x: [2.0] };
265 ($c:ident, $e:expr, $r:expr) => {
273 test!(BASICS, basics((2.0,)), 13.0);
274 test!(ADD, add_assign(W(1.0)), 10.0);
275 test!(MUL, mul_assign(A { a: 0.0 }), 256.0);
276 test!(DIV, div_assign([1.0]), 4.0);
277 test!(REM, rem_assign(W(5.0)), 5.0);
278 test!(SUB, sub_assign(W(8.0)), 0.0);