about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2023-12-29 21:40:23 +0100
committerGitHub <noreply@github.com>2023-12-29 21:40:23 +0100
commit7c5c948f2ebc9601cd9d64ecbeaef2094bc998cd (patch)
tree7136d1a7ac2ecd86564dcc9b7940295a75a17b71
parentc8d42740c5ea34ec33993837849b32933ab02854 (diff)
parent21e8710ed33ed7e77b9a0c0cc30acae6713c5173 (diff)
downloadrust-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.rs55
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);
+    }
+}