| //@ check-pass |
| |
| |
| #![allow(unused_variables)] |
| |
| fn ref_() { |
| let bytes: Vec<u8> = b"Hello"[..].to_vec(); |
| let some = Some(bytes); |
| |
| let Some(ref a) = Some(()) else { return }; |
| |
| // | ref | type annotation | & | |
| // | --- | --------------- | - | |
| // | x | x | | error |
| // | x | x | x | error |
| // | | x | | error |
| // | | x | x | error |
| // | x | | | |
| let Some(ref a) = some else { return }; // OK |
| let b: &[u8] = a; |
| |
| // | x | | x | |
| let Some(ref a) = &some else { return }; // OK |
| let b: &[u8] = a; |
| |
| |
| // | | | x | |
| let Some(a) = &some else { return }; // OK |
| let b: &[u8] = a; |
| |
| let Some(a): Option<&[u8]> = some.as_deref() else { return }; // OK |
| let b: &[u8] = a; |
| let Some(ref a): Option<&[u8]> = some.as_deref() else { return }; // OK |
| let b: &[u8] = a; |
| } |
| |
| fn ref_mut() { |
| // This `ref mut` case had an ICE, see issue #89960 |
| let Some(ref mut a) = Some(()) else { return }; |
| |
| let bytes: Vec<u8> = b"Hello"[..].to_vec(); |
| let mut some = Some(bytes); |
| |
| // | ref mut | type annotation | &mut | |
| // | ------- | --------------- | ---- | |
| // | x | x | | error |
| // | x | x | x | error |
| // | | x | | error |
| // | | x | x | error |
| // | x | | | |
| let Some(ref mut a) = some else { return }; // OK |
| let b: &mut [u8] = a; |
| |
| // | x | | x | |
| let Some(ref mut a) = &mut some else { return }; // OK |
| let b: &mut [u8] = a; |
| |
| // | | | x | |
| let Some(a) = &mut some else { return }; // OK |
| let b: &mut [u8] = a; |
| |
| let Some(a): Option<&mut [u8]> = some.as_deref_mut() else { return }; // OK |
| let b: &mut [u8] = a; |
| let Some(ref mut a): Option<&mut [u8]> = some.as_deref_mut() else { return }; // OK |
| let b: &mut [u8] = a; |
| } |
| |
| fn main() { |
| ref_(); |
| ref_mut(); |
| } |