#![warn(clippy::only_used_in_recursion)] fn simple(a: usize, b: usize) -> usize { if a == 0 { 1 } else { simple(a - 1, b) } } fn with_calc(a: usize, b: isize) -> usize { if a == 0 { 1 } else { with_calc(a - 1, -b + 1) } } fn tuple((a, b): (usize, usize)) -> usize { if a == 0 { 1 } else { tuple((a - 1, b + 1)) } } fn let_tuple(a: usize, b: usize) -> usize { let (c, d) = (a, b); if c == 0 { 1 } else { let_tuple(c - 1, d + 1) } } fn array([a, b]: [usize; 2]) -> usize { if a == 0 { 1 } else { array([a - 1, b + 1]) } } fn index(a: usize, mut b: &[usize], c: usize) -> usize { if a == 0 { 1 } else { index(a - 1, b, c + b[0]) } } fn break_(a: usize, mut b: usize, mut c: usize) -> usize { let c = loop { b += 1; c += 1; if c == 10 { break b; } }; if a == 0 { 1 } else { break_(a - 1, c, c) } } // this has a side effect fn mut_ref(a: usize, b: &mut usize) -> usize { *b = 1; if a == 0 { 1 } else { mut_ref(a - 1, b) } } fn mut_ref2(a: usize, b: &mut usize) -> usize { let mut c = *b; if a == 0 { 1 } else { mut_ref2(a - 1, &mut c) } } fn not_primitive(a: usize, b: String) -> usize { if a == 0 { 1 } else { not_primitive(a - 1, b) } } // this doesn't have a side effect, // but `String` is not primitive. fn not_primitive_op(a: usize, b: String, c: &str) -> usize { if a == 1 { 1 } else { not_primitive_op(a, b + c, c) } } struct A; impl A { fn method(&self, a: usize, b: usize) -> usize { if a == 0 { 1 } else { self.method(a - 1, b + 1) } } } fn ignore(a: usize, _: usize) -> usize { if a == 1 { 1 } else { ignore(a - 1, 0) } } fn main() {}