Change:
<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>

Discussion:
<!-- 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