diff options
| author | Michael Goulet <michael@errs.io> | 2022-11-19 03:06:21 +0000 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-11-24 01:10:25 +0000 |
| commit | 8f79fc24e36e1a7540a0af6d44a27d11366fe294 (patch) | |
| tree | 18a3f7b7acab5457ca559bd8ffe278cd9e80856b /src | |
| parent | c620a972f3bae8171e17eb8a243b419caadd9ab7 (diff) | |
| download | rust-8f79fc24e36e1a7540a0af6d44a27d11366fe294.tar.gz rust-8f79fc24e36e1a7540a0af6d44a27d11366fe294.zip | |
Properly handle `Pin<&mut dyn* Trait>` receiver in codegen
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/ui/dyn-star/dispatch-on-pin-mut.rs | 51 | ||||
| -rw-r--r-- | src/test/ui/dyn-star/dispatch-on-pin-mut.stderr | 11 |
2 files changed, 62 insertions, 0 deletions
diff --git a/src/test/ui/dyn-star/dispatch-on-pin-mut.rs b/src/test/ui/dyn-star/dispatch-on-pin-mut.rs new file mode 100644 index 00000000000..8eedff87d0d --- /dev/null +++ b/src/test/ui/dyn-star/dispatch-on-pin-mut.rs @@ -0,0 +1,51 @@ +// build-pass +// edition:2021 + +#![feature(dyn_star)] +//~^ WARN the feature `dyn_star` is incomplete and may not be safe to use and/or cause compiler crashes + +use std::future::Future; + +async fn foo(f: dyn* Future<Output = i32>) { + println!("value: {}", f.await); +} + +async fn async_main() { + foo(Box::pin(async { 1 })).await +} + +// ------------------------------------------------------------------------- // +// Implementation Details Below... + +use std::pin::Pin; +use std::task::*; + +pub fn noop_waker() -> Waker { + let raw = RawWaker::new(std::ptr::null(), &NOOP_WAKER_VTABLE); + + // SAFETY: the contracts for RawWaker and RawWakerVTable are upheld + unsafe { Waker::from_raw(raw) } +} + +const NOOP_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(noop_clone, noop, noop, noop); + +unsafe fn noop_clone(_p: *const ()) -> RawWaker { + RawWaker::new(std::ptr::null(), &NOOP_WAKER_VTABLE) +} + +unsafe fn noop(_p: *const ()) {} + +fn main() { + let mut fut = async_main(); + + // Poll loop, just to test the future... + let waker = noop_waker(); + let ctx = &mut Context::from_waker(&waker); + + loop { + match unsafe { Pin::new_unchecked(&mut fut).poll(ctx) } { + Poll::Pending => {} + Poll::Ready(()) => break, + } + } +} diff --git a/src/test/ui/dyn-star/dispatch-on-pin-mut.stderr b/src/test/ui/dyn-star/dispatch-on-pin-mut.stderr new file mode 100644 index 00000000000..a73e3400922 --- /dev/null +++ b/src/test/ui/dyn-star/dispatch-on-pin-mut.stderr @@ -0,0 +1,11 @@ +warning: the feature `dyn_star` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/dispatch-on-pin-mut.rs:4:12 + | +LL | #![feature(dyn_star)] + | ^^^^^^^^ + | + = note: see issue #91611 <https://github.com/rust-lang/rust/issues/91611> for more information + = note: `#[warn(incomplete_features)]` on by default + +warning: 1 warning emitted + |
