//@ check-pass // Issue #53114: NLL's borrow check had some deviations from the old borrow // checker, and both had some deviations from our ideal state. This test // captures the behavior of how `_` bindings are handled with respect to how we // flag expressions that are meant to request unsafe blocks. #![allow(irrefutable_let_patterns, dropping_references)] struct M; fn let_wild_gets_moved_expr() { let m = M; drop(m); let _ = m; // accepted, and want it to continue to be let mm = (M, M); // variation on above with `_` in substructure let (_x, _) = mm; let (_, _y) = mm; let (_, _) = mm; } fn match_moved_expr_to_wild() { let m = M; drop(m); match m { _ => { } } // #53114: accepted too let mm = (M, M); // variation on above with `_` in substructure match mm { (_x, _) => { } } match mm { (_, _y) => { } } match mm { (_, _) => { } } } fn if_let_moved_expr_to_wild() { let m = M; drop(m); if let _ = m { } // #53114: accepted too let mm = (M, M); // variation on above with `_` in substructure if let (_x, _) = mm { } if let (_, _y) = mm { } if let (_, _) = mm { } } fn let_wild_gets_borrowed_expr() { let mut m = M; let r = &mut m; let _ = m; // accepted, and want it to continue to be // let _x = m; // (compare with this error.) drop(r); let mut mm = (M, M); // variation on above with `_` in substructure let (r1, r2) = (&mut mm.0, &mut mm.1); let (_, _) = mm; drop((r1, r2)); } fn match_borrowed_expr_to_wild() { let mut m = M; let r = &mut m; match m { _ => {} } ; // accepted, and want it to continue to be drop(r); let mut mm = (M, M); // variation on above with `_` in substructure let (r1, r2) = (&mut mm.0, &mut mm.1); match mm { (_, _) => { } } drop((r1, r2)); } fn if_let_borrowed_expr_to_wild() { let mut m = M; let r = &mut m; if let _ = m { } // accepted, and want it to continue to be drop(r); let mut mm = (M, M); // variation on above with `_` in substructure let (r1, r2) = (&mut mm.0, &mut mm.1); if let (_, _) = mm { } drop((r1, r2)); } fn main() { }