1 // aux-build:proc_macro_derive.rs
2 // aux-build:macro_rules.rs
4 #![warn(clippy::field_reassign_with_default)]
7 extern crate proc_macro_derive;
9 extern crate macro_rules;
11 // Don't lint on derives that derive `Default`
12 // See https://github.com/rust-lang/rust-clippy/issues/6545
13 #[derive(FieldReassignWithDefault)]
40 ($key:ident: $value:tt) => {{
41 let mut data = $crate::D::default();
42 data.$key = Some($value);
47 /// Implements .next() that returns a different number each time.
48 struct SideEffect(i32);
51 fn new() -> SideEffect {
54 fn next(&mut self) -> i32 {
61 // wrong, produces first error in stderr
62 let mut a: A = Default::default();
66 let mut a: A = Default::default();
75 let mut a: A = Default::default();
81 let mut a: A = Default::default();
86 let mut a: A = Default::default();
90 let b: B = B { i: 42, j: 24 };
93 let mut b: B = B { i: 42, j: 24 };
97 let mut b = B { i: 15, j: 16 };
98 let mut a: A = Default::default();
101 // wrong, produces second error in stderr
102 let mut a: A = Default::default();
106 // wrong, produces third error in stderr
107 let mut a: A = Default::default();
112 // wrong, produces fourth error in stderr
113 let mut a = A::default();
116 // wrong, but does not produce an error in stderr, because we can't produce a correct kind of
117 // suggestion with current implementation
118 let mut c: (i32, i32) = Default::default();
122 // wrong, produces the fifth error in stderr
123 let mut a: A = Default::default();
124 a.i = Default::default();
126 // wrong, produces the sixth error in stderr
127 let mut a: A = Default::default();
128 a.i = Default::default();
131 // right, because an assignment refers to another field
132 let mut x = A::default();
134 x.j = 21 + x.i as i64;
136 // right, we bail out if there's a reassignment to the same variable, since there is a risk of
137 // side-effects affecting the outcome
138 let mut x = A::default();
139 let mut side_effect = SideEffect::new();
140 x.i = side_effect.next();
142 x.i = side_effect.next();
144 // don't lint - some private fields
145 let mut x = m::F::default();
148 // don't expand macros in the suggestion (#6522)
149 let mut a: C = C::default();
152 // Don't lint in external macros
153 field_reassign_with_default!();
155 // be sure suggestion is correct with generics
156 let mut a: Wrapper<bool> = Default::default();
159 let mut a: WrapperMulti<i32, i64> = Default::default();
162 // Don't lint in macros
182 struct WrapperMulti<T, U> {