Repository: rust
Issue: Confusing diagnostic when using IndexMut on an &mut Type with IndexMut defined for both Type and &mut Type
Labels: A-diagnostics,T-compiler

<!--
Thank you for filing a bug report! 🐛 Please provide a short summary of the bug,
along with any information you feel relevant to replicating the bug.

If you cannot produce a minimal reproduction case (something that would work in
isolation), please provide the steps or even link to a repository that causes
the problematic output to occur.
-->

Given [this code](https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&code=use%20std%3A%3Aops%3A%3A%7BIndex%2C%20IndexMut%7D%3B%0Astruct%20Bug%20%7B%0A%20%20%20%20values%3A%20%5Busize%3B%2030%5D%0A%7D%0Aimpl%20Index%3Cusize%3E%20for%20Bug%20%7B%0A%20%20%20%20type%20Output%20%3D%20usize%3B%0A%20%20%20%20%0A%20%20%20%20fn%20index(%26self%2C%20index%3A%20usize)%20-%3E%20%26Self%3A%3AOutput%20%7B%0A%20%20%20%20%20%20%20%20%26self.values%5Bindex%5D%0A%20%20%20%20%7D%0A%7D%0Aimpl%20IndexMut%3Cusize%3E%20for%20Bug%20%7B%0A%20%20%20%20fn%20index_mut(%26mut%20self%2C%20index%3A%20usize)%20-%3E%20%26mut%20Self%3A%3AOutput%20%7B%0A%20%20%20%20%20%20%20%20%26mut%20self.values%5Bindex%5D%0A%20%20%20%20%7D%0A%7D%0Aimpl%20Index%3Cusize%3E%20for%20%26mut%20Bug%20%7B%0A%20%20%20%20type%20Output%20%3D%20usize%3B%0A%0A%20%20%20%20fn%20index(%26self%2C%20index%3A%20usize)%20-%3E%20%26Self%3A%3AOutput%20%7B%0A%20%20%20%20%20%20%20%20%26self.values%5Bindex%5D%0A%20%20%20%20%7D%0A%7D%0Aimpl%20IndexMut%3Cusize%3E%20for%20%26mut%20Bug%20%7B%0A%20%20%20%20fn%20index_mut(%26mut%20self%2C%20index%3A%20usize)%20-%3E%20%26mut%20Self%3A%3AOutput%20%7B%0A%20%20%20%20%20%20%20%20%26mut%20self.values%5Bindex%5D%0A%20%20%20%20%7D%0A%7D%0A%0Afn%20test(thing%3A%20%26mut%20Bug)%20%7B%0A%20%20%20%20println!(%22%7B%7D%22%2C%20thing%5B3%5D)%3B%20%2F%2F%20works%20as%20expected%0A%20%20%20%20thing%5B3%5D%20%3D%204%3B%20%2F%2F%20fails%20with%20a%20confusing%20error%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20mut%20tmp%20%3D%20Bug%20%7B%0A%20%20%20%20%20%20%20%20values%3A%20%5B0%3B%2030%5D%2C%0A%20%20%20%20%7D%3B%0A%20%20%20%20println!(%22%7B%7D%22%2Ctmp%5B3%5D)%3B%20%2F%2F%20works%20as%20expected%0A%20%20%20%20tmp%5B3%5D%20%3D%204%3B%20%2F%2F%20works%20as%20expected%0A%20%20%20%20test(%26mut%20tmp)%3B%0A%7D):

```rust
fn test(thing: &mut Bug) {
    println!("{}", thing[3]); // works as expected
    thing[3] = 4; // fails with a confusing error
}
```

The current output is:

```
error[E0596]: cannot borrow `thing` as mutable, as it is not declared as mutable
  --> src/main.rs:32:5
   |
32 |     thing[3] = 4; // fails with a confusing error
   |     ^^^^^ cannot borrow as mutable
   |
note: the binding is already a mutable borrow
  --> src/main.rs:30:16
   |
30 | fn test(thing: &mut Bug) {
   |                ^^^^^^^^
help: try removing `&mut` here
  --> src/main.rs:32:5
   |
32 |     thing[3] = 4; // fails with a confusing error
   |     ^^^^^
```

<!--
If the problem is not self-explanatory, please provide a rationale for the
change.
-->

<!--
If dramatically different output is caused by small changes, consider also
adding them here.

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. The output might also be
different depending on the Edition.
-->
Removing the `impl IndexMut<usize> for &mut Bug` implementation removes the error entirely