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. --Still working out how to get rid of this and find a minimal replicating code example. The backtrace however, contains some useful information like "index out of bounds", for those who knows the implementation of the compiler. I guess it should be a good clue to find out what makes it wrong. <!-- 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<!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --<!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOTEND --
Can you check if this is fixed on nightly?
Running the nightly channel on the same code reports a type error that linked to a change I made in the code that making a function returning to an but forgot to change the calling site to use .
Ok, according the clue above I found a minimal code example The above code should not compile; but instead of reporting errors it crashes the compiler. Seems only affects the stable channel; beta and nightly are working properly. (The example code can be rewritten as or something like that and it will report the error correctly; however the real code was converting to instead of so it does not help)
So this is fixed by -- unfortunately that's going to land in the next release cycle (1.65) and this isn't a critical enough ICE to warrant a patch release for 1.64
can we add the repro to the test suite and close the ticket then?
claim To add the test if it's not already done.
Please do!

Discussion:
<ins> // edition:2021 async fn foo() -> Result<(), String> { Ok(()) } fn convert_result<T, E>(r: Result<T, E>) -> Option<T> { None } fn main() -> Option<()> { //~^ ERROR `main` has invalid return type `Option<()>` convert_result(foo()) //~^ ERROR mismatched types } </ins>

<ins> error[E0308]: mismatched types --> $DIR/issue-102605.rs:13:20 | LL |     convert_result(foo()) |     -------------- ^^^^^ expected enum `Result`, found opaque type |     | |     arguments to this function are incorrect | note: while checking the return type of the `async fn` --> $DIR/issue-102605.rs:3:19 | LL | async fn foo() -> Result<(), String> { |                   ^^^^^^^^^^^^^^^^^^ checked the `Output` of this `async fn`, found opaque type = note:     expected enum `Result<(), _>` found opaque type `impl Future<Output = Result<(), String>>` note: function defined here --> $DIR/issue-102605.rs:7:4 | LL | fn convert_result<T, E>(r: Result<T, E>) -> Option<T> { |    ^^^^^^^^^^^^^^       --------------- help: consider `await`ing on the `Future` | LL |     convert_result(foo().await) |                         ++++++ help: try wrapping the expression in `Err` | LL |     convert_result(Err(foo())) |                    ++++     + error[E0277]: `main` has invalid return type `Option<()>` --> $DIR/issue-102605.rs:11:14 | LL | fn main() -> Option<()> { |              ^^^^^^^^^^ `main` can only return types that implement `Termination` | = help: consider using `()`, or a `Result` error: aborting due to 2 previous errors Some errors have detailed explanations: E0277, E0308. For more information about an error, try `rustc --explain E0277`. </ins>