]> git.lizzy.rs Git - rust.git/blob - src/test/ui/issues/issue-22992.rs
Rollup merge of #91518 - luojia65:rustdoc-riscv-arch, r=GuillaumeGomez
[rust.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 }