| //! Test that dead code warnings are issued for superfluous assignments of fields or variables to | |
| //! themselves (issue #75356). | |
| //! | |
| //! # History of this test (to aid relanding of a fixed version of #81473) | |
| //! | |
| //! - Original lint request was about self-assignments not triggering sth like `dead_code`. | |
| //! - `dead_code` lint expansion for self-assignments was implemented in #87129. | |
| //! - Unfortunately implementation components of #87129 had to be disabled as part of reverts | |
| //! #86212, #83171 (to revert #81473) to address regressions #81626 and #81658. | |
| //! - Re-enabled in current version to properly detect self-assignments. | |
| //@ check-pass | |
| #![allow(unused_assignments)] | |
| #![warn(dead_code)] | |
| fn main() { | |
| let mut x = 0; | |
| x = x; | |
| //~^ WARNING: useless assignment of variable of type `i32` to itself | |
| x = (x); | |
| //~^ WARNING: useless assignment of variable of type `i32` to itself | |
| x = {x}; | |
| // block expressions don't count as self-assignments | |
| struct S<'a> { f: &'a str } | |
| let mut s = S { f: "abc" }; | |
| s = s; | |
| //~^ WARNING: useless assignment of variable of type `S<'_>` to itself | |
| s.f = s.f; | |
| //~^ WARNING: useless assignment of field of type `&str` to itself | |
| struct N0 { x: Box<i32> } | |
| struct N1 { n: N0 } | |
| struct N2(N1); | |
| struct N3 { n: N2 }; | |
| let mut n3 = N3 { n: N2(N1 { n: N0 { x: Box::new(42) } }) }; | |
| n3.n.0.n.x = n3.n.0.n.x; | |
| //~^ WARNING: useless assignment of field of type `Box<i32>` to itself | |
| let mut t = (1, ((2, 3, (4, 5)),)); | |
| t.1.0.2.1 = t.1.0.2.1; | |
| //~^ WARNING: useless assignment of field of type `i32` to itself | |
| let mut y = 0; | |
| macro_rules! assign_to_y { | |
| ($cur:expr) => {{ | |
| y = $cur; | |
| }}; | |
| } | |
| assign_to_y!(y); | |
| // self-assignments in macro expansions are not reported either | |
| } |