// Issue #6272. Tests that freezing correctly accounts for all the
// implicit derefs that can occur.
//
// In this particular case, the expression:
//
//    let x: &mut [int] = c[0];
//
// is seen by borrowck as this sequence of derefs
// and pointer offsets:
//
//    &*((**c)[0])
//
// or, written using `x.*` for `*x` (so that everything
// is a postfix operation):
//
//    &c.*.*.[0].*
//       ^    ^
//       |    |
//       b    a
//
// Here I also indicated where the evaluation yields the boxes `a` and
// `b`. It is important then that we only freeze the innermost box
// (`a`), and not the other ones (`b`, `c`).
//
// Also see the companion test:
//
// run-fail/borrowck-wg-autoderef-and-autoborrowvec-combined-fail-issue-6272.rs


fn main() {
    let a = @mut 3i;
    let b = @mut [a];
    let c = @mut [3];

    // this should freeze `a` only
    let _x: &mut int = a;

    // hence these writes should not fail:
    b[0] = b[0];
    c[0] = c[0];
}
