rust/tests/ui/deref/pin-deref.rs
2025-09-08 11:37:57 +00:00

77 lines
2.1 KiB
Rust

// The purpose of this file is to track the error messages from Pin and DerefMut interacting.
//
// Identical to `pin-deref-const.rs` except for being stable and not using `const fn`.
//@ check-fail
use std::ops::DerefMut;
use std::pin::Pin;
struct MyUnpinType {}
impl MyUnpinType {
fn at_self(&self) {}
fn at_mut_self(&mut self) {}
}
struct MyPinType(core::marker::PhantomPinned);
impl MyPinType {
fn at_self(&self) {}
fn at_mut_self(&mut self) {}
}
fn call_mut_ref_unpin(mut r_unpin: Pin<&mut MyUnpinType>) {
r_unpin.at_self();
r_unpin.at_mut_self();
}
fn call_ref_unpin(mut r_unpin: Pin<&MyUnpinType>) {
r_unpin.at_self();
r_unpin.at_mut_self(); //~ ERROR: cannot borrow data in dereference of `Pin<&MyUnpinType>` as mutable
}
fn call_mut_ref_pin(mut r_pin: Pin<&mut MyPinType>) {
r_pin.at_self();
r_pin.at_mut_self(); //~ ERROR: cannot borrow data in dereference of `Pin<&mut MyPinType>` as mutable
}
fn call_ref_pin(mut r_pin: Pin<&MyPinType>) {
r_pin.at_self();
r_pin.at_mut_self(); //~ ERROR: cannot borrow data in dereference of `Pin<&MyPinType>` as mutable
}
fn coerce_unpin_rr<'a>(mut r_unpin: &'a mut Pin<&MyUnpinType>) -> &'a MyUnpinType {
r_unpin
}
fn coerce_unpin_rm<'a>(mut r_unpin: &'a mut Pin<&MyUnpinType>) -> &'a mut MyUnpinType {
r_unpin //~ ERROR: cannot borrow data in dereference of `Pin<&MyUnpinType>` as mutable
}
fn coerce_unpin_mr<'a>(mut r_unpin: &'a mut Pin<&mut MyUnpinType>) -> &'a MyUnpinType {
r_unpin
}
fn coerce_unpin_mm<'a>(mut r_unpin: &'a mut Pin<&mut MyUnpinType>) -> &'a mut MyUnpinType {
r_unpin
}
fn coerce_pin_rr<'a>(mut r_pin: &'a mut Pin<&MyPinType>) -> &'a MyPinType {
r_pin
}
fn coerce_pin_rm<'a>(mut r_pin: &'a mut Pin<&MyPinType>) -> &'a mut MyPinType {
r_pin //~ ERROR: cannot borrow data in dereference of `Pin<&MyPinType>` as mutable
}
fn coerce_pin_mr<'a>(mut r_pin: &'a mut Pin<&mut MyPinType>) -> &'a MyPinType {
r_pin
}
fn coerce_pin_mm<'a>(mut r_pin: &'a mut Pin<&mut MyPinType>) -> &'a mut MyPinType {
r_pin //~ ERROR: cannot borrow data in dereference of `Pin<&mut MyPinType>` as mutable
}
fn main() {}