{% 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