3 #![allow(unused_variables)]
4 // Test that we choose Deref or DerefMut appropriately based on mutability of ref bindings (#15609).
6 use std::ops::{Deref, DerefMut};
9 struct DerefMutOk<T>(T);
11 impl<T> Deref for DerefOk<T> {
13 fn deref(&self) -> &Self::Target {
18 impl<T> DerefMut for DerefOk<T> {
19 fn deref_mut(&mut self) -> &mut Self::Target {
24 impl<T> Deref for DerefMutOk<T> {
26 fn deref(&self) -> &Self::Target {
31 impl<T> DerefMut for DerefMutOk<T> {
32 fn deref_mut(&mut self) -> &mut Self::Target {
38 // Check that mutable ref binding in match picks DerefMut
39 let mut b = DerefMutOk(0);
44 // Check that mutable ref binding in let picks DerefMut
45 let mut y = DerefMutOk(1);
48 // Check that immutable ref binding in match picks Deref
49 let mut b = DerefOk(2);
54 // Check that immutable ref binding in let picks Deref
55 let mut y = DerefOk(3);
58 // Check that mixed mutable/immutable ref binding in match picks DerefMut
59 let mut b = DerefMutOk((0, 9));
61 (ref mut n, ref m) => (n, m),
64 let mut b = DerefMutOk((0, 9));
66 (ref n, ref mut m) => (n, m),
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;
73 let mut y = DerefMutOk((1, 8));
74 let (ref z, ref mut a) = *y;
76 // Check that multiple immutable ref bindings in match picks Deref
77 let mut b = DerefOk((2, 7));
79 (ref n, ref m) => (n, m),
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;
86 // Check that multiple mutable ref bindings in match picks DerefMut
87 let mut b = DerefMutOk((4, 5));
89 (ref mut n, ref mut m) => (n, m),
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;