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() { }
|