diff options
| author | bors <bors@rust-lang.org> | 2013-07-08 18:49:46 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-07-08 18:49:46 -0700 |
| commit | a48ca3290df992fde2f74ccf5b9f4e36563af8da (patch) | |
| tree | 816142177cf53d6185626aee592ef837b5e1d93a /src/libextra | |
| parent | 30c8aac677a754e0d4ebc16f261618f15d15a6e2 (diff) | |
| parent | 0c6d02f391aa668b2ead91e8a4ed545475ac2c90 (diff) | |
| download | rust-a48ca3290df992fde2f74ccf5b9f4e36563af8da.tar.gz rust-a48ca3290df992fde2f74ccf5b9f4e36563af8da.zip | |
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
Diffstat (limited to 'src/libextra')
| -rw-r--r-- | src/libextra/fileinput.rs | 17 | ||||
| -rw-r--r-- | src/libextra/num/bigint.rs | 12 | ||||
| -rw-r--r-- | src/libextra/rc.rs | 2 | ||||
| -rw-r--r-- | src/libextra/term.rs | 4 | ||||
| -rw-r--r-- | src/libextra/terminfo/parm.rs | 4 | ||||
| -rw-r--r-- | src/libextra/treemap.rs | 10 | ||||
| -rw-r--r-- | src/libextra/workcache.rs | 4 |
7 files changed, 27 insertions, 26 deletions
diff --git a/src/libextra/fileinput.rs b/src/libextra/fileinput.rs index f91260f4752..27c8051afac 100644 --- a/src/libextra/fileinput.rs +++ b/src/libextra/fileinput.rs @@ -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); diff --git a/src/libextra/num/bigint.rs b/src/libextra/num/bigint.rs index a0b95924e09..5867b13f556 100644 --- a/src/libextra/num/bigint.rs +++ b/src/libextra/num/bigint.rs @@ -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()); } } diff --git a/src/libextra/rc.rs b/src/libextra/rc.rs index 86080b343c7..7cc8bca8910 100644 --- a/src/libextra/rc.rs +++ b/src/libextra/rc.rs @@ -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) } } diff --git a/src/libextra/term.rs b/src/libextra/term.rs index 55626622775..cd226e2ad32 100644 --- a/src/libextra/term.rs +++ b/src/libextra/term.rs @@ -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()); diff --git a/src/libextra/terminfo/parm.rs b/src/libextra/terminfo/parm.rs index b7d21ea0ee3..f25d192cc0a 100644 --- a/src/libextra/terminfo/parm.rs +++ b/src/libextra/terminfo/parm.rs @@ -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| { diff --git a/src/libextra/treemap.rs b/src/libextra/treemap.rs index a5f7479d41a..f2dea8b9bba 100644 --- a/src/libextra/treemap.rs +++ b/src/libextra/treemap.rs @@ -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; } diff --git a/src/libextra/workcache.rs b/src/libextra/workcache.rs index 503bd05b733..e7bec2fbd8d 100644 --- a/src/libextra/workcache.rs +++ b/src/libextra/workcache.rs @@ -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 } |
