-
Notifications
You must be signed in to change notification settings - Fork 12.9k
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
fix LinkedList invalidating mutable references #60072
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure I even understand what is going on here...
Previously,
as_mut
returned a&mut Node<T>
, which we then modified theprev
field of. That much makes sense.Now, we get a
*mut Node<T>
, dereference it to get aNode<T>
then set theprev
field of.I've been under the impression that setting the field of a struct implicitly created a mutable reference — where am I wrong? If I'm not wrong, why aren't we creating a second mutable reference here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe a mutable borrow is established only if you create an &mut that isn't immediately explicitly cast to a
*mut
. It's very janky immediate-action rules, with similar logic to why you can take a reference to the output ofarr[x]
and it's not a reference to a temporary.Regardless for a lot of these the issue isn't a mutable borrow, but rather a mutable borrow that overlaps with
node.elem
. By writing the code this way we never claim unique ownership of the whole type, just that we can mutate the next/prev links.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, that would be rust-lang/rfcs#2582 which is not yet in.
Writing to a field has all the same effects (in terms of invalidating other references) as creating a mutable reference to it, yes.
The key point is that we only modify the
prev
field, and the aliasing reference we are worried about points to the data field (element
or whatever it is called). I will expand the comments to clarify this.s/type/node/. But yes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@shepmaster I tried to improve the comments explaining why these changes are needed; does this make more sense now?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you remove the pronoun here? Do you mean:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I mean "to the field".
It's really the other way around -- creating a mutable reference has the effects of a write to the memory that is "covered" by the reference (
size_of::<T>
bytes starting at where the pointer points).