72 lines
2.0 KiB
Rust
72 lines
2.0 KiB
Rust
//@ 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();
|
|
}
|