mode: reset mode on entry to fn body.

This is an interim fix to address the "Beware!" unsoundness.  I have a
more comprehensive rewrite of mode.rs in the pipeline.

r=pcwalton
This commit is contained in:
Niko Matsakis 2013-01-10 06:29:26 -08:00
parent eaa256509e
commit 737e115646
17 changed files with 69 additions and 41 deletions

View file

@ -0,0 +1,10 @@
enum sty = ~[int];
fn unpack(unpack: &fn(v: &sty) -> ~[int]) {}
fn main() {
let foo = unpack(|s| {
// Test that `s` is moved here.
match *s { sty(v) => v } //~ ERROR moving out of dereference of immutable & pointer
});
}

View file

@ -15,7 +15,7 @@ fn main() {
let carrots = @~"crunchy";
fn@(tasties: @~str, macerate: fn(~str)) {
macerate(*tasties);
macerate(copy *tasties);
} (carrots, |food| {
let mush = food + cheese;
let f = fn@() {

View file

@ -39,6 +39,6 @@ fn main() {
// Verify that blocks can't interfere with each other.
fn two_blocks(a: fn(), b: fn()) { a(); b(); a(); b(); }
let q = ~50;
two_blocks(|| { let a = q; assert *a == 50;},
|| { let a = q; assert *a == 50;});
two_blocks(|| { let a = copy q; assert *a == 50;},
|| { let a = copy q; assert *a == 50;});
}

View file

@ -43,6 +43,8 @@ fn transform(x: Option<int>) -> Option<~str> {
fn main() {
assert transform(Some(10)) == Some(~"11");
assert transform(None) == None;
assert (~[~"hi"]).bind(|x| ~[x, x + ~"!"] ).bind(|x| ~[x, x + ~"?"] ) ==
assert (~[~"hi"])
.bind(|x| ~[copy x, x + ~"!"] )
.bind(|x| ~[copy x, x + ~"?"] ) ==
~[~"hi", ~"hi?", ~"hi!", ~"hi!?"];
}