use proc_unroll::unroll; macro_rules! make_test { ($name:ident -> $type:ty, { $($body:tt)* }) => { #[test] fn $name() { fn normal() -> $type { $($body)* } #[unroll] fn unrolled() -> $type { $($body)* } assert_eq!(normal(), unrolled()); } }; } make_test!(simple -> Vec, { let mut vec = vec![]; for x in 0..5 { vec.push(x); } vec }); make_test!(negative -> Vec, { let mut vec = vec![]; for x in -2..5 { vec.push(x); } vec }); make_test!(suffixed -> Vec, { let mut vec = vec![]; for x in 0..5usize { vec.push(x as isize); } vec }); make_test!(slice -> Vec, { let mut vec = vec![]; for &x in &[2, 4, 6, 8] { vec.push(x); } vec }); #[test] fn const_fn_range() { #[unroll] const fn inner() -> usize { let mut total = 0; for x in 1..5 { total += x; } total } assert_eq!(inner(), 10); } #[test] fn const_fn_slice() { #[unroll] const fn inner() -> i32 { let mut total = 0; for x in &[5, 15] { total += *x; } total } assert_eq!(inner(), 20); }