//! returns: 0 /// Count guard evaluations. fn guard(calls: &mut u32, accepted: bool) -> bool { set *calls += 1; return accepted; } /// Check guarded conditional binding. fn conditional(value: u32, accepted: bool, calls: &mut u32) -> u32 { if let case 1 = value; guard(calls, accepted) { return 10; } else { return 20; } } /// Check guarded binding with a diverging fallback. fn binding(value: u32, accepted: bool, calls: &mut u32) -> u32 { let case 1 = value if guard(calls, accepted) else { return 20; }; return 10; } /// Check guard failure and pattern failure at loop exit. fn looping(value: u32, limit: u32, calls: &mut u32) -> u32 { let mut steps: u32 = 0; while let case 1 = value; guard(calls, steps < limit) { set steps += 1; } return steps; } /// Check preallocated success blocks without guards. fn unguarded(value: u32) -> u32 { let case 1 = value else { return 0; }; let mut current = value; let mut result: u32 = 0; while let case 1 = current { if let case 1 = current { set result += 1; } set current = 0; } return result; } /// Exercise both pattern outcomes and guard outcomes for every binding form. @default fn main() -> u32 { for value in 0..3 { assert unguarded(value) == (1 if value == 1 else 0); for flag in 0..2 { let accepted = flag == 1; let expected: u32 = 10 if value == 1 and accepted else 20; let mut calls: u32 = 0; assert conditional(value, accepted, &mut calls) == expected; assert calls == (1 if value == 1 else 0); set calls = 0; assert binding(value, accepted, &mut calls) == expected; assert calls == (1 if value == 1 else 0); } for limit in 0..4 { let mut calls: u32 = 0; assert looping(value, limit, &mut calls) == (limit if value == 1 else 0); assert calls == (limit + 1 if value == 1 else 0); } } return 0; }