1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
//@ 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() { }
|