Skip to content

Conversation

y21
Copy link
Member

@y21 y21 commented May 9, 2023

Recently saw someone ask why this code (example slightly modified):

fn main() {
  let mut foo = [1, 2];
  std::mem::swap(&mut foo[0], &mut foo[1]);
}

triggers this error and how to fix it:

error[E0499]: cannot borrow `foo[_]` as mutable more than once at a time
 --> src/main.rs:4:33
  |
4 |     std::mem::swap(&mut foo[0], &mut foo[1]);
  |     -------------- -----------  ^^^^^^^^^^^ second mutable borrow occurs here
  |     |              |
  |     |              first mutable borrow occurs here
  |     first borrow later used by call
  |
  = help: consider using `.split_at_mut(position)` or similar method to obtain two mutable non-overlapping sub-slices

The current help message is nice and goes in the right direction, but I think we can do better for this specific instance and suggest slice::swap, which makes this compile

@rustbot
Copy link
Collaborator

rustbot commented May 9, 2023

r? @jackh726

(rustbot has picked a reviewer for you, use r? to override)

@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. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels May 9, 2023
@wesleywiser
Copy link
Member

r? rust-lang/compiler

@rustbot rustbot assigned compiler-errors and unassigned jackh726 Jun 22, 2023
@compiler-errors
Copy link
Member

@rustbot author

@rustbot rustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 29, 2023
@y21 y21 force-pushed the suggest-slice-swap branch from 4a7bf03 to 6b72f0a Compare June 29, 2023 16:31
@rust-log-analyzer

This comment has been minimized.

@y21 y21 force-pushed the suggest-slice-swap branch from 6b72f0a to 679c5be Compare June 29, 2023 17:20
@y21
Copy link
Member Author

y21 commented Jun 29, 2023

The test that I wrote initially would be pretty much identical in output to the split_at_mut diagnostics test after this change so I just removed mine and have split_at_mut test the help message. Is that fine?

@compiler-errors
Copy link
Member

doesnt matter i guess
@bors r+ rollup

@bors
Copy link
Collaborator

bors commented Jun 29, 2023

📌 Commit 679c5be has been approved by compiler-errors

It is now in the queue for this repository.

@bors bors 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-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jun 29, 2023
compiler-errors added a commit to compiler-errors/rust that referenced this pull request Jun 30, 2023
…-errors

suggest `slice::swap` for `mem::swap(&mut x[0], &mut x[1])` borrowck error

Recently saw someone ask why this code (example slightly modified):
```rs
fn main() {
  let mut foo = [1, 2];
  std::mem::swap(&mut foo[0], &mut foo[1]);
}
```
triggers this error and how to fix it:
```
error[E0499]: cannot borrow `foo[_]` as mutable more than once at a time
 --> src/main.rs:4:33
  |
4 |     std::mem::swap(&mut foo[0], &mut foo[1]);
  |     -------------- -----------  ^^^^^^^^^^^ second mutable borrow occurs here
  |     |              |
  |     |              first mutable borrow occurs here
  |     first borrow later used by call
  |
  = help: consider using `.split_at_mut(position)` or similar method to obtain two mutable non-overlapping sub-slices
```
The current help message is nice and goes in the right direction, but I think we can do better for this specific instance and suggest `slice::swap`, which makes this compile
bors added a commit to rust-lang-ci/rust that referenced this pull request Jun 30, 2023
…iaskrgr

Rollup of 6 pull requests

Successful merges:

 - rust-lang#107624 (Stabilize `const_cstr_methods`)
 - rust-lang#111403 (suggest `slice::swap` for `mem::swap(&mut x[0], &mut x[1])` borrowck error)
 - rust-lang#113071 (Account for late-bound vars from parent arg-position impl trait)
 - rust-lang#113165 (Encode item bounds for `DefKind::ImplTraitPlaceholder`)
 - rust-lang#113171 (Properly implement variances_of for RPITIT GAT)
 - rust-lang#113177 (Use structured suggestion when telling user about `for<'a>`)

r? `@ghost`
`@rustbot` modify labels: rollup
@bors bors merged commit 6c22e04 into rust-lang:master Jun 30, 2023
@rustbot rustbot added this to the 1.72.0 milestone Jun 30, 2023
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. T-libs Relevant to the library team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants