#![warn(clippy::field_reassign_with_default)] #[derive(Default)] struct A { i: i32, j: i64, } struct B { i: i32, j: i64, } /// Implements .next() that returns a different number each time. struct SideEffect(i32); impl SideEffect { fn new() -> SideEffect { SideEffect(0) } fn next(&mut self) -> i32 { self.0 += 1; self.0 } } fn main() { // wrong, produces first error in stderr let mut a: A = Default::default(); a.i = 42; // right let mut a: A = Default::default(); // right let a = A { i: 42, ..Default::default() }; // right let mut a: A = Default::default(); if a.i == 0 { a.j = 12; } // right let mut a: A = Default::default(); let b = 5; // right let mut b = 32; let mut a: A = Default::default(); b = 2; // right let b: B = B { i: 42, j: 24 }; // right let mut b: B = B { i: 42, j: 24 }; b.i = 52; // right let mut b = B { i: 15, j: 16 }; let mut a: A = Default::default(); b.i = 2; // wrong, produces second error in stderr let mut a: A = Default::default(); a.j = 43; a.i = 42; // wrong, produces third error in stderr let mut a: A = Default::default(); a.i = 42; a.j = 43; a.j = 44; // wrong, produces fourth error in stderr let mut a = A::default(); a.i = 42; // wrong, but does not produce an error in stderr, because we can't produce a correct kind of // suggestion with current implementation let mut c: (i32, i32) = Default::default(); c.0 = 42; c.1 = 21; // wrong, produces the fifth error in stderr let mut a: A = Default::default(); a.i = Default::default(); // wrong, produces the sixth error in stderr let mut a: A = Default::default(); a.i = Default::default(); a.j = 45; // right, because an assignment refers to another field let mut x = A::default(); x.i = 42; x.j = 21 + x.i as i64; // right, we bail out if there's a reassignment to the same variable, since there is a risk of // side-effects affecting the outcome let mut x = A::default(); let mut side_effect = SideEffect::new(); x.i = side_effect.next(); x.j = 2; x.i = side_effect.next(); // don't lint - some private fields let mut x = m::F::default(); x.a = 1; } mod m { #[derive(Default)] pub struct F { pub a: u64, b: u64, } }