Skip to content

Commit

Permalink
More tests
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Jun 27, 2023
1 parent 75a8f68 commit bfc6ca8
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 0 deletions.
64 changes: 64 additions & 0 deletions tests/ui/async-await/in-trait/normalize-opaque-with-bound-vars.rs
Original file line number Diff line number Diff line change
@@ -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;
};
}
27 changes: 27 additions & 0 deletions tests/ui/impl-trait/normalize-opaque-with-bound-vars.rs
Original file line number Diff line number Diff line change
@@ -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();
}

0 comments on commit bfc6ca8

Please sign in to comment.