blob: dab589b465181f0cffc764d7815023abe37c323c [file] [log] [blame]
#![feature(dyn_star)]
#![allow(incomplete_features)]
#![feature(custom_inner_attributes)]
#![feature(noop_waker)]
// rustfmt destroys `dyn* Trait` syntax
#![rustfmt::skip]
use std::fmt::{Debug, Display};
fn main() {
make_dyn_star();
method();
box_();
dispatch_on_pin_mut();
dyn_star_to_dyn();
dyn_to_dyn_star();
}
fn dyn_star_to_dyn() {
let x: dyn* Debug = &42;
let x = Box::new(x) as Box<dyn Debug>;
assert_eq!("42", format!("{x:?}"));
}
fn dyn_to_dyn_star() {
let x: Box<dyn Debug> = Box::new(42);
let x = &x as dyn* Debug;
assert_eq!("42", format!("{x:?}"));
}
fn make_dyn_star() {
fn make_dyn_star_coercion(i: usize) {
let _dyn_i: dyn* Debug = i;
}
fn make_dyn_star_explicit(i: usize) {
let _dyn_i: dyn* Debug = i as dyn* Debug;
}
make_dyn_star_coercion(42);
make_dyn_star_explicit(42);
}
fn method() {
trait Foo {
fn get(&self) -> usize;
}
impl Foo for usize {
fn get(&self) -> usize {
*self
}
}
fn invoke_dyn_star(i: dyn* Foo) -> usize {
i.get()
}
fn make_and_invoke_dyn_star(i: usize) -> usize {
let dyn_i: dyn* Foo = i;
invoke_dyn_star(dyn_i)
}
assert_eq!(make_and_invoke_dyn_star(42), 42);
}
fn box_() {
fn make_dyn_star() -> dyn* Display {
Box::new(42) as dyn* Display
}
let x = make_dyn_star();
assert_eq!(format!("{x}"), "42");
}
fn dispatch_on_pin_mut() {
use std::future::Future;
async fn foo(f: dyn* Future<Output = i32>) {
println!("dispatch_on_pin_mut: value: {}", f.await);
}
async fn async_main() {
foo(Box::pin(async { 1 })).await
}
// ------------------------------------------------------------------------- //
// Implementation Details Below...
use std::pin::Pin;
use std::task::*;
let mut fut = async_main();
// Poll loop, just to test the future...
let ctx = &mut Context::from_waker(Waker::noop());
loop {
match unsafe { Pin::new_unchecked(&mut fut).poll(ctx) } {
Poll::Pending => {}
Poll::Ready(()) => break,
}
}
}