3 #![feature(const_fn_floating_point_arithmetic)]
10 #[allow(redundant_semicolons)]
11 const fn basics((a,): (f32,)) -> f32 {
12 // Deferred assignment:
16 // Immediate assignment:
20 let mut d: f32 = c + 1.0;
24 // No effect statements work:
29 let mut arr: [f32; 1] = [0.0];
35 let mut foo: Foo<f32> = Foo(0.0);
36 let mut bar: Bar<f32> = Bar { x: 0.0 };
39 d = d + foo.0 + bar.x;
42 // Array + Field projection:
43 let mut arr: [Foo<f32>; 1] = [Foo(0.0)];
46 let mut arr: [Bar<f32>; 1] = [Bar { x: 0.0 }];
51 // Field + Array projection:
52 let mut arr: Foo<[f32; 1]> = Foo([0.0]);
55 let mut arr: Bar<[f32; 1]> = Bar { x: [0.0] };
63 const fn add_assign(W(a): W) -> f32 {
65 let mut d: f32 = a + 1.0;
70 let mut arr: [f32; 1] = [0.0];
76 let mut foo: Foo<f32> = Foo(0.0);
77 let mut bar: Bar<f32> = Bar { x: 0.0 };
83 // Array + Field projection:
84 let mut arr: [Foo<f32>; 1] = [Foo(0.0)];
87 let mut arr: [Bar<f32>; 1] = [Bar { x: 0.0 }];
92 // Field + Array projection:
93 let mut arr: Foo<[f32; 1]> = Foo([0.0]);
96 let mut arr: Bar<[f32; 1]> = Bar { x: [0.0] };
104 const fn mul_assign(A { a }: A) -> f32 {
106 let mut d: f32 = a + 1.0;
111 let mut arr: [f32; 1] = [1.0];
117 let mut foo: Foo<f32> = Foo(1.0);
118 let mut bar: Bar<f32> = Bar { x: 1.0 };
124 // Array + Field projection:
125 let mut arr: [Foo<f32>; 1] = [Foo(1.0)];
128 let mut arr: [Bar<f32>; 1] = [Bar { x: 1.0 }];
133 // Field + Array projection:
134 let mut arr: Foo<[f32; 1]> = Foo([1.0]);
137 let mut arr: Bar<[f32; 1]> = Bar { x: [1.0] };
145 const fn div_assign(a: [f32; 1]) -> f32 {
148 let mut d: f32 = 1024.0 * a;
153 let mut arr: [f32; 1] = [4.0];
159 let mut foo: Foo<f32> = Foo(4.0);
160 let mut bar: Bar<f32> = Bar { x: 4.0 };
167 // Array + Field projection:
168 let mut arr: [Foo<f32>; 1] = [Foo(4.0)];
171 let mut arr: [Bar<f32>; 1] = [Bar { x: 4.0 }];
176 // Field + Array projection:
177 let mut arr: Foo<[f32; 1]> = Foo([4.0]);
180 let mut arr: Bar<[f32; 1]> = Bar { x: [4.0] };
188 const fn rem_assign(W(a): W) -> f32 {
195 let mut arr: [f32; 1] = [3.0];
201 let mut foo: Foo<f32> = Foo(5.0);
202 let mut bar: Bar<f32> = Bar { x: 7.0 };
205 d %= 8.0 + foo.0 + bar.x;
208 // Array + Field projection:
209 let mut arr: [Foo<f32>; 1] = [Foo(4.0)];
213 let mut arr: [Bar<f32>; 1] = [Bar { x: 7.0 }];
218 // Field + Array projection:
219 let mut arr: Foo<[f32; 1]> = Foo([6.0]);
221 d %= 9.0 + (arr.0)[0];
222 let mut arr: Bar<[f32; 1]> = Bar { x: [11.0] };
229 const fn sub_assign(W(a): W) -> f32 {
235 let mut arr: [f32; 1] = [2.0];
240 let mut foo: Foo<f32> = Foo(2.0);
241 let mut bar: Bar<f32> = Bar { x: 2.0 };
246 // Array + Field projection:
247 let mut arr: [Foo<f32>; 1] = [Foo(2.0)];
250 let mut arr: [Bar<f32>; 1] = [Bar { x: 2.0 }];
254 // Field + Array projection:
255 let mut arr: Foo<[f32; 1]> = Foo([2.0]);
258 let mut arr: Bar<[f32; 1]> = Bar { x: [2.0] };
266 ($c:ident, $e:expr, $r:expr) => {
274 test!(BASICS, basics((2.0,)), 13.0);
275 test!(ADD, add_assign(W(1.0)), 10.0);
276 test!(MUL, mul_assign(A { a: 0.0 }), 256.0);
277 test!(DIV, div_assign([1.0]), 4.0);
278 test!(REM, rem_assign(W(5.0)), 5.0);
279 test!(SUB, sub_assign(W(8.0)), 0.0);