More tests

This commit is contained in:
Michael Goulet 2023-06-23 22:00:55 +00:00
parent 75a8f68183
commit bfc6ca8207
2 changed files with 91 additions and 0 deletions

View file

@ -0,0 +1,64 @@
// build-pass
// edition:2021
// compile-flags: -Cdebuginfo=2
// We were not normalizing opaques with escaping bound vars during codegen,
// leading to later errors during debuginfo computation.
#![feature(async_fn_in_trait)]
#[derive(Clone, Copy)]
pub struct SharedState {}
pub trait State {
async fn execute(self, shared_state: &SharedState);
}
pub trait StateComposer {
fn and_then<T, F>(self, map_fn: F) -> AndThen<Self, F>
where
Self: State + Sized,
T: State,
F: FnOnce() -> T,
{
AndThen { previous: self, map_fn }
}
}
impl<T> StateComposer for T where T: State {}
pub struct AndThen<T, F> {
previous: T,
map_fn: F,
}
impl<T, U, F> State for AndThen<T, F>
where
T: State,
U: State,
F: FnOnce() -> U,
{
async fn execute(self, shared_state: &SharedState)
where
Self: Sized,
{
self.previous.execute(shared_state).await;
(self.map_fn)().execute(shared_state).await
}
}
pub struct SomeState {}
impl State for SomeState {
async fn execute(self, shared_state: &SharedState) {}
}
pub fn main() {
let shared_state = SharedState {};
async {
SomeState {}
.and_then(|| SomeState {})
.and_then(|| SomeState {})
.execute(&shared_state)
.await;
};
}

View file

@ -0,0 +1,27 @@
// build-pass
// edition:2021
// compile-flags: -Cdebuginfo=2
// We were not normalizing opaques with escaping bound vars during codegen,
// leading to later linker errors because of differences in mangled symbol name.
fn func<T>() -> impl Sized {}
trait Trait<'a> {
type Assoc;
fn call() {
let _ = async {
let _value = func::<Self::Assoc>();
std::future::ready(()).await
};
}
}
impl Trait<'static> for () {
type Assoc = ();
}
fn main() {
<()>::call();
}