Skip to content

Commit

Permalink
test: Add two tests for issue rust-lang#6272.
Browse files Browse the repository at this point in the history
  • Loading branch information
nikomatsakis committed May 9, 2013
1 parent e18ed77 commit e010c3f
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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];
}
Original file line number Diff line number Diff line change
@@ -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];
}

0 comments on commit e010c3f

Please sign in to comment.