]> git.proxmox.com Git - rustc.git/blob - src/test/ui/issues/issue-22992.rs
New upstream version 1.55.0+dfsg1
[rustc.git] / src / test / ui / issues / issue-22992.rs
1 // run-pass
2
3 struct X { val: i32 }
4 impl std::ops::Deref for X {
5 type Target = i32;
6 fn deref(&self) -> &i32 { &self.val }
7 }
8
9
10 trait M { fn m(self); }
11 impl M for i32 { fn m(self) { println!("i32::m()"); } }
12 impl M for X { fn m(self) { println!("X::m()"); } }
13 impl<'a> M for &'a X { fn m(self) { println!("&X::m()"); } }
14 impl<'a, 'b> M for &'a &'b X { fn m(self) { println!("&&X::m()"); } }
15 impl<'a, 'b, 'c> M for &'a &'b &'c X { fn m(self) { println!("&&&X::m()"); } }
16
17 trait RefM { fn refm(&self); }
18 impl RefM for i32 { fn refm(&self) { println!("i32::refm()"); } }
19 impl RefM for X { fn refm(&self) { println!("X::refm()"); } }
20 impl<'a> RefM for &'a X { fn refm(&self) { println!("&X::refm()"); } }
21 impl<'a, 'b> RefM for &'a &'b X { fn refm(&self) { println!("&&X::refm()"); } }
22 impl<'a, 'b, 'c> RefM for &'a &'b &'c X { fn refm(&self) { println!("&&&X::refm()"); } }
23
24 struct Y { val: i32 }
25 impl std::ops::Deref for Y {
26 type Target = i32;
27 fn deref(&self) -> &i32 { &self.val }
28 }
29
30 struct Z { val: Y }
31 impl std::ops::Deref for Z {
32 type Target = Y;
33 fn deref(&self) -> &Y { &self.val }
34 }
35
36 struct A;
37 impl std::marker::Copy for A {}
38 impl Clone for A { fn clone(&self) -> Self { *self } }
39 impl M for A { fn m(self) { println!("A::m()"); } }
40 impl<'a, 'b, 'c> M for &'a &'b &'c A { fn m(self) { println!("&&&A::m()"); } }
41 impl RefM for A { fn refm(&self) { println!("A::refm()"); } }
42 impl<'a, 'b, 'c> RefM for &'a &'b &'c A { fn refm(&self) { println!("&&&A::refm()"); } }
43
44 fn main() {
45 // I'll use @ to denote left side of the dot operator
46 (*X{val:42}).m(); // i32::refm() , self == @
47 X{val:42}.m(); // X::m() , self == @
48 (&X{val:42}).m(); // &X::m() , self == @
49 (&&X{val:42}).m(); // &&X::m() , self == @
50 (&&&X{val:42}).m(); // &&&X:m() , self == @
51 (&&&&X{val:42}).m(); // &&&X::m() , self == *@
52 (&&&&&X{val:42}).m(); // &&&X::m() , self == **@
53
54 (*X{val:42}).refm(); // i32::refm() , self == @
55 X{val:42}.refm(); // X::refm() , self == @
56 (&X{val:42}).refm(); // X::refm() , self == *@
57 (&&X{val:42}).refm(); // &X::refm() , self == *@
58 (&&&X{val:42}).refm(); // &&X::refm() , self == *@
59 (&&&&X{val:42}).refm(); // &&&X::refm(), self == *@
60 (&&&&&X{val:42}).refm(); // &&&X::refm(), self == **@
61
62 Y{val:42}.refm(); // i32::refm() , self == *@
63 Z{val:Y{val:42}}.refm(); // i32::refm() , self == **@
64
65 A.m(); // A::m() , self == @
66 // without the Copy trait, (&A).m() would be a compilation error:
67 // cannot move out of borrowed content
68 (&A).m(); // A::m() , self == *@
69 (&&A).m(); // &&&A::m() , self == &@
70 (&&&A).m(); // &&&A::m() , self == @
71 A.refm(); // A::refm() , self == @
72 (&A).refm(); // A::refm() , self == *@
73 (&&A).refm(); // A::refm() , self == **@
74 (&&&A).refm(); // &&&A::refm(), self == @
75 }