Skip to content

Commit

Permalink
fix borrow-splitting
Browse files Browse the repository at this point in the history
  • Loading branch information
Gankra committed Jul 28, 2015
1 parent b93438f commit 9123bb0
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 10 deletions.
2 changes: 1 addition & 1 deletion src/doc/tarpl/SUMMARY.md
Expand Up @@ -17,7 +17,7 @@
* [Subtyping and Variance](subtyping.md)
* [Drop Check](dropck.md)
* [PhantomData](phantom-data.md)
* [Splitting Lifetimes](lifetime-splitting.md)
* [Splitting Borrows](borrow-splitting.md)
* [Type Conversions](conversions.md)
* [Coercions](coercions.md)
* [The Dot Operator](dot-operator.md)
Expand Down
@@ -1,4 +1,4 @@
% Splitting Lifetimes
% Splitting Borrows

The mutual exclusion property of mutable references can be very limiting when
working with a composite structure. The borrow checker understands some basic
Expand Down Expand Up @@ -67,9 +67,8 @@ fn split_at_mut(&mut self, mid: usize) -> (&mut [T], &mut [T]) {
}
```

This is pretty plainly dangerous. We use transmute to duplicate the slice with
an *unbounded* lifetime, so that it can be treated as disjoint from the other
until we unify them when we return.
This is actually a bit subtle. So as to avoid ever making two `&mut`'s to the
same value, we explicitly construct brand-new slices through raw pointers.

However more subtle is how iterators that yield mutable references work.
The iterator trait is defined as follows:
Expand Down
10 changes: 5 additions & 5 deletions src/doc/tarpl/unchecked-uninit.md
Expand Up @@ -15,11 +15,11 @@ initialization.

Unfortunately, this opens us up to all kinds of problems. Assignment has a
different meaning to Rust based on whether it believes that a variable is
initialized or not. If it's uninitialized, then Rust will semantically just
memcopy the bits over the uninitialized ones, and do nothing else. However if Rust
believes a value to be initialized, it will try to `Drop` the old value!
Since we've tricked Rust into believing that the value is initialized, we
can no longer safely use normal assignment.
initialized or not. If it's believed uninitialized, then Rust will semantically
just memcopy the bits over the uninitialized ones, and do nothing else. However
if Rust believes a value to be initialized, it will try to `Drop` the old value!
Since we've tricked Rust into believing that the value is initialized, we can no
longer safely use normal assignment.

This is also a problem if you're working with a raw system allocator, which
returns a pointer to uninitialized memory.
Expand Down

0 comments on commit 9123bb0

Please sign in to comment.