Change:
<!-- Thank you for finding an Internal Compiler Error! If possible, try to provide a minimal verifiable example. You can read "Rust Bug Minimization Patterns" for how to create smaller examples. --Hello, I was trying differents things with Future and callbacks - to be more precise, I am trying to store an asynchronous callback inside an asynchronous struct. In my attempts, I found an unexpected compiler crash - I have taken the care to create a minimal reproducible example, which you can see, and test for yourself - note that the crash occurs both on the latest "stable" and "nightly" versions: <!-- If you're using the stable version of the compiler, you should also check if the bug also exists in the beta or nightly versions. --: <!-- Include a backtrace in the code block by setting in your environment. E.g. . --<details<summary<strongBacktrace</strong</summary<p</p</details<!-- If you're using the stable version of the compiler, you should also check if the bug also exists in the beta or nightly versions. --: <details<summary<strongBacktrace</strong</summary<p</p</details<!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --<!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOTEND --
Just to add this also ICEs on current latest beta version: 1.62.0-beta.7 (2022-06-26 )
And to further add, it does not ICE on stable. label: +regression-from-stable-to-beta
Apologies, as mentioned in the OP it does ICE on stable too (but, at least on the Playground, only when running not just building; same as for other channels). label: -I-prioritize -regression-from-stable-to-beta
This no longer ICEs
claim For the test

Discussion:
<ins> // edition: 2021 use std::{ future::Future, pin::Pin, task::{Context, Poll, Waker}, }; pub struct StructAsync<F: Fn() -> Pin<Box<dyn Future<Output = ()>>>> { pub callback: F, } impl<F> Future for StructAsync<F> where F: Fn() -> Pin<Box<dyn Future<Output = ()>>>, { type Output = (); fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> { Poll::Pending } } async fn callback() {} struct Runtime; fn waker() -> &'static Waker { todo!() } impl Runtime { #[track_caller] pub fn block_on<F: Future>(&self, mut future: F) -> F::Output { loop { unsafe { Pin::new_unchecked(&mut future).poll(&mut Context::from_waker(waker())); } } } } fn main() { Runtime.block_on(async { StructAsync { callback }.await; //~^ ERROR expected `fn() -> impl Future<Output = ()> {callback}` to be a fn item that returns `Pin<Box<(dyn Future<Output = ()> + 'static)>>`, but it returns `impl Future<Output = ()>` //~| ERROR expected `fn() -> impl Future<Output = ()> {callback}` to be a fn item that returns `Pin<Box<(dyn Future<Output = ()> + 'static)>>`, but it returns `impl Future<Output = ()>` //~| ERROR expected `fn() -> impl Future<Output = ()> {callback}` to be a fn item that returns `Pin<Box<(dyn Future<Output = ()> + 'static)>>`, but it returns `impl Future<Output = ()>` }); } </ins>

<ins> error[E0271]: expected `fn() -> impl Future<Output = ()> {callback}` to be a fn item that returns `Pin<Box<(dyn Future<Output = ()> + 'static)>>`, but it returns `impl Future<Output = ()>` --> $DIR/issue-98634.rs:45:23 | LL |         StructAsync { callback }.await; |                       ^^^^^^^^ expected struct `Pin`, found opaque type | note: while checking the return type of the `async fn` --> $DIR/issue-98634.rs:24:21 | LL | async fn callback() {} |                     ^ checked the `Output` of this `async fn`, found opaque type = note:   expected struct `Pin<Box<(dyn Future<Output = ()> + 'static)>>` found opaque type `impl Future<Output = ()>` note: required by a bound in `StructAsync` --> $DIR/issue-98634.rs:9:35 | LL | pub struct StructAsync<F: Fn() -> Pin<Box<dyn Future<Output = ()>>>> { |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `StructAsync` error[E0271]: expected `fn() -> impl Future<Output = ()> {callback}` to be a fn item that returns `Pin<Box<(dyn Future<Output = ()> + 'static)>>`, but it returns `impl Future<Output = ()>` --> $DIR/issue-98634.rs:45:9 | LL |         StructAsync { callback }.await; |         ^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Pin`, found opaque type | note: while checking the return type of the `async fn` --> $DIR/issue-98634.rs:24:21 | LL | async fn callback() {} |                     ^ checked the `Output` of this `async fn`, found opaque type = note:   expected struct `Pin<Box<(dyn Future<Output = ()> + 'static)>>` found opaque type `impl Future<Output = ()>` note: required by a bound in `StructAsync` --> $DIR/issue-98634.rs:9:35 | LL | pub struct StructAsync<F: Fn() -> Pin<Box<dyn Future<Output = ()>>>> { |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `StructAsync` error[E0271]: expected `fn() -> impl Future<Output = ()> {callback}` to be a fn item that returns `Pin<Box<(dyn Future<Output = ()> + 'static)>>`, but it returns `impl Future<Output = ()>` --> $DIR/issue-98634.rs:45:33 | LL |         StructAsync { callback }.await; |                                 ^^^^^^ expected struct `Pin`, found opaque type | note: while checking the return type of the `async fn` --> $DIR/issue-98634.rs:24:21 | LL | async fn callback() {} |                     ^ checked the `Output` of this `async fn`, found opaque type = note:   expected struct `Pin<Box<(dyn Future<Output = ()> + 'static)>>` found opaque type `impl Future<Output = ()>` note: required by a bound in `StructAsync` --> $DIR/issue-98634.rs:9:35 | LL | pub struct StructAsync<F: Fn() -> Pin<Box<dyn Future<Output = ()>>>> { |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `StructAsync` error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0271`. </ins>