// edition:2021 // check-pass #![allow(unreachable_code)] #![warn(unused)] #![allow(dead_code)] #[derive(Debug)] struct Point { x: i32, y: i32, } pub fn f() { let mut a = 1; let mut c = Point{ x:1, y:0 }; // Captured by value, but variable is dead on entry. (move || { // This will not trigger a warning for unused variable as // c.x will be treated as a Non-tracked place c.x = 1; println!("{}", c.x); a = 1; //~ WARN value captured by `a` is never read println!("{}", a); })(); // Read and written to, but never actually used. (move || { // This will not trigger a warning for unused variable as // c.x will be treated as a Non-tracked place c.x += 1; a += 1; //~ WARN unused variable: `a` })(); (move || { println!("{}", c.x); // Value is read by closure itself on later invocations. // This will not trigger a warning for unused variable as // c.x will be treated as a Non-tracked place c.x += 1; println!("{}", a); a += 1; })(); let b = Box::new(42); (move || { println!("{}", c.x); // Never read because this is FnOnce closure. // This will not trigger a warning for unused variable as // c.x will be treated as a Non-tracked place c.x += 1; println!("{}", a); a += 1; //~ WARN value assigned to `a` is never read drop(b); })(); } #[derive(Debug)] struct MyStruct<'a> { x: Option<& 'a str>, y: i32, } pub fn nested() { let mut a : Option<& str>; a = None; let mut b : Option<& str>; b = None; let mut d = MyStruct{ x: None, y: 1}; let mut e = MyStruct{ x: None, y: 1}; (|| { (|| { // This will not trigger a warning for unused variable as // d.x will be treated as a Non-tracked place d.x = Some("d1"); d.x = Some("d2"); a = Some("d1"); //~ WARN value assigned to `a` is never read a = Some("d2"); })(); (move || { // This will not trigger a warning for unused variable as //e.x will be treated as a Non-tracked place e.x = Some("e1"); e.x = Some("e2"); b = Some("e1"); //~ WARN value assigned to `b` is never read //~| WARN unused variable: `b` b = Some("e2"); //~ WARN value assigned to `b` is never read })(); })(); } fn main() {}