Permit mutation of &mut
pointers whose pointees have been borrowed
#1751
Labels
T-lang
Relevant to the language team, which will review and decide on the RFC.
I am copying the text from rust-lang/rust#10520 which was closed as part of triage:
Now that the swap operator has been removed, I do not believe the
restriction against mutating
LV
is needed, and in fact it preventssome useful patterns. For example, the following function will
fail to compile:
Note that this function -- which adjusts the slice
*x
in place sothat it no longer contains the head element and then returns a
pointer to that element separately -- is perfectly valid. It is
currently implemented using unsafe code. I believe that now that
the swap operator is removed from the language, we could liberalize
the rules and make this function be accepted normally. The idea
would be to have the assignment to
*x
kill the loans of*x
andits subpaths -- after all, those subpaths are no longer accessible
through
*x
, since it has been overwritten with a new value. Thusthose subpaths are only accessible through prior existing borrows
of
*x
, if any. The danger of the swap operator was that itallowed
*x
to be mutated without making the subpaths of*x
inaccessible: worse, they became accessible through a new path (I
suppose that we could have supported a swap operator, too, if needed, by moving the loans over to the new path).
And in a later comment:
This may have become more important. As part of rust-lang/rust#20341, we started doing coercions on assignments of the form:
If
x
has type&mut X
, then this causes a reborrow ofy
whereas it used to cause a move. Unfortunately, this can break code that used to work. Here is a reduced example:This can be worked around by forcing a move using a dummy newtype:
But that's awful!
The text was updated successfully, but these errors were encountered: