rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
93.93k stars 12.09k forks source link

An async closure may implement `FnMut`/`Fn` if it has no self-borrows #125259

Closed compiler-errors closed 1 week ago

compiler-errors commented 2 weeks ago

There's no reason that async closures may not implement FnMut or Fn if they don't actually borrow anything with the closure's env lifetime. Specifically, #123660 made it so that we don't always need to borrow captures from the closure's env.

See the doc comment on should_reborrow_from_env_of_parent_coroutine_closure:

https://github.com/rust-lang/rust/blob/c00957a3e269219413041a4e3565f33b1f9d0779/compiler/rustc_hir_typeck/src/upvar.rs#L1777-L1823

If there are no such borrows, then we are free to implement FnMut and Fn as permitted by our closure's inferred ClosureKind.

As far as I can tell, this change makes async || {} work in precisely the set of places they used to work before #120361. Fixes #125247.

r? oli-obk

rustbot commented 2 weeks ago

Some changes occurred to the core trait solver

cc @rust-lang/initiative-trait-system-refactor

oli-obk commented 1 week ago

@bors r+ rollup

bors commented 1 week ago

:pushpin: Commit 2e97dae8d468623474d05dd84c270583ec3ed374 has been approved by oli-obk

It is now in the queue for this repository.

fmease commented 1 week ago

bors sleepy @bors r-