summaryrefslogtreecommitdiffstats
path: root/src/test/ui/lint/dead-code/self-assign.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/lint/dead-code/self-assign.rs')
-rw-r--r--src/test/ui/lint/dead-code/self-assign.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/test/ui/lint/dead-code/self-assign.rs b/src/test/ui/lint/dead-code/self-assign.rs
new file mode 100644
index 000000000..ea7ce98d8
--- /dev/null
+++ b/src/test/ui/lint/dead-code/self-assign.rs
@@ -0,0 +1,52 @@
+// Test that dead code warnings are issued for superfluous assignments of
+// fields or variables to themselves (issue #75356).
+
+// ignore-test FIXME(81658, 83171)
+
+// 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
+}