auto merge of #6376 : nikomatsakis/rust/issue-6272-tests, r=graydon
r? @graydon
This commit is contained in:
commit
d43d3e538c
@ -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];
|
||||
}
|
@ -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];
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user