]> git.lizzy.rs Git - rust.git/blob - src/test/ui/span/borrowck-borrow-overloaded-deref-mut.rs
Rollup merge of #87922 - Manishearth:c-enum-target-spec, r=nagisa,eddyb
[rust.git] / src / test / ui / span / borrowck-borrow-overloaded-deref-mut.rs
1 // Test how overloaded deref interacts with borrows when DerefMut
2 // is implemented.
3
4 use std::ops::{Deref, DerefMut};
5
6 struct Own<T> {
7     value: *mut T
8 }
9
10 impl<T> Deref for Own<T> {
11     type Target = T;
12
13     fn deref<'a>(&'a self) -> &'a T {
14         unsafe { &*self.value }
15     }
16 }
17
18 impl<T> DerefMut for Own<T> {
19     fn deref_mut<'a>(&'a mut self) -> &'a mut T {
20         unsafe { &mut *self.value }
21     }
22 }
23
24 fn deref_imm(x: Own<isize>) {
25     let __isize = &*x;
26 }
27
28 fn deref_mut1(x: Own<isize>) {
29     let __isize = &mut *x; //~ ERROR cannot borrow
30 }
31
32 fn deref_mut2(mut x: Own<isize>) {
33     let __isize = &mut *x;
34 }
35
36 fn deref_extend<'a>(x: &'a Own<isize>) -> &'a isize {
37     &**x
38 }
39
40 fn deref_extend_mut1<'a>(x: &'a Own<isize>) -> &'a mut isize {
41     &mut **x //~ ERROR cannot borrow
42 }
43
44 fn deref_extend_mut2<'a>(x: &'a mut Own<isize>) -> &'a mut isize {
45     &mut **x
46 }
47
48 fn assign1<'a>(x: Own<isize>) {
49     *x = 3; //~ ERROR cannot borrow
50 }
51
52 fn assign2<'a>(x: &'a Own<isize>) {
53     **x = 3; //~ ERROR cannot borrow
54 }
55
56 fn assign3<'a>(x: &'a mut Own<isize>) {
57     **x = 3;
58 }
59
60 pub fn main() {}