auto merge of #6376 : nikomatsakis/rust/issue-6272-tests, r=graydon

r? @graydon
This commit is contained in:
bors 2013-05-10 22:58:53 -07:00
commit d43d3e538c
2 changed files with 62 additions and 0 deletions

View File

@ -0,0 +1,21 @@
// error-pattern:borrowed
// Issue #6272. Tests that freezing correctly accounts for all the
// implicit derefs that can occur and freezes the innermost box. See
// the companion test
//
// run-pass/borrowck-wg-autoderef-and-autoborrowvec-combined-issue-6272.rs
//
// for a detailed explanation of what is going on here.
fn main() {
let a = @mut [3i];
let b = @mut [a];
let c = @mut b;
// this should freeze `a` only
let x: &mut [int] = c[0];
// hence this should fail
a[0] = a[0];
}

View File

@ -0,0 +1,41 @@
// 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 b;
// this should freeze `a` only
let _x: &mut [int] = c[0];
// hence these writes should not fail:
b[0] = b[0];
c[0] = c[0];
}