Skip to content

Commit

Permalink
Add test for dynamic dispatch + Pin::new soundness
Browse files Browse the repository at this point in the history
  • Loading branch information
Darksonn committed May 13, 2024
1 parent 6be7b0c commit b3a78c1
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
19 changes: 19 additions & 0 deletions tests/ui/coercion/pin-dyn-dispatch-sound.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 9 additions & 0 deletions tests/ui/coercion/pin-dyn-dispatch-sound.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit b3a78c1

Please sign in to comment.