auto merge of #7262 : nikomatsakis/rust/ref-bindings-in-irrefut-patterns, r=catamorphism
Correct treatment of irrefutable patterns. The old code was wrong in many, many ways. `ref` bindings didn't work, it sometimes copied when it should have moved, the borrow checker didn't even look at such patterns at all, we weren't consistent about preventing values with destructors from being pulled apart, etc. Fixes #3224. Fixes #3225. Fixes #3255. Fixes #6225. Fixes #6386. r? @catamorphism
This commit is contained in:
commit
a48ca3290d
72 changed files with 1140 additions and 696 deletions
|
|
@ -418,8 +418,8 @@ mod test {
|
|||
fn make_file(path : &Path, contents: &[~str]) {
|
||||
let file = io::file_writer(path, [io::Create, io::Truncate]).get();
|
||||
|
||||
for contents.iter().advance |&str| {
|
||||
file.write_str(str);
|
||||
for contents.iter().advance |str| {
|
||||
file.write_str(*str);
|
||||
file.write_char('\n');
|
||||
}
|
||||
}
|
||||
|
|
@ -445,7 +445,7 @@ mod test {
|
|||
|i| fmt!("tmp/lib-fileinput-test-fileinput-read-byte-%u.tmp", i)), true);
|
||||
|
||||
// 3 files containing 0\n, 1\n, and 2\n respectively
|
||||
for filenames.iter().enumerate().advance |(i, &filename)| {
|
||||
for filenames.iter().enumerate().advance |(i, filename)| {
|
||||
make_file(filename.get_ref(), [fmt!("%u", i)]);
|
||||
}
|
||||
|
||||
|
|
@ -475,7 +475,7 @@ mod test {
|
|||
|i| fmt!("tmp/lib-fileinput-test-fileinput-read-%u.tmp", i)), true);
|
||||
|
||||
// 3 files containing 1\n, 2\n, and 3\n respectively
|
||||
for filenames.iter().enumerate().advance |(i, &filename)| {
|
||||
for filenames.iter().enumerate().advance |(i, filename)| {
|
||||
make_file(filename.get_ref(), [fmt!("%u", i)]);
|
||||
}
|
||||
|
||||
|
|
@ -495,10 +495,11 @@ mod test {
|
|||
3,
|
||||
|i| fmt!("tmp/lib-fileinput-test-input-vec-%u.tmp", i)), true);
|
||||
|
||||
for filenames.iter().enumerate().advance |(i, &filename)| {
|
||||
for filenames.iter().enumerate().advance |(i, filename)| {
|
||||
let contents =
|
||||
vec::from_fn(3, |j| fmt!("%u %u", i, j));
|
||||
make_file(filename.get_ref(), contents);
|
||||
debug!("contents=%?", contents);
|
||||
all_lines.push_all(contents);
|
||||
}
|
||||
|
||||
|
|
@ -515,7 +516,7 @@ mod test {
|
|||
3,
|
||||
|i| fmt!("tmp/lib-fileinput-test-input-vec-state-%u.tmp", i)),true);
|
||||
|
||||
for filenames.iter().enumerate().advance |(i, &filename)| {
|
||||
for filenames.iter().enumerate().advance |(i, filename)| {
|
||||
let contents =
|
||||
vec::from_fn(3, |j| fmt!("%u %u", i, j + 1));
|
||||
make_file(filename.get_ref(), contents);
|
||||
|
|
@ -579,10 +580,10 @@ mod test {
|
|||
3,
|
||||
|i| fmt!("tmp/lib-fileinput-test-next-file-%u.tmp", i)),true);
|
||||
|
||||
for filenames.iter().enumerate().advance |(i, &filename)| {
|
||||
for filenames.iter().enumerate().advance |(i, filename)| {
|
||||
let contents =
|
||||
vec::from_fn(3, |j| fmt!("%u %u", i, j + 1));
|
||||
make_file(&filename.get(), contents);
|
||||
make_file(filename.get_ref(), contents);
|
||||
}
|
||||
|
||||
let in = FileInput::from_vec(filenames);
|
||||
|
|
|
|||
|
|
@ -1571,10 +1571,10 @@ mod biguint_tests {
|
|||
fn test_to_str_radix() {
|
||||
let r = to_str_pairs();
|
||||
for r.iter().advance |num_pair| {
|
||||
let &(n, rs) = num_pair;
|
||||
let &(ref n, ref rs) = num_pair;
|
||||
for rs.iter().advance |str_pair| {
|
||||
let &(radix, str) = str_pair;
|
||||
assert_eq!(n.to_str_radix(radix), str);
|
||||
let &(ref radix, ref str) = str_pair;
|
||||
assert_eq!(&n.to_str_radix(*radix), str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1583,10 +1583,10 @@ mod biguint_tests {
|
|||
fn test_from_str_radix() {
|
||||
let r = to_str_pairs();
|
||||
for r.iter().advance |num_pair| {
|
||||
let &(n, rs) = num_pair;
|
||||
let &(ref n, ref rs) = num_pair;
|
||||
for rs.iter().advance |str_pair| {
|
||||
let &(radix, str) = str_pair;
|
||||
assert_eq!(&n, &FromStrRadix::from_str_radix(str, radix).get());
|
||||
let &(ref radix, ref str) = str_pair;
|
||||
assert_eq!(n, &FromStrRadix::from_str_radix(*str, *radix).get());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ impl<T> Drop for Rc<T> {
|
|||
if self.ptr.is_not_null() {
|
||||
(*self.ptr).count -= 1;
|
||||
if (*self.ptr).count == 0 {
|
||||
ptr::replace_ptr(self.ptr, intrinsics::uninit());
|
||||
ptr::read_ptr(self.ptr);
|
||||
free(self.ptr as *c_void)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -119,8 +119,8 @@ impl Terminal {
|
|||
pub fn reset(&self) {
|
||||
let mut vars = Variables::new();
|
||||
let s = do self.ti.strings.find_equiv(&("op"))
|
||||
.map_consume_default(Err(~"can't find terminfo capability `op`")) |&op| {
|
||||
expand(op, [], &mut vars)
|
||||
.map_consume_default(Err(~"can't find terminfo capability `op`")) |op| {
|
||||
expand(copy *op, [], &mut vars)
|
||||
};
|
||||
if s.is_ok() {
|
||||
self.out.write(s.unwrap());
|
||||
|
|
|
|||
|
|
@ -81,8 +81,8 @@ pub fn expand(cap: &[u8], params: &[Param], vars: &mut Variables)
|
|||
|
||||
// Copy parameters into a local vector for mutability
|
||||
let mut mparams = [Number(0), ..9];
|
||||
for mparams.mut_iter().zip(params.iter()).advance |(dst, &src)| {
|
||||
*dst = src;
|
||||
for mparams.mut_iter().zip(params.iter()).advance |(dst, src)| {
|
||||
*dst = copy *src;
|
||||
}
|
||||
|
||||
for cap.iter().transform(|&x| x).advance |c| {
|
||||
|
|
|
|||
|
|
@ -773,15 +773,15 @@ mod test_treemap {
|
|||
map: &TreeMap<K, V>) {
|
||||
assert_eq!(ctrl.is_empty(), map.is_empty());
|
||||
for ctrl.iter().advance |x| {
|
||||
let &(k, v) = x;
|
||||
assert!(map.find(&k).unwrap() == &v)
|
||||
let &(ref k, ref v) = x;
|
||||
assert!(map.find(k).unwrap() == v)
|
||||
}
|
||||
for map.iter().advance |(map_k, map_v)| {
|
||||
let mut found = false;
|
||||
for ctrl.iter().advance |x| {
|
||||
let &(ctrl_k, ctrl_v) = x;
|
||||
if *map_k == ctrl_k {
|
||||
assert!(*map_v == ctrl_v);
|
||||
let &(ref ctrl_k, ref ctrl_v) = x;
|
||||
if *map_k == *ctrl_k {
|
||||
assert!(*map_v == *ctrl_v);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -157,8 +157,8 @@ impl<D:Decoder> Decodable<D> for WorkMap {
|
|||
fn decode(d: &mut D) -> WorkMap {
|
||||
let v : ~[(WorkKey,~str)] = Decodable::decode(d);
|
||||
let mut w = WorkMap::new();
|
||||
for v.iter().advance |&(k, v)| {
|
||||
w.insert(copy k, copy v);
|
||||
for v.iter().advance |pair| {
|
||||
w.insert(pair.first(), pair.second());
|
||||
}
|
||||
w
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue