Add test for dynamic dispatch + Pin::new soundness
This commit is contained in:
parent
6be7b0c7d2
commit
b3a78c1d09
19
tests/ui/coercion/pin-dyn-dispatch-sound.rs
Normal file
19
tests/ui/coercion/pin-dyn-dispatch-sound.rs
Normal file
@ -0,0 +1,19 @@
|
||||
use std::marker::PhantomPinned;
|
||||
use std::pin::Pin;
|
||||
|
||||
trait MyUnpinTrait {
|
||||
fn into_pinned_type(self: Pin<&mut Self>) -> Pin<&mut PhantomPinned>;
|
||||
}
|
||||
impl MyUnpinTrait for PhantomPinned {
|
||||
fn into_pinned_type(self: Pin<&mut Self>) -> Pin<&mut PhantomPinned> {
|
||||
self
|
||||
}
|
||||
}
|
||||
impl Unpin for dyn MyUnpinTrait {} //~ ERROR E0321
|
||||
|
||||
// It would be unsound for this function to compile.
|
||||
fn pin_it(not_yet_pinned: &mut PhantomPinned) -> Pin<&mut PhantomPinned> {
|
||||
Pin::new(not_yet_pinned as &mut dyn MyUnpinTrait).into_pinned_type()
|
||||
}
|
||||
|
||||
fn main() {}
|
9
tests/ui/coercion/pin-dyn-dispatch-sound.stderr
Normal file
9
tests/ui/coercion/pin-dyn-dispatch-sound.stderr
Normal file
@ -0,0 +1,9 @@
|
||||
error[E0321]: cross-crate traits with a default impl, like `Unpin`, can only be implemented for a struct/enum type, not `(dyn MyUnpinTrait + 'static)`
|
||||
--> $DIR/pin-dyn-dispatch-sound.rs:12:1
|
||||
|
|
||||
LL | impl Unpin for dyn MyUnpinTrait {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't implement cross-crate trait with a default impl for non-struct/enum type
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0321`.
|
Loading…
Reference in New Issue
Block a user