]> git.lizzy.rs Git - rust.git/blob - src/test/ui/overloaded/overloaded_deref_with_ref_pattern.rs
Auto merge of #106025 - matthiaskrgr:rollup-vz5rqah, r=matthiaskrgr
[rust.git] / src / test / ui / overloaded / overloaded_deref_with_ref_pattern.rs
1 // run-pass
2 #![allow(unused_mut)]
3 #![allow(unused_variables)]
4 // Test that we choose Deref or DerefMut appropriately based on mutability of ref bindings (#15609).
5
6 use std::ops::{Deref, DerefMut};
7
8 struct DerefOk<T>(T);
9 struct DerefMutOk<T>(T);
10
11 impl<T> Deref for DerefOk<T> {
12     type Target = T;
13     fn deref(&self) -> &Self::Target {
14         &self.0
15     }
16 }
17
18 impl<T> DerefMut for DerefOk<T> {
19     fn deref_mut(&mut self) -> &mut Self::Target {
20         panic!()
21     }
22 }
23
24 impl<T> Deref for DerefMutOk<T> {
25     type Target = T;
26     fn deref(&self) -> &Self::Target {
27         panic!()
28     }
29 }
30
31 impl<T> DerefMut for DerefMutOk<T> {
32     fn deref_mut(&mut self) -> &mut Self::Target {
33         &mut self.0
34     }
35 }
36
37 fn main() {
38     // Check that mutable ref binding in match picks DerefMut
39     let mut b = DerefMutOk(0);
40     match *b {
41         ref mut n => n,
42     };
43
44     // Check that mutable ref binding in let picks DerefMut
45     let mut y = DerefMutOk(1);
46     let ref mut z = *y;
47
48     // Check that immutable ref binding in match picks Deref
49     let mut b = DerefOk(2);
50     match *b {
51         ref n => n,
52     };
53
54     // Check that immutable ref binding in let picks Deref
55     let mut y = DerefOk(3);
56     let ref z = *y;
57
58     // Check that mixed mutable/immutable ref binding in match picks DerefMut
59     let mut b = DerefMutOk((0, 9));
60     match *b {
61         (ref mut n, ref m) => (n, m),
62     };
63
64     let mut b = DerefMutOk((0, 9));
65     match *b {
66         (ref n, ref mut m) => (n, m),
67     };
68
69     // Check that mixed mutable/immutable ref binding in let picks DerefMut
70     let mut y = DerefMutOk((1, 8));
71     let (ref mut z, ref a) = *y;
72
73     let mut y = DerefMutOk((1, 8));
74     let (ref z, ref mut a) = *y;
75
76     // Check that multiple immutable ref bindings in match picks Deref
77     let mut b = DerefOk((2, 7));
78     match *b {
79         (ref n, ref m) => (n, m),
80     };
81
82     // Check that multiple immutable ref bindings in let picks Deref
83     let mut y = DerefOk((3, 6));
84     let (ref z, ref a) = *y;
85
86     // Check that multiple mutable ref bindings in match picks DerefMut
87     let mut b = DerefMutOk((4, 5));
88     match *b {
89         (ref mut n, ref mut m) => (n, m),
90     };
91
92     // Check that multiple mutable ref bindings in let picks DerefMut
93     let mut y = DerefMutOk((5, 4));
94     let (ref mut z, ref mut a) = *y;
95 }