Add some error message tests
This commit is contained in:
parent
beeb8e3af5
commit
e4e7e71e3d
6 changed files with 382 additions and 0 deletions
79
tests/ui/deref/pin-deref-const.rs
Normal file
79
tests/ui/deref/pin-deref-const.rs
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
// The purpose of this file is to track the error messages from Pin and DerefMut interacting.
|
||||
//
|
||||
// Identical to `pin-deref.rs` except for using unstable `const fn`.
|
||||
|
||||
//@ check-fail
|
||||
|
||||
#![feature(const_convert)]
|
||||
#![feature(const_trait_impl)]
|
||||
|
||||
use std::ops::DerefMut;
|
||||
use std::pin::Pin;
|
||||
|
||||
struct MyUnpinType {}
|
||||
|
||||
impl MyUnpinType {
|
||||
const fn at_self(&self) {}
|
||||
const fn at_mut_self(&mut self) {}
|
||||
}
|
||||
|
||||
struct MyPinType(core::marker::PhantomPinned);
|
||||
|
||||
impl MyPinType {
|
||||
const fn at_self(&self) {}
|
||||
const fn at_mut_self(&mut self) {}
|
||||
}
|
||||
|
||||
const fn call_mut_ref_unpin(mut r_unpin: Pin<&mut MyUnpinType>) {
|
||||
r_unpin.at_self();
|
||||
r_unpin.at_mut_self();
|
||||
}
|
||||
|
||||
const 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
|
||||
}
|
||||
|
||||
const 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
|
||||
}
|
||||
|
||||
const 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
|
||||
}
|
||||
|
||||
const fn coerce_unpin_rr<'a>(mut r_unpin: &'a mut Pin<&MyUnpinType>) -> &'a MyUnpinType {
|
||||
r_unpin
|
||||
}
|
||||
|
||||
const 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
|
||||
}
|
||||
|
||||
const fn coerce_unpin_mr<'a>(mut r_unpin: &'a mut Pin<&mut MyUnpinType>) -> &'a MyUnpinType {
|
||||
r_unpin
|
||||
}
|
||||
|
||||
const fn coerce_unpin_mm<'a>(mut r_unpin: &'a mut Pin<&mut MyUnpinType>) -> &'a mut MyUnpinType {
|
||||
r_unpin
|
||||
}
|
||||
|
||||
const fn coerce_pin_rr<'a>(mut r_pin: &'a mut Pin<&MyPinType>) -> &'a MyPinType {
|
||||
r_pin
|
||||
}
|
||||
|
||||
const 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
|
||||
}
|
||||
|
||||
const fn coerce_pin_mr<'a>(mut r_pin: &'a mut Pin<&mut MyPinType>) -> &'a MyPinType {
|
||||
r_pin
|
||||
}
|
||||
|
||||
const 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() {}
|
||||
51
tests/ui/deref/pin-deref-const.stderr
Normal file
51
tests/ui/deref/pin-deref-const.stderr
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
error[E0596]: cannot borrow data in dereference of `Pin<&MyUnpinType>` as mutable
|
||||
--> $DIR/pin-deref-const.rs:34:5
|
||||
|
|
||||
LL | r_unpin.at_mut_self();
|
||||
| ^^^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Pin<&MyUnpinType>`
|
||||
|
||||
error[E0596]: cannot borrow data in dereference of `Pin<&mut MyPinType>` as mutable
|
||||
--> $DIR/pin-deref-const.rs:39:5
|
||||
|
|
||||
LL | r_pin.at_mut_self();
|
||||
| ^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Pin<&mut MyPinType>`
|
||||
|
||||
error[E0596]: cannot borrow data in dereference of `Pin<&MyPinType>` as mutable
|
||||
--> $DIR/pin-deref-const.rs:44:5
|
||||
|
|
||||
LL | r_pin.at_mut_self();
|
||||
| ^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Pin<&MyPinType>`
|
||||
|
||||
error[E0596]: cannot borrow data in dereference of `Pin<&MyUnpinType>` as mutable
|
||||
--> $DIR/pin-deref-const.rs:52:5
|
||||
|
|
||||
LL | r_unpin
|
||||
| ^^^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Pin<&MyUnpinType>`
|
||||
|
||||
error[E0596]: cannot borrow data in dereference of `Pin<&MyPinType>` as mutable
|
||||
--> $DIR/pin-deref-const.rs:68:5
|
||||
|
|
||||
LL | r_pin
|
||||
| ^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Pin<&MyPinType>`
|
||||
|
||||
error[E0596]: cannot borrow data in dereference of `Pin<&mut MyPinType>` as mutable
|
||||
--> $DIR/pin-deref-const.rs:76:5
|
||||
|
|
||||
LL | r_pin
|
||||
| ^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Pin<&mut MyPinType>`
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0596`.
|
||||
76
tests/ui/deref/pin-deref.rs
Normal file
76
tests/ui/deref/pin-deref.rs
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
// 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() {}
|
||||
51
tests/ui/deref/pin-deref.stderr
Normal file
51
tests/ui/deref/pin-deref.stderr
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
error[E0596]: cannot borrow data in dereference of `Pin<&MyUnpinType>` as mutable
|
||||
--> $DIR/pin-deref.rs:31:5
|
||||
|
|
||||
LL | r_unpin.at_mut_self();
|
||||
| ^^^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Pin<&MyUnpinType>`
|
||||
|
||||
error[E0596]: cannot borrow data in dereference of `Pin<&mut MyPinType>` as mutable
|
||||
--> $DIR/pin-deref.rs:36:5
|
||||
|
|
||||
LL | r_pin.at_mut_self();
|
||||
| ^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Pin<&mut MyPinType>`
|
||||
|
||||
error[E0596]: cannot borrow data in dereference of `Pin<&MyPinType>` as mutable
|
||||
--> $DIR/pin-deref.rs:41:5
|
||||
|
|
||||
LL | r_pin.at_mut_self();
|
||||
| ^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Pin<&MyPinType>`
|
||||
|
||||
error[E0596]: cannot borrow data in dereference of `Pin<&MyUnpinType>` as mutable
|
||||
--> $DIR/pin-deref.rs:49:5
|
||||
|
|
||||
LL | r_unpin
|
||||
| ^^^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Pin<&MyUnpinType>`
|
||||
|
||||
error[E0596]: cannot borrow data in dereference of `Pin<&MyPinType>` as mutable
|
||||
--> $DIR/pin-deref.rs:65:5
|
||||
|
|
||||
LL | r_pin
|
||||
| ^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Pin<&MyPinType>`
|
||||
|
||||
error[E0596]: cannot borrow data in dereference of `Pin<&mut MyPinType>` as mutable
|
||||
--> $DIR/pin-deref.rs:73:5
|
||||
|
|
||||
LL | r_pin
|
||||
| ^^^^^ cannot borrow as mutable
|
||||
|
|
||||
= help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `Pin<&mut MyPinType>`
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0596`.
|
||||
40
tests/ui/deref/pin-impl-deref.rs
Normal file
40
tests/ui/deref/pin-impl-deref.rs
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
// The purpose of this file is to track the error messages from Pin and DerefMut interacting.
|
||||
|
||||
//@ 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 impl_deref_mut(_: impl DerefMut) {}
|
||||
fn unpin_impl_ref(r_unpin: Pin<&MyUnpinType>) {
|
||||
impl_deref_mut(r_unpin)
|
||||
//~^ ERROR: the trait bound `Pin<&MyUnpinType>: DerefMut` is not satisfied
|
||||
}
|
||||
fn unpin_impl_mut(r_unpin: Pin<&mut MyUnpinType>) {
|
||||
impl_deref_mut(r_unpin)
|
||||
}
|
||||
fn pin_impl_ref(r_pin: Pin<&MyPinType>) {
|
||||
impl_deref_mut(r_pin)
|
||||
//~^ ERROR: `PhantomPinned` cannot be unpinned
|
||||
//~| ERROR: the trait bound `Pin<&MyPinType>: DerefMut` is not satisfied
|
||||
}
|
||||
fn pin_impl_mut(r_pin: Pin<&mut MyPinType>) {
|
||||
impl_deref_mut(r_pin)
|
||||
//~^ ERROR: `PhantomPinned` cannot be unpinned
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
85
tests/ui/deref/pin-impl-deref.stderr
Normal file
85
tests/ui/deref/pin-impl-deref.stderr
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
error[E0277]: the trait bound `Pin<&MyUnpinType>: DerefMut` is not satisfied
|
||||
--> $DIR/pin-impl-deref.rs:24:20
|
||||
|
|
||||
LL | impl_deref_mut(r_unpin)
|
||||
| -------------- ^^^^^^^ the trait `DerefMut` is not implemented for `Pin<&MyUnpinType>`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: required for `Pin<&MyUnpinType>` to implement `DerefMut`
|
||||
note: required by a bound in `impl_deref_mut`
|
||||
--> $DIR/pin-impl-deref.rs:22:27
|
||||
|
|
||||
LL | fn impl_deref_mut(_: impl DerefMut) {}
|
||||
| ^^^^^^^^ required by this bound in `impl_deref_mut`
|
||||
help: consider mutably borrowing here
|
||||
|
|
||||
LL | impl_deref_mut(&mut r_unpin)
|
||||
| ++++
|
||||
|
||||
error[E0277]: the trait bound `Pin<&MyPinType>: DerefMut` is not satisfied
|
||||
--> $DIR/pin-impl-deref.rs:31:20
|
||||
|
|
||||
LL | impl_deref_mut(r_pin)
|
||||
| -------------- ^^^^^ the trait `DerefMut` is not implemented for `Pin<&MyPinType>`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: required for `Pin<&MyPinType>` to implement `DerefMut`
|
||||
note: required by a bound in `impl_deref_mut`
|
||||
--> $DIR/pin-impl-deref.rs:22:27
|
||||
|
|
||||
LL | fn impl_deref_mut(_: impl DerefMut) {}
|
||||
| ^^^^^^^^ required by this bound in `impl_deref_mut`
|
||||
help: consider mutably borrowing here
|
||||
|
|
||||
LL | impl_deref_mut(&mut r_pin)
|
||||
| ++++
|
||||
|
||||
error[E0277]: `PhantomPinned` cannot be unpinned
|
||||
--> $DIR/pin-impl-deref.rs:31:20
|
||||
|
|
||||
LL | impl_deref_mut(r_pin)
|
||||
| -------------- ^^^^^ within `MyPinType`, the trait `Unpin` is not implemented for `PhantomPinned`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: consider using the `pin!` macro
|
||||
consider using `Box::pin` if you need to access the pinned value outside of the current scope
|
||||
note: required because it appears within the type `MyPinType`
|
||||
--> $DIR/pin-impl-deref.rs:15:8
|
||||
|
|
||||
LL | struct MyPinType(core::marker::PhantomPinned);
|
||||
| ^^^^^^^^^
|
||||
= note: required for `Pin<&MyPinType>` to implement `DerefMut`
|
||||
note: required by a bound in `impl_deref_mut`
|
||||
--> $DIR/pin-impl-deref.rs:22:27
|
||||
|
|
||||
LL | fn impl_deref_mut(_: impl DerefMut) {}
|
||||
| ^^^^^^^^ required by this bound in `impl_deref_mut`
|
||||
|
||||
error[E0277]: `PhantomPinned` cannot be unpinned
|
||||
--> $DIR/pin-impl-deref.rs:36:20
|
||||
|
|
||||
LL | impl_deref_mut(r_pin)
|
||||
| -------------- ^^^^^ within `MyPinType`, the trait `Unpin` is not implemented for `PhantomPinned`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: consider using the `pin!` macro
|
||||
consider using `Box::pin` if you need to access the pinned value outside of the current scope
|
||||
note: required because it appears within the type `MyPinType`
|
||||
--> $DIR/pin-impl-deref.rs:15:8
|
||||
|
|
||||
LL | struct MyPinType(core::marker::PhantomPinned);
|
||||
| ^^^^^^^^^
|
||||
= note: required for `Pin<&mut MyPinType>` to implement `DerefMut`
|
||||
note: required by a bound in `impl_deref_mut`
|
||||
--> $DIR/pin-impl-deref.rs:22:27
|
||||
|
|
||||
LL | fn impl_deref_mut(_: impl DerefMut) {}
|
||||
| ^^^^^^^^ required by this bound in `impl_deref_mut`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue