diff options
| author | Alice Ryhl <aliceryhl@google.com> | 2024-05-13 13:34:33 +0200 |
|---|---|---|
| committer | Alice Ryhl <aliceryhl@google.com> | 2024-05-13 14:25:03 +0200 |
| commit | b3a78c1d094eb978ec876643c3c4d0e5349b1073 (patch) | |
| tree | 696a0c3c71127b62c28d30b8bedf7d9f20fce045 | |
| parent | 6be7b0c7d2b085474f9f2f9323c2266f4df105d8 (diff) | |
Add test for dynamic dispatch + Pin::new soundness
| -rw-r--r-- | tests/ui/coercion/pin-dyn-dispatch-sound.rs | 19 | ||||
| -rw-r--r-- | tests/ui/coercion/pin-dyn-dispatch-sound.stderr | 9 |
2 files changed, 28 insertions, 0 deletions
diff --git a/tests/ui/coercion/pin-dyn-dispatch-sound.rs b/tests/ui/coercion/pin-dyn-dispatch-sound.rs new file mode 100644 index 00000000000..b9d43ebac8b --- /dev/null +++ b/tests/ui/coercion/pin-dyn-dispatch-sound.rs @@ -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() {} diff --git a/tests/ui/coercion/pin-dyn-dispatch-sound.stderr b/tests/ui/coercion/pin-dyn-dispatch-sound.stderr new file mode 100644 index 00000000000..45860bfcfc7 --- /dev/null +++ b/tests/ui/coercion/pin-dyn-dispatch-sound.stderr @@ -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`. |
