Skip to content

overhaul &mut suggestions in borrowck errors #145013

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

fee1-dead
Copy link
Member

@fee1-dead fee1-dead commented Aug 6, 2025

  • This refactors the logic so that it does not use fuzzy string matching for suggestions; it instead uses information directly from MIR.
  • If something comes from a custom Index impl for which the IndexMut trait does not apply, do not suggest adding mut after &.
  • Suggest get_mut with unwrap if error is fired on BTreeMap or HashMap.

Supersedes #144018 cc @xizheyin
Closes #143732

@rustbot
Copy link
Collaborator

rustbot commented Aug 6, 2025

r? @nnethercote

rustbot has assigned @nnethercote.
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

@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 6, 2025
Copy link
Contributor

@nnethercote nnethercote left a comment

Choose a reason for hiding this comment

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

I have only looked at the tests and their outputs so far, some of the suggestions seem suboptimal. Is this expected?

@rustbot author

|
LL | let x: &[isize] = &mut [1, 2, 3, 4, 5];
| +++
LL | let x: &mut [isize] = &[1, 2, 3, 4, 5];
Copy link
Contributor

Choose a reason for hiding this comment

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

This is still invalid, it needs to be &mut [1, 2, 3, 4, 5].

|
LL | let x = &mut 0 as *const i32;
| +++
LL | let x: *mut i32 = &0 as *const i32;
Copy link
Contributor

Choose a reason for hiding this comment

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

Also still invalid, let x = &mut 0 as *mut i32; would work, without needing the type annotation.

help: consider changing this binding's type
|
LL - let ptr_x: *const _ = &x;
LL + let ptr_x: *mut i32 = &x;
Copy link
Contributor

Choose a reason for hiding this comment

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

Should be &x instead of &mut x.

help: consider using `get_mut`
|
LL - let string = &map[&0];
LL + let string = map.get_mut(&0).unwrap();
Copy link
Contributor

Choose a reason for hiding this comment

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

It's a bit confusing that the suggestion is on a different line to the one mentioned earlier in the error. Is it possible to indicate that the line needing to be changed is on line 6?

Copy link
Member Author

Choose a reason for hiding this comment

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

Is it possible to indicate that the line needing to be changed is on line 6?

Yes, that is the LL annotation on the left, which gets normalized here but would have printed normally if it isn't in an UI test

Copy link
Member Author

Choose a reason for hiding this comment

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

or would you like me to explicitly say "consider using get_mut on line 6"? that's possible too

Copy link
Contributor

Choose a reason for hiding this comment

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

Oh right, that's fine then.

help: consider using `get_mut`
|
LL - let string = &map[&0];
LL + let string = map.get_mut(&0).unwrap();
Copy link
Contributor

Choose a reason for hiding this comment

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

ditto

|
help: consider changing this to be a mutable reference
|
LL | let string = &mut vec[0];
Copy link
Contributor

Choose a reason for hiding this comment

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

ditto

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
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.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

rust suggests using IndexMut for maps, even though they don't implement the trait
3 participants