Skip to content

Suggest mutable references for FnMut closure arguments - #161656

Merged
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
chenyukang:yukang-fix-118843-suggest-mut-fnmut-reference
Sep 5, 2026
Merged

Suggest mutable references for FnMut closure arguments#161656
rust-bors[bot] merged 2 commits into
rust-lang:mainfrom
chenyukang:yukang-fix-118843-suggest-mut-fnmut-reference

Conversation

@chenyukang

@chenyukang chenyukang commented Aug 24, 2026

Copy link
Copy Markdown
Member

Fixes #118843

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Aug 24, 2026
@rustbot

rustbot commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

r? @davidtwco

rustbot has assigned @davidtwco.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: compiler
  • compiler expanded to 75 candidates
  • Random selection from 17 candidates

@chenyukang
chenyukang force-pushed the yukang-fix-118843-suggest-mut-fnmut-reference branch from df6e4d2 to 61d3b06 Compare August 24, 2026 09:25
Comment on lines +3032 to +3037
&& let hir::ExprKind::AddrOf(hir::BorrowKind::Ref, hir::Mutability::Not, _) = arg.kind
{
let mut obligation = obligation.clone();
// Error reporting may narrow the cause span to the borrow's operand.
// Use the whole argument so `suggest_change_mut` can replace the shared borrow.
obligation.cause.span = arg.span;

@Albab-Hasan Albab-Hasan Sep 2, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure if this case is in scope, but if the borrow comes from a macro body the suggestion lands inside the macro definition:

    macro_rules! call_it {
        ($f:expr) => { (0..100).for_each(&$f) };
    }
    fn main() {
        let mut value = 0;
        let mut func = |increment: usize| value += increment;
        call_it!(func);
    }

    help: consider changing this borrow's mutability
      |
    2 |     ($f:expr) => { (0..100).for_each(&mut $f) };
      |                                       +++

since its MachineApplicable and the new test has run-rustfix, cargo fix would rewrite the macro. master emits the same E0525 with no help line, so i think this comes in with the new call site rather than being pre existing.

would a from_expansion check on the arg be enough to rule it out?

verified both commits on master 5db7f4b

View changes since the review

@davidtwco

Copy link
Copy Markdown
Member

@bors r+ rollup

@rust-bors

rust-bors Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 61d3b06 has been approved by davidtwco

It is now in the queue for this repository.

@rust-bors rust-bors Bot added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Sep 4, 2026
GuillaumeGomez added a commit to GuillaumeGomez/rust that referenced this pull request Sep 4, 2026
…st-mut-fnmut-reference, r=davidtwco

Suggest mutable references for FnMut closure arguments

Fixes rust-lang#118843
GuillaumeGomez added a commit to GuillaumeGomez/rust that referenced this pull request Sep 4, 2026
…st-mut-fnmut-reference, r=davidtwco

Suggest mutable references for FnMut closure arguments

Fixes rust-lang#118843
rust-bors Bot pushed a commit that referenced this pull request Sep 4, 2026
Rollup of 25 pull requests

Successful merges:

 - #159074 ([PAC] FnAbi, llvm.ptrauth.resign and Session API change (2/8))
 - #159792 (A more readable debug map for IndexMaps)
 - #161895 (std::sys::pal::sgx: fix mismatched alloc/free alignment)
 - #161900 (bootstrap: Include feature-gated items in bootstrap tool docs)
 - #161940 (Promote `wasm32-wasip3` to a tier 2 target)
 - #162072 (Add new Tier-3 target: `powerpc64-sony-ps3`)
 - #162179 (type system const items via direct rhs)
 - #162277 (Introduce `rustc_middle::middel::resolve`)
 - #162285 (box: fixup map/try_map deallocate calls)
 - #162286 (string: don't unwind prematurely)
 - #162289 (alloc: a bunch of safety comments)
 - #162292 (Update `askama` version to `0.16.1`)
 - #160509 (Remove `RegionExt`; move methods to `Region` in `rustc_type_ir`)
 - #160906 (Suggest usize instead of placeholder type for array length constants)
 - #160936 (traits: Represent live alias arguments as bitsets)
 - #161400 (Improve diagnostics for references to closures)
 - #161656 (Suggest mutable references for FnMut closure arguments)
 - #161711 (Add more splat fn type tests)
 - #161786 (Make `tcx.def_id_partial_cmp` public)
 - #161953 (sanitizers: Implicitly disable mutually exclusive sanitizers)
 - #162155 (add suggestion for `rustc_allowed_through_unstable_modules` attribute)
 - #162212 (Implement `Rng` for `Box`)
 - #162246 (Fix incorrect meta span)
 - #162266 (std: fix typo)
 - #162291 (Add regression test from 1.98.1)
GuillaumeGomez added a commit to GuillaumeGomez/rust that referenced this pull request Sep 4, 2026
…st-mut-fnmut-reference, r=davidtwco

Suggest mutable references for FnMut closure arguments

Fixes rust-lang#118843
rust-bors Bot pushed a commit that referenced this pull request Sep 4, 2026
Rollup of 25 pull requests

Successful merges:

 - #159074 ([PAC] FnAbi, llvm.ptrauth.resign and Session API change (2/8))
 - #159792 (A more readable debug map for IndexMaps)
 - #160745 (make closures act like MaybeDangling)
 - #161895 (std::sys::pal::sgx: fix mismatched alloc/free alignment)
 - #161940 (Promote `wasm32-wasip3` to a tier 2 target)
 - #162072 (Add new Tier-3 target: `powerpc64-sony-ps3`)
 - #162179 (type system const items via direct rhs)
 - #162277 (Introduce `rustc_middle::middel::resolve`)
 - #162285 (box: fixup map/try_map deallocate calls)
 - #162286 (string: don't unwind prematurely)
 - #162289 (alloc: a bunch of safety comments)
 - #162292 (Update `askama` version to `0.16.1`)
 - #160509 (Remove `RegionExt`; move methods to `Region` in `rustc_type_ir`)
 - #160906 (Suggest usize instead of placeholder type for array length constants)
 - #160936 (traits: Represent live alias arguments as bitsets)
 - #161400 (Improve diagnostics for references to closures)
 - #161656 (Suggest mutable references for FnMut closure arguments)
 - #161711 (Add more splat fn type tests)
 - #161786 (Make `tcx.def_id_partial_cmp` public)
 - #161953 (sanitizers: Implicitly disable mutually exclusive sanitizers)
 - #162155 (add suggestion for `rustc_allowed_through_unstable_modules` attribute)
 - #162212 (Implement `Rng` for `Box`)
 - #162246 (Fix incorrect meta span)
 - #162266 (std: fix typo)
 - #162291 (Add regression test from 1.98.1)
GuillaumeGomez added a commit to GuillaumeGomez/rust that referenced this pull request Sep 4, 2026
…st-mut-fnmut-reference, r=davidtwco

Suggest mutable references for FnMut closure arguments

Fixes rust-lang#118843
GuillaumeGomez added a commit to GuillaumeGomez/rust that referenced this pull request Sep 4, 2026
…st-mut-fnmut-reference, r=davidtwco

Suggest mutable references for FnMut closure arguments

Fixes rust-lang#118843
rust-bors Bot pushed a commit that referenced this pull request Sep 4, 2026
Rollup of 27 pull requests

Successful merges:

 - #159074 ([PAC] FnAbi, llvm.ptrauth.resign and Session API change (2/8))
 - #159792 (A more readable debug map for IndexMaps)
 - #160745 (make closures act like MaybeDangling)
 - #161940 (Promote `wasm32-wasip3` to a tier 2 target)
 - #162030 (Prevent `--test` to be used in `rustdoc-html` testsuite)
 - #162072 (Add new Tier-3 target: `powerpc64-sony-ps3`)
 - #162179 (type system const items via direct rhs)
 - #162262 (Avoid manually instantiating some binders in error reporting with `-Znext-solver`)
 - #162277 (Introduce `rustc_middle::middel::resolve`)
 - #162285 (box: fixup map/try_map deallocate calls)
 - #162286 (string: don't unwind prematurely)
 - #162289 (alloc: a bunch of safety comments)
 - #162290 (abby test DSL: AliasTyOutlivesViaEnv)
 - #162292 (Update `askama` version to `0.16.1`)
 - #160509 (Remove `RegionExt`; move methods to `Region` in `rustc_type_ir`)
 - #160906 (Suggest usize instead of placeholder type for array length constants)
 - #160936 (traits: Represent live alias arguments as bitsets)
 - #161400 (Improve diagnostics for references to closures)
 - #161656 (Suggest mutable references for FnMut closure arguments)
 - #161711 (Add more splat fn type tests)
 - #161786 (Make `tcx.def_id_partial_cmp` public)
 - #161953 (sanitizers: Implicitly disable mutually exclusive sanitizers)
 - #162155 (add suggestion for `rustc_allowed_through_unstable_modules` attribute)
 - #162212 (Implement `Rng` for `Box`)
 - #162246 (Fix incorrect meta span)
 - #162266 (std: fix typo)
 - #162291 (Add regression test from 1.98.1)
rust-bors Bot pushed a commit that referenced this pull request Sep 5, 2026
…uwer

Rollup of 25 pull requests

Successful merges:

 - #162072 (Add new Tier-3 target: `powerpc64-sony-ps3`)
 - #162179 (type system const items via direct rhs)
 - #162255 (let people change rustc-dev-guide in-tree)
 - #162262 (Avoid manually instantiating some binders in error reporting with `-Znext-solver`)
 - #162277 (Introduce `rustc_middle::middel::resolve`)
 - #162285 (box: fixup map/try_map deallocate calls)
 - #162286 (string: don't unwind prematurely)
 - #162289 (alloc: a bunch of safety comments)
 - #162290 (abby test DSL: AliasTyOutlivesViaEnv)
 - #162292 (Update `askama` version to `0.16.1`)
 - #160509 (Remove `RegionExt`; move methods to `Region` in `rustc_type_ir`)
 - #160906 (Suggest usize instead of placeholder type for array length constants)
 - #160936 (traits: Represent live alias arguments as bitsets)
 - #161394 (fix `is_homogeneous_aggregate`: use unit size, not total size )
 - #161400 (Improve diagnostics for references to closures)
 - #161656 (Suggest mutable references for FnMut closure arguments)
 - #161711 (Add more splat fn type tests)
 - #161786 (Make `tcx.def_id_partial_cmp` public)
 - #161953 (sanitizers: Implicitly disable mutually exclusive sanitizers)
 - #162155 (add suggestion for `rustc_allowed_through_unstable_modules` attribute)
 - #162212 (Implement `Rng` for `Box`)
 - #162246 (Fix incorrect meta span)
 - #162266 (std: fix typo)
 - #162291 (Add regression test from 1.98.1)
 - #162303 (Fix a minor spelling error in `library/std/src/sys/fs/unix.rs`)
Zalathar added a commit to Zalathar/rust that referenced this pull request Sep 5, 2026
…st-mut-fnmut-reference, r=davidtwco

Suggest mutable references for FnMut closure arguments

Fixes rust-lang#118843
rust-bors Bot pushed a commit that referenced this pull request Sep 5, 2026
…uwer

Rollup of 25 pull requests

Successful merges:

 - #162072 (Add new Tier-3 target: `powerpc64-sony-ps3`)
 - #162179 (type system const items via direct rhs)
 - #162255 (let people change rustc-dev-guide in-tree)
 - #162262 (Avoid manually instantiating some binders in error reporting with `-Znext-solver`)
 - #162277 (Introduce `rustc_middle::middel::resolve`)
 - #162285 (box: fixup map/try_map deallocate calls)
 - #162286 (string: don't unwind prematurely)
 - #162289 (alloc: a bunch of safety comments)
 - #162290 (abby test DSL: AliasTyOutlivesViaEnv)
 - #162292 (Update `askama` version to `0.16.1`)
 - #160509 (Remove `RegionExt`; move methods to `Region` in `rustc_type_ir`)
 - #160906 (Suggest usize instead of placeholder type for array length constants)
 - #160936 (traits: Represent live alias arguments as bitsets)
 - #161394 (fix `is_homogeneous_aggregate`: use unit size, not total size )
 - #161400 (Improve diagnostics for references to closures)
 - #161656 (Suggest mutable references for FnMut closure arguments)
 - #161711 (Add more splat fn type tests)
 - #161786 (Make `tcx.def_id_partial_cmp` public)
 - #161953 (sanitizers: Implicitly disable mutually exclusive sanitizers)
 - #162155 (add suggestion for `rustc_allowed_through_unstable_modules` attribute)
 - #162212 (Implement `Rng` for `Box`)
 - #162246 (Fix incorrect meta span)
 - #162266 (std: fix typo)
 - #162291 (Add regression test from 1.98.1)
 - #162303 (Fix a minor spelling error in `library/std/src/sys/fs/unix.rs`)
@rust-bors
rust-bors Bot merged commit 57855e6 into rust-lang:main Sep 5, 2026
13 checks passed
@rustbot rustbot added this to the 1.100.0 milestone Sep 5, 2026
rust-bors Bot pushed a commit that referenced this pull request Sep 5, 2026
Rollup merge of #161656 - chenyukang:yukang-fix-118843-suggest-mut-fnmut-reference, r=davidtwco

Suggest mutable references for FnMut closure arguments

Fixes #118843
@rust-timer

Copy link
Copy Markdown
Collaborator

Note

This PR was benchmarked as part of triage of its containing rollup: triage URL.

Finished benchmarking commit (4c9aa76): comparison URL.

Overall result: ❌ regressions - no action needed

@rustbot label: -perf-regression

Instruction count

Our most reliable metric. Used to determine the overall result above. However, even this metric can be noisy.

mean range count
Regressions ❌
(primary)
0.3% [0.3%, 0.3%] 1
Regressions ❌
(secondary)
- - 0
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) 0.3% [0.3%, 0.3%] 1

Max RSS (memory usage)

Results (primary 1.4%, secondary -4.1%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
3.6% [3.4%, 3.7%] 2
Regressions ❌
(secondary)
- - 0
Improvements ✅
(primary)
-2.9% [-2.9%, -2.9%] 1
Improvements ✅
(secondary)
-4.1% [-4.1%, -4.1%] 1
All ❌✅ (primary) 1.4% [-2.9%, 3.7%] 3

Cycles

Results (secondary -2.0%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
- - 0
Regressions ❌
(secondary)
- - 0
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
-2.0% [-2.1%, -2.0%] 2
All ❌✅ (primary) - - 0

Binary size

This perf run didn't have relevant results for this metric.

Bootstrap: missing data
Artifact size: 403.29 MiB -> 403.35 MiB (0.01%)

renovate-bot pushed a commit to renovate-bot/rust-lang-_-compiler-builtins that referenced this pull request Sep 7, 2026
…uwer

Rollup of 25 pull requests

Successful merges:

 - rust-lang/rust#162072 (Add new Tier-3 target: `powerpc64-sony-ps3`)
 - rust-lang/rust#162179 (type system const items via direct rhs)
 - rust-lang/rust#162255 (let people change rustc-dev-guide in-tree)
 - rust-lang/rust#162262 (Avoid manually instantiating some binders in error reporting with `-Znext-solver`)
 - rust-lang/rust#162277 (Introduce `rustc_middle::middel::resolve`)
 - rust-lang/rust#162285 (box: fixup map/try_map deallocate calls)
 - rust-lang/rust#162286 (string: don't unwind prematurely)
 - rust-lang/rust#162289 (alloc: a bunch of safety comments)
 - rust-lang/rust#162290 (abby test DSL: AliasTyOutlivesViaEnv)
 - rust-lang/rust#162292 (Update `askama` version to `0.16.1`)
 - rust-lang/rust#160509 (Remove `RegionExt`; move methods to `Region` in `rustc_type_ir`)
 - rust-lang/rust#160906 (Suggest usize instead of placeholder type for array length constants)
 - rust-lang/rust#160936 (traits: Represent live alias arguments as bitsets)
 - rust-lang/rust#161394 (fix `is_homogeneous_aggregate`: use unit size, not total size )
 - rust-lang/rust#161400 (Improve diagnostics for references to closures)
 - rust-lang/rust#161656 (Suggest mutable references for FnMut closure arguments)
 - rust-lang/rust#161711 (Add more splat fn type tests)
 - rust-lang/rust#161786 (Make `tcx.def_id_partial_cmp` public)
 - rust-lang/rust#161953 (sanitizers: Implicitly disable mutually exclusive sanitizers)
 - rust-lang/rust#162155 (add suggestion for `rustc_allowed_through_unstable_modules` attribute)
 - rust-lang/rust#162212 (Implement `Rng` for `Box`)
 - rust-lang/rust#162246 (Fix incorrect meta span)
 - rust-lang/rust#162266 (std: fix typo)
 - rust-lang/rust#162291 (Add regression test from 1.98.1)
 - rust-lang/rust#162303 (Fix a minor spelling error in `library/std/src/sys/fs/unix.rs`)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Confusing output when passing a FnMut closure via non-mut reference

5 participants