summaryrefslogtreecommitdiffstats
path: root/tests/ui/nll/issue-52059-report-when-borrow-and-drop-conflict.rs
blob: 7ea1c445d143e3266dc544afaf3462915134927a (plain)
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
// rust-lang/rust#52059: Regardless of whether you are moving out of a
// Drop type or just introducing an inadvertent alias via a borrow of
// one of its fields, it is useful to be reminded of the significance
// of the fact that the type implements Drop.

pub struct S<'a> { url: &'a mut String }

impl<'a> Drop for S<'a> { fn drop(&mut self) { } }

fn finish_1(s: S) -> &mut String {
    s.url
}
//~^^ ERROR borrow may still be in use when destructor runs

fn finish_2(s: S) -> &mut String {
    let p = &mut *s.url; p
}
//~^^ ERROR borrow may still be in use when destructor runs

fn finish_3(s: S) -> &mut String {
    let p: &mut _ = s.url; p
}
//~^^ ERROR borrow may still be in use when destructor runs

fn finish_4(s: S) -> &mut String {
    let p = s.url; p
}
//~^^ ERROR cannot move out of type `S<'_>`, which implements the `Drop` trait

fn main() {}