// check-pass #![allow(unused_variables)] fn ref_() { let bytes: Vec = 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 = 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(); }