{% highlight rust %}
fn demo_refcell() {
- let rc = &mut RefCell::new(23u8);
+ let rc: &mut RefCell<u8> = &mut RefCell::new(23u8);
Retag(rc); // tag gets changed to `Uniq(0)`
// We will consider the stack of the location where `23` is stored; the
// `RefCell` bookkeeping counters are not of interest.
// Taking a shared reference shares the location but does not freeze, due
// to the `UnsafeCell`.
- let rc_shr = &*rc;
+ let rc_shr: &RefCell<u8> = &*rc;
Retag(rc_shr); // tag gets changed to `Shr(Some(1))`
// stack: [Uniq(0), Shr]; not frozen
// Lots of stuff happens here but it does not matter for this example.
- let mut bmut = rc_shr.borrow_mut();
+ let mut bmut: RefMut<u8> = rc_shr.borrow_mut();
// Obtain a mutable reference into the `RefCell`.
- let mut_ref = &mut *bmut;
+ let mut_ref: &mut u8 = &mut *bmut;
Retag(mut_ref); // tag gets changed to `Uniq(2)`
// stack: [Uniq(0), Shr, Uniq(2)]; not frozen
// And at the same time, a fresh shared reference to its outside!
// This counts as a read access through `rc`, so we have to pop until
// at least a `Shr` is at the top of the stack.
- let shr_ref = &*rc; // tag gets changed to `Shr(Some(3))`
+ let shr_ref: &RefCell<u8> = &*rc; // tag gets changed to `Shr(Some(3))`
Retag(shr_ref);
// stack: [Uniq(0), Shr]; not frozen
disappear entirely though, don't worry -- I will still be able to mentor you if
you want to help with any of the above tasks. :)
-Thanks to @nikomatsakis for feedback on a draft of this post. If you want to
+Thanks to @nikomatsakis for feedback on a draft of this post, to @shepmaster for
+making miri available on the playground, and to @oli-obk for reviewing all my
+PRs at unparalleled speed. <3
+
+If you want to
help or report results of your experiments, if you have any questions or
comments, please join the
[discussion in the forums](https://internals.rust-lang.org/t/stacked-borrows-implemented/8847).