diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-12-29 21:40:23 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-29 21:40:23 +0100 |
| commit | 7c5c948f2ebc9601cd9d64ecbeaef2094bc998cd (patch) | |
| tree | 7136d1a7ac2ecd86564dcc9b7940295a75a17b71 | |
| parent | c8d42740c5ea34ec33993837849b32933ab02854 (diff) | |
| parent | 21e8710ed33ed7e77b9a0c0cc30acae6713c5173 (diff) | |
| download | rust-7c5c948f2ebc9601cd9d64ecbeaef2094bc998cd.tar.gz rust-7c5c948f2ebc9601cd9d64ecbeaef2094bc998cd.zip | |
Rollup merge of #119406 - lqd:issue-114325, r=compiler-errors
Add non-regression test for ATPIT ICE #114325 ATPIT issue #114325 had been unknowingly fixed by https://github.com/rust-lang/rust/pull/107421, so this PR adds its [MCVE](https://github.com/rust-lang/rust/issues/114325#issuecomment-1721561552) as a non-regression test. Closes #114325.
| -rw-r--r-- | tests/ui/impl-trait/associated-impl-trait-type-issue-114325.rs | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/tests/ui/impl-trait/associated-impl-trait-type-issue-114325.rs b/tests/ui/impl-trait/associated-impl-trait-type-issue-114325.rs new file mode 100644 index 00000000000..8173f8df11b --- /dev/null +++ b/tests/ui/impl-trait/associated-impl-trait-type-issue-114325.rs @@ -0,0 +1,55 @@ +// This is a non-regression test for issue #114325: an "unexpected unsized tail" ICE happened during +// codegen, and was fixed by MIR drop tracking #107421. + +// edition: 2021 +// build-pass: ICEd during codegen. + +#![feature(impl_trait_in_assoc_type)] + +use std::future::Future; + +fn main() { + RuntimeRef::spawn_local(actor_fn(http_actor)); +} + +async fn http_actor() { + async fn respond(body: impl Body) { + body.write_message().await; + } + + respond(&()).await; +} + +trait Body { + type WriteFuture: Future; + + fn write_message(self) -> Self::WriteFuture; +} + +impl Body for &'static () { + type WriteFuture = impl Future<Output = ()>; + + fn write_message(self) -> Self::WriteFuture { + async {} + } +} + +trait NewActor { + type RuntimeAccess; +} + +fn actor_fn<T, A>(_d: T) -> (T, A) { + loop {} +} + +impl<F: FnMut() -> A, A> NewActor for (F, A) { + type RuntimeAccess = RuntimeRef; +} +struct RuntimeRef(Vec<()>); + +impl RuntimeRef { + fn spawn_local<NA: NewActor<RuntimeAccess = RuntimeRef>>(_f: NA) { + struct ActorFuture<NA: NewActor>(NA::RuntimeAccess); + (ActorFuture::<NA>(RuntimeRef(vec![])), _f); + } +} |
