// Testing the display of Cell, RefCell, and RefMut in cdb.

// cdb-only
//@ min-cdb-version: 10.0.18317.1001
//@ compile-flags:-g

// === CDB TESTS ==================================================================================

//@ cdb-command: g

//@ cdb-command:dx static_c,d
//@ cdb-check:static_c,d       : 10 [Type: core::cell::Cell<i32>]
//@ cdb-check:    [<Raw View>]     [Type: core::cell::Cell<i32>]

//@ cdb-command: dx static_c.value,d
//@ cdb-check:static_c.value,d : 10 [Type: core::cell::UnsafeCell<i32>]
//@ cdb-check:    [<Raw View>]     [Type: core::cell::UnsafeCell<i32>]

//@ cdb-command:  dx dynamic_c,d
//@ cdb-check:dynamic_c,d      : 15 [Type: core::cell::RefCell<i32>]
//@ cdb-check:    [<Raw View>]     [Type: core::cell::RefCell<i32>]
//@ cdb-check:    [Borrow state]   : Unborrowed

//@ cdb-command: dx dynamic_c.value,d
//@ cdb-check:dynamic_c.value,d : 15 [Type: core::cell::UnsafeCell<i32>]
//@ cdb-check:    [<Raw View>]     [Type: core::cell::UnsafeCell<i32>]

//@ cdb-command: dx b,d
//@ cdb-check:b,d              : 42 [Type: core::cell::RefMut<i32>]
//@ cdb-check:    [<Raw View>]     [Type: core::cell::RefMut<i32>]
//@ cdb-check:    42 [Type: int]

//@ cdb-command: g

//@ cdb-command: dx dynamic_c,d
//@ cdb-check:dynamic_c,d      : 15 [Type: core::cell::RefCell<i32>]
//@ cdb-check:    [<Raw View>]     [Type: core::cell::RefCell<i32>]
//@ cdb-check:    [Borrow state]   : Immutably borrowed

//@ cdb-command: dx r_borrow,d
//@ cdb-check:r_borrow,d       : 15 [Type: core::cell::Ref<i32>]
//@ cdb-check:    [<Raw View>]     [Type: core::cell::Ref<i32>]
//@ cdb-check:    15 [Type: int]

//@ cdb-command: g

//@ cdb-command: dx dynamic_c,d
//@ cdb-check:dynamic_c,d      : 15 [Type: core::cell::RefCell<i32>]
//@ cdb-check:    [<Raw View>]     [Type: core::cell::RefCell<i32>]
//@ cdb-check:    [Borrow state]   : Unborrowed

//@ cdb-command: g

//@ cdb-command: dx dynamic_c,d
//@ cdb-check:dynamic_c,d      : 15 [Type: core::cell::RefCell<i32>]
//@ cdb-check:    [<Raw View>]     [Type: core::cell::RefCell<i32>]
//@ cdb-check:    [Borrow state]   : Mutably borrowed

//@ cdb-command: dx r_borrow_mut,d
//@ cdb-check:r_borrow_mut,d   : 15 [Type: core::cell::RefMut<i32>]
//@ cdb-check:    [<Raw View>]     [Type: core::cell::RefMut<i32>]
//@ cdb-check:    15 [Type: int]

//@ cdb-command: g

//@ cdb-command: dx dynamic_c,d
//@ cdb-check:dynamic_c,d      : 15 [Type: core::cell::RefCell<i32>]
//@ cdb-check:    [<Raw View>]     [Type: core::cell::RefCell<i32>]
//@ cdb-check:    [Borrow state]   : Unborrowed

#![allow(unused_variables)]

use std::cell::{Cell, RefCell};

fn main() {
    let static_c = Cell::new(5);
    static_c.set(10);

    let dynamic_c = RefCell::new(5);
    dynamic_c.replace(15);

    let dynamic_c_0 = RefCell::new(15);
    let mut b = dynamic_c_0.borrow_mut();
    *b = 42;

    zzz(); // #break

    // Check that `RefCell`'s borrow state visualizes correctly
    {
        let r_borrow = dynamic_c.borrow();
        zzz(); // #break
    }

    zzz(); // #break

    {
        let r_borrow_mut = dynamic_c.borrow_mut();
        zzz(); // #break
    }

    zzz(); // #break
}

fn zzz() {()}
