about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-03-15 20:15:44 -0700
committerbors <bors@rust-lang.org>2013-03-15 20:15:44 -0700
commit6f1e8ef71abb390a8f6406292ea06c729dcbf9e5 (patch)
treeeacbc64a864bd47298bdf1f2e678f096b1ea02b6 /src
parent5a77a1048897a12c9031d3e0b3867f0c6e3673ea (diff)
parentee5842494a9170d6e1079a671695fcfc32ceb920 (diff)
auto merge of #5404 : bstrie/rust/decopy, r=pcwalton
Also turn `copy` into `.clone()` in much of run-pass.
Diffstat (limited to 'src')
-rw-r--r--src/libcore/clone.rs5
-rw-r--r--src/libcore/str.rs8
-rw-r--r--src/libcore/unstable/global.rs6
-rw-r--r--src/libcore/vec.rs13
-rw-r--r--src/libstd/arc.rs20
-rw-r--r--src/libstd/sync.rs22
-rw-r--r--src/libsyntax/ext/pipes/liveness.rs2
-rw-r--r--src/test/run-pass/alt-value-binding-in-guard-3291.rs2
-rw-r--r--src/test/run-pass/assignability-trait.rs2
-rw-r--r--src/test/run-pass/block-iter-2.rs4
-rw-r--r--src/test/run-pass/block-vec-map2.rs2
-rw-r--r--src/test/run-pass/borrowck-borrow-from-expr-block.rs2
-rw-r--r--src/test/run-pass/borrowck-preserve-box-sometimes-needed.rs2
-rw-r--r--src/test/run-pass/class-exports.rs2
-rw-r--r--src/test/run-pass/class-implement-traits.rs2
-rw-r--r--src/test/run-pass/class-separate-impl.rs9
-rw-r--r--src/test/run-pass/expr-alt-generic-unique1.rs4
-rw-r--r--src/test/run-pass/expr-alt-generic-unique2.rs4
-rw-r--r--src/test/run-pass/expr-block-generic-unique1.rs4
-rw-r--r--src/test/run-pass/generic-alias-unique.rs2
-rw-r--r--src/test/run-pass/hashmap-memory.rs6
-rw-r--r--src/test/run-pass/issue-2487-a.rs2
-rw-r--r--src/test/run-pass/issue-2633-2.rs2
-rw-r--r--src/test/run-pass/issue-3389.rs2
-rw-r--r--src/test/run-pass/issue-3609.rs2
-rw-r--r--src/test/run-pass/issue-4541.rs2
-rw-r--r--src/test/run-pass/issue-4542.rs2
-rw-r--r--src/test/run-pass/istr.rs4
-rw-r--r--src/test/run-pass/last-use-in-cap-clause.rs2
-rw-r--r--src/test/run-pass/last-use-is-capture.rs4
-rw-r--r--src/test/run-pass/monad.rs4
-rw-r--r--src/test/run-pass/propagate-expected-type-through-block.rs2
-rw-r--r--src/test/run-pass/rec-auto.rs4
-rw-r--r--src/test/run-pass/reflect-visit-data.rs4
-rw-r--r--src/test/run-pass/reflect-visit-type.rs2
-rw-r--r--src/test/run-pass/ret-break-cont-in-block.rs8
-rw-r--r--src/test/run-pass/stat.rs2
-rw-r--r--src/test/run-pass/str-append.rs6
-rw-r--r--src/test/run-pass/str-concat.rs2
-rw-r--r--src/test/run-pass/syntax-extension-fmt.rs4
-rw-r--r--src/test/run-pass/trait-generic.rs2
-rw-r--r--src/test/run-pass/unique-assign-copy.rs2
-rw-r--r--src/test/run-pass/unique-decl-init-copy.rs2
-rw-r--r--src/test/run-pass/unique-in-vec-copy.rs2
-rw-r--r--src/test/run-pass/vec-ivec-deadlock.rs2
-rw-r--r--src/test/run-pass/vec-matching-fold.rs8
46 files changed, 115 insertions, 86 deletions
diff --git a/src/libcore/clone.rs b/src/libcore/clone.rs
index 297c4438039..af44f68601b 100644
--- a/src/libcore/clone.rs
+++ b/src/libcore/clone.rs
@@ -20,6 +20,11 @@ impl Clone for () {
     fn clone(&self) -> () { () }
 }
 
+impl<T:Clone> Clone for ~T {
+    #[inline(always)]
+    fn clone(&self) -> ~T { ~(**self).clone() }
+}
+
 macro_rules! clone_impl(
     ($t:ty) => {
         impl Clone for $t {
diff --git a/src/libcore/str.rs b/src/libcore/str.rs
index 430ed2d9e38..23b14e243b8 100644
--- a/src/libcore/str.rs
+++ b/src/libcore/str.rs
@@ -20,6 +20,7 @@
 use at_vec;
 use cast;
 use char;
+use clone::Clone;
 use cmp::{Equiv, TotalOrd, Ordering, Less, Equal, Greater};
 use libc;
 use option::{None, Option, Some};
@@ -2436,6 +2437,13 @@ impl OwnedStr for ~str {
     }
 }
 
+impl Clone for ~str {
+    #[inline(always)]
+    fn clone(&self) -> ~str {
+        self.to_str()  // hilarious
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use char;
diff --git a/src/libcore/unstable/global.rs b/src/libcore/unstable/global.rs
index 654bf18a5b6..d8ded635291 100644
--- a/src/libcore/unstable/global.rs
+++ b/src/libcore/unstable/global.rs
@@ -68,11 +68,11 @@ unsafe fn global_data_clone_create_<T:Owned + Clone>(
         match value {
             None => {
                 let value = create();
-                clone_value = Some(value.clone());
+                clone_value = Some((*value).clone());
                 Some(value)
             }
             Some(value) => {
-                clone_value = Some(value.clone());
+                clone_value = Some((*value).clone());
                 Some(value)
             }
         }
@@ -193,7 +193,7 @@ fn get_global_state() -> Exclusive<GlobalState> {
             // Successfully installed the global pointer
 
             // Take a handle to return
-            let clone = state.clone();
+            let clone = (*state).clone();
 
             // Install a runtime exit function to destroy the global object
             do at_exit {
diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs
index 360940236ca..f11a63a787d 100644
--- a/src/libcore/vec.rs
+++ b/src/libcore/vec.rs
@@ -15,6 +15,7 @@
 use container::{Container, Mutable};
 use cast;
 use cmp::{Eq, Equiv, Ord, TotalOrd, Ordering, Less, Equal, Greater};
+use clone::Clone;
 use iter::BaseIter;
 use iter;
 use kinds::Copy;
@@ -2501,6 +2502,18 @@ impl<A:Copy> iter::CopyableNonstrictIter<A> for @[A] {
     }
 }
 
+impl<A:Clone> Clone for ~[A] {
+    #[inline]
+    fn clone(&self) -> ~[A] {
+        let mut dolly = ~[];
+        vec::reserve(&mut dolly, self.len());
+        for self.each |item| {
+            dolly.push(item.clone());
+        }
+        return dolly;
+    }
+}
+
 // ___________________________________________________________________________
 
 #[cfg(test)]
diff --git a/src/libstd/arc.rs b/src/libstd/arc.rs
index b91af9a0069..bd2f641c017 100644
--- a/src/libstd/arc.rs
+++ b/src/libstd/arc.rs
@@ -572,7 +572,7 @@ mod tests {
     #[test] #[should_fail] #[ignore(cfg(windows))]
     pub fn test_rw_arc_poison_wr() {
         let arc = ~RWARC(1);
-        let arc2 = ~arc.clone();
+        let arc2 = (*arc).clone();
         do task::try || {
             do arc2.write |one| {
                 fail_unless!(*one == 2);
@@ -585,7 +585,7 @@ mod tests {
     #[test] #[should_fail] #[ignore(cfg(windows))]
     pub fn test_rw_arc_poison_ww() {
         let arc = ~RWARC(1);
-        let arc2 = ~arc.clone();
+        let arc2 = (*arc).clone();
         do task::try || {
             do arc2.write |one| {
                 fail_unless!(*one == 2);
@@ -598,7 +598,7 @@ mod tests {
     #[test] #[should_fail] #[ignore(cfg(windows))]
     pub fn test_rw_arc_poison_dw() {
         let arc = ~RWARC(1);
-        let arc2 = ~arc.clone();
+        let arc2 = (*arc).clone();
         do task::try || {
             do arc2.write_downgrade |write_mode| {
                 do (&write_mode).write |one| {
@@ -613,7 +613,7 @@ mod tests {
     #[test] #[ignore(cfg(windows))]
     pub fn test_rw_arc_no_poison_rr() {
         let arc = ~RWARC(1);
-        let arc2 = ~arc.clone();
+        let arc2 = (*arc).clone();
         do task::try || {
             do arc2.read |one| {
                 fail_unless!(*one == 2);
@@ -626,7 +626,7 @@ mod tests {
     #[test] #[ignore(cfg(windows))]
     pub fn test_rw_arc_no_poison_rw() {
         let arc = ~RWARC(1);
-        let arc2 = ~arc.clone();
+        let arc2 = (*arc).clone();
         do task::try || {
             do arc2.read |one| {
                 fail_unless!(*one == 2);
@@ -639,7 +639,7 @@ mod tests {
     #[test] #[ignore(cfg(windows))]
     pub fn test_rw_arc_no_poison_dr() {
         let arc = ~RWARC(1);
-        let arc2 = ~arc.clone();
+        let arc2 = (*arc).clone();
         do task::try || {
             do arc2.write_downgrade |write_mode| {
                 let read_mode = arc2.downgrade(write_mode);
@@ -655,7 +655,7 @@ mod tests {
     #[test]
     pub fn test_rw_arc() {
         let arc = ~RWARC(0);
-        let arc2 = ~arc.clone();
+        let arc2 = (*arc).clone();
         let (p,c) = comm::stream();
 
         do task::spawn || {
@@ -673,7 +673,7 @@ mod tests {
         // Readers try to catch the writer in the act
         let mut children = ~[];
         for 5.times {
-            let arc3 = ~arc.clone();
+            let arc3 = (*arc).clone();
             do task::task().future_result(|+r| children.push(r)).spawn
                 || {
                 do arc3.read |num| {
@@ -704,7 +704,7 @@ mod tests {
         for 10.times {
             let ((rp1,rc1),(rp2,rc2)) = (comm::stream(),comm::stream());
             reader_convos.push((rc1, rp2));
-            let arcn = ~arc.clone();
+            let arcn = (*arc).clone();
             do task::spawn || {
                 rp1.recv(); // wait for downgrader to give go-ahead
                 do arcn.read |state| {
@@ -715,7 +715,7 @@ mod tests {
         }
 
         // Writer task
-        let arc2 = ~arc.clone();
+        let arc2 = (*arc).clone();
         let ((wp1,wc1),(wp2,wc2)) = (comm::stream(),comm::stream());
         do task::spawn || {
             wp1.recv();
diff --git a/src/libstd/sync.rs b/src/libstd/sync.rs
index abd8bc74235..1d1ec0e11f7 100644
--- a/src/libstd/sync.rs
+++ b/src/libstd/sync.rs
@@ -827,7 +827,7 @@ mod tests {
         // "load tmp = move ptr; inc tmp; store ptr <- tmp" dance.
         let (p,c) = comm::stream();
         let m = ~Mutex();
-        let m2 = ~m.clone();
+        let m2 = m.clone();
         let mut sharedstate = ~0;
         let ptr = ptr::addr_of(&(*sharedstate));
         do task::spawn || {
@@ -1105,13 +1105,13 @@ mod tests {
         // Test mutual exclusion between readers and writers. Just like the
         // mutex mutual exclusion test, a ways above.
         let (p,c) = comm::stream();
-        let x2 = ~x.clone();
+        let x2 = (*x).clone();
         let mut sharedstate = ~0;
         let ptr = ptr::addr_of(&(*sharedstate));
         do task::spawn || {
             let sharedstate: &mut int =
                 unsafe { cast::reinterpret_cast(&ptr) };
-            access_shared(sharedstate, x2, mode1, 10);
+            access_shared(sharedstate, &x2, mode1, 10);
             c.send(());
         }
         access_shared(sharedstate, x, mode2, 10);
@@ -1150,14 +1150,14 @@ mod tests {
                                  mode2: RWlockMode,
                                  make_mode2_go_first: bool) {
         // Much like sem_multi_resource.
-        let x2 = ~x.clone();
+        let x2 = (*x).clone();
         let (p1,c1) = comm::stream();
         let (p2,c2) = comm::stream();
         do task::spawn || {
             if !make_mode2_go_first {
                 let _ = p2.recv(); // parent sends to us once it locks, or ...
             }
-            do lock_rwlock_in_mode(x2, mode2) {
+            do lock_rwlock_in_mode(&x2, mode2) {
                 if make_mode2_go_first {
                     c1.send(()); // ... we send to it once we lock
                 }
@@ -1207,7 +1207,7 @@ mod tests {
 
         // Child wakes up parent
         do x.write_cond |cond| {
-            let x2 = ~x.clone();
+            let x2 = (*x).clone();
             do task::spawn || {
                 do x2.write_cond |cond| {
                     let woken = cond.signal();
@@ -1218,7 +1218,7 @@ mod tests {
         }
         // Parent wakes up child
         let (port,chan) = comm::stream();
-        let x3 = ~x.clone();
+        let x3 = (*x).clone();
         do task::spawn || {
             do x3.write_cond |cond| {
                 chan.send(());
@@ -1253,11 +1253,11 @@ mod tests {
         let mut ports = ~[];
 
         for num_waiters.times {
-            let xi = ~x.clone();
+            let xi = (*x).clone();
             let (port, chan) = comm::stream();
             ports.push(port);
             do task::spawn || {
-                do lock_cond(xi, dg1) |cond| {
+                do lock_cond(&xi, dg1) |cond| {
                     chan.send(());
                     cond.wait();
                     chan.send(());
@@ -1289,10 +1289,10 @@ mod tests {
     pub fn rwlock_kill_helper(mode1: RWlockMode, mode2: RWlockMode) {
         // Mutex must get automatically unlocked if failed/killed within.
         let x = ~RWlock();
-        let x2 = ~x.clone();
+        let x2 = (*x).clone();
 
         let result: result::Result<(),()> = do task::try || {
-            do lock_rwlock_in_mode(x2, mode1) {
+            do lock_rwlock_in_mode(&x2, mode1) {
                 fail!();
             }
         };
diff --git a/src/libsyntax/ext/pipes/liveness.rs b/src/libsyntax/ext/pipes/liveness.rs
index 97f2e516603..15ba7f95538 100644
--- a/src/libsyntax/ext/pipes/liveness.rs
+++ b/src/libsyntax/ext/pipes/liveness.rs
@@ -63,7 +63,7 @@ pub fn analyze(proto: protocol, _cx: @ext_ctxt) {
         debug!("colive iteration %?", i);
         let mut new_colive = ~[];
         for colive.eachi |i, this_colive| {
-            let mut result = ~this_colive.clone();
+            let mut result = this_colive.clone();
             let this = proto.get_state_by_id(i);
             for this_colive.ones |j| {
                 let next = proto.get_state_by_id(j);
diff --git a/src/test/run-pass/alt-value-binding-in-guard-3291.rs b/src/test/run-pass/alt-value-binding-in-guard-3291.rs
index 5171d7d2a58..33785b2fbb0 100644
--- a/src/test/run-pass/alt-value-binding-in-guard-3291.rs
+++ b/src/test/run-pass/alt-value-binding-in-guard-3291.rs
@@ -11,7 +11,7 @@
 fn foo(x: Option<~int>, b: bool) -> int {
     match x {
       None => { 1 }
-      Some(copy x) if b => { *x }
+      Some(ref x) if b => { *x.clone() }
       Some(_) => { 0 }
     }
 }
diff --git a/src/test/run-pass/assignability-trait.rs b/src/test/run-pass/assignability-trait.rs
index 5d3ad4b3b2b..16cd51c8f27 100644
--- a/src/test/run-pass/assignability-trait.rs
+++ b/src/test/run-pass/assignability-trait.rs
@@ -43,7 +43,7 @@ pub fn main() {
     // Call a method
     for x.iterate() |y| { fail_unless!(x[*y] == *y); }
     // Call a parameterized function
-    fail_unless!(length(copy x) == vec::len(x));
+    fail_unless!(length(x.clone()) == vec::len(x));
     // Call a parameterized function, with type arguments that require
     // a borrow
     fail_unless!(length::<int, &[int]>(x) == vec::len(x));
diff --git a/src/test/run-pass/block-iter-2.rs b/src/test/run-pass/block-iter-2.rs
index 9e9eef64992..96336f5569c 100644
--- a/src/test/run-pass/block-iter-2.rs
+++ b/src/test/run-pass/block-iter-2.rs
@@ -15,8 +15,8 @@ fn iter_vec<T>(v: ~[T], f: &fn(&T)) { for v.each |x| { f(x); } }
 pub fn main() {
     let v = ~[1, 2, 3, 4, 5];
     let mut sum = 0;
-    iter_vec(copy v, |i| {
-        iter_vec(copy v, |j| {
+    iter_vec(v.clone(), |i| {
+        iter_vec(v.clone(), |j| {
             sum += *i * *j;
         });
     });
diff --git a/src/test/run-pass/block-vec-map2.rs b/src/test/run-pass/block-vec-map2.rs
index 58e09409fc5..28875da25a6 100644
--- a/src/test/run-pass/block-vec-map2.rs
+++ b/src/test/run-pass/block-vec-map2.rs
@@ -15,6 +15,6 @@ pub fn main() {
         vec::map2(~[1, 2, 3, 4, 5],
                   ~[true, false, false, true, true],
                   |i, b| if *b { -(*i) } else { *i } );
-    error!(copy v);
+    error!(v.clone());
     fail_unless!((v == ~[-1, 2, 3, -4, -5]));
 }
diff --git a/src/test/run-pass/borrowck-borrow-from-expr-block.rs b/src/test/run-pass/borrowck-borrow-from-expr-block.rs
index 0422be9d333..f2e0b6c9ca0 100644
--- a/src/test/run-pass/borrowck-borrow-from-expr-block.rs
+++ b/src/test/run-pass/borrowck-borrow-from-expr-block.rs
@@ -13,7 +13,7 @@ fn borrow(x: &int, f: &fn(x: &int)) {
 }
 
 fn test1(x: @~int) {
-    do borrow(copy *x) |p| {
+    do borrow(&*x.clone()) |p| {
         let x_a = ptr::addr_of(&(**x));
         fail_unless!((x_a as uint) != ptr::to_uint(p));
         fail_unless!(unsafe{*x_a} == *p);
diff --git a/src/test/run-pass/borrowck-preserve-box-sometimes-needed.rs b/src/test/run-pass/borrowck-preserve-box-sometimes-needed.rs
index a0f1801ce29..e3f8f98f4b6 100644
--- a/src/test/run-pass/borrowck-preserve-box-sometimes-needed.rs
+++ b/src/test/run-pass/borrowck-preserve-box-sometimes-needed.rs
@@ -13,7 +13,7 @@
 fn switcher(x: Option<@int>) {
     let mut x = x;
     match x {
-      Some(@y) => { copy y; x = None; }
+      Some(@y) => { y.clone(); x = None; }
       None => { }
     }
 }
diff --git a/src/test/run-pass/class-exports.rs b/src/test/run-pass/class-exports.rs
index afd21bdca1a..6a665f770ff 100644
--- a/src/test/run-pass/class-exports.rs
+++ b/src/test/run-pass/class-exports.rs
@@ -22,7 +22,7 @@ mod kitty {
     }
 
     pub impl cat {
-        fn get_name(&self) -> ~str { copy self.name }
+        fn get_name(&self) -> ~str { self.name.clone() }
     }
 
     pub fn cat(in_name: ~str) -> cat {
diff --git a/src/test/run-pass/class-implement-traits.rs b/src/test/run-pass/class-implement-traits.rs
index 9e6637c9b17..7cd2753ee15 100644
--- a/src/test/run-pass/class-implement-traits.rs
+++ b/src/test/run-pass/class-implement-traits.rs
@@ -53,7 +53,7 @@ fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat {
     cat {
         meows: in_x,
         how_hungry: in_y,
-        name: copy in_name
+        name: in_name.clone()
     }
 }
 
diff --git a/src/test/run-pass/class-separate-impl.rs b/src/test/run-pass/class-separate-impl.rs
index 7cba1456ee7..bb07597a188 100644
--- a/src/test/run-pass/class-separate-impl.rs
+++ b/src/test/run-pass/class-separate-impl.rs
@@ -9,8 +9,6 @@
 // except according to those terms.
 
 // xfail-fast
-use core::to_str::*;
-
 struct cat {
     priv meows : uint,
 
@@ -53,7 +51,12 @@ fn cat(in_x : uint, in_y : int, in_name: ~str) -> cat {
 }
 
 impl ToStr for cat {
-  pure fn to_str(&self) -> ~str { copy self.name }
+    pure fn to_str(&self) -> ~str {
+        // FIXME #5384: this unsafe block is to work around purity
+        unsafe {
+            self.name.clone()
+        }
+    }
 }
 
 fn print_out(thing: @ToStr, expected: ~str) {
diff --git a/src/test/run-pass/expr-alt-generic-unique1.rs b/src/test/run-pass/expr-alt-generic-unique1.rs
index b24ac9de009..74a88bb5c87 100644
--- a/src/test/run-pass/expr-alt-generic-unique1.rs
+++ b/src/test/run-pass/expr-alt-generic-unique1.rs
@@ -13,9 +13,9 @@
 // -*- rust -*-
 type compare<T> = @fn(~T, ~T) -> bool;
 
-fn test_generic<T:Copy>(expected: ~T, eq: compare<T>) {
+fn test_generic<T:Copy+Clone>(expected: ~T, eq: compare<T>) {
     let actual: ~T = match true {
-        true => { copy expected },
+        true => { expected.clone() },
         _ => fail!(~"wat")
     };
     fail_unless!((eq(expected, actual)));
diff --git a/src/test/run-pass/expr-alt-generic-unique2.rs b/src/test/run-pass/expr-alt-generic-unique2.rs
index 7bbd0bfc380..c9efe753f57 100644
--- a/src/test/run-pass/expr-alt-generic-unique2.rs
+++ b/src/test/run-pass/expr-alt-generic-unique2.rs
@@ -13,9 +13,9 @@
 
 type compare<T> = @fn(T, T) -> bool;
 
-fn test_generic<T:Copy>(expected: T, eq: compare<T>) {
+fn test_generic<T:Copy+Clone>(expected: T, eq: compare<T>) {
     let actual: T = match true {
-        true => copy expected,
+        true => expected.clone(),
         _ => fail!(~"wat")
     };
     fail_unless!((eq(expected, actual)));
diff --git a/src/test/run-pass/expr-block-generic-unique1.rs b/src/test/run-pass/expr-block-generic-unique1.rs
index b186d99a6df..a9fe128661d 100644
--- a/src/test/run-pass/expr-block-generic-unique1.rs
+++ b/src/test/run-pass/expr-block-generic-unique1.rs
@@ -13,8 +13,8 @@
 // -*- rust -*-
 type compare<T> = @fn(~T, ~T) -> bool;
 
-fn test_generic<T:Copy>(expected: ~T, eq: compare<T>) {
-    let actual: ~T = { copy expected };
+fn test_generic<T:Copy+Clone>(expected: ~T, eq: compare<T>) {
+    let actual: ~T = { expected.clone() };
     fail_unless!((eq(expected, actual)));
 }
 
diff --git a/src/test/run-pass/generic-alias-unique.rs b/src/test/run-pass/generic-alias-unique.rs
index 7e0b32d8e8f..287fc260bf8 100644
--- a/src/test/run-pass/generic-alias-unique.rs
+++ b/src/test/run-pass/generic-alias-unique.rs
@@ -14,7 +14,7 @@ fn id<T:Copy + Owned>(t: T) -> T { return t; }
 
 pub fn main() {
     let expected = ~100;
-    let actual = id::<~int>(copy expected);
+    let actual = id::<~int>(expected.clone());
     debug!(*actual);
     fail_unless!((*expected == *actual));
 }
diff --git a/src/test/run-pass/hashmap-memory.rs b/src/test/run-pass/hashmap-memory.rs
index 92546412120..5d8ac2f1ab5 100644
--- a/src/test/run-pass/hashmap-memory.rs
+++ b/src/test/run-pass/hashmap-memory.rs
@@ -38,8 +38,8 @@ mod map_reduce {
     fn start_mappers(ctrl: SharedChan<ctrl_proto>, inputs: ~[~str]) {
         for inputs.each |i| {
             let ctrl = ctrl.clone();
-            let i = copy *i;
-            task::spawn(|| map_task(ctrl.clone(), copy i) );
+            let i = i.clone();
+            task::spawn(|| map_task(ctrl.clone(), i.clone()) );
         }
     }
 
@@ -79,7 +79,7 @@ mod map_reduce {
 
         reducers = oldmap::HashMap();
 
-        start_mappers(ctrl_chan, copy inputs);
+        start_mappers(ctrl_chan, inputs.clone());
 
         let mut num_mappers = vec::len(inputs) as int;
 
diff --git a/src/test/run-pass/issue-2487-a.rs b/src/test/run-pass/issue-2487-a.rs
index 59986638088..388160e538a 100644
--- a/src/test/run-pass/issue-2487-a.rs
+++ b/src/test/run-pass/issue-2487-a.rs
@@ -20,7 +20,7 @@ impl Drop for socket {
 pub impl socket {
     fn set_identity(&self)  {
         do closure {
-            setsockopt_bytes(copy self.sock)
+            setsockopt_bytes(self.sock.clone())
         }
     }
 }
diff --git a/src/test/run-pass/issue-2633-2.rs b/src/test/run-pass/issue-2633-2.rs
index 5c3a2f0a4f6..2c3b4b71bb8 100644
--- a/src/test/run-pass/issue-2633-2.rs
+++ b/src/test/run-pass/issue-2633-2.rs
@@ -14,5 +14,5 @@ fn a_val(&&x: ~int, +y: ~int) -> int {
 
 pub fn main() {
     let z = ~22;
-    a_val(copy z, copy z);
+    a_val(z.clone(), z.clone());
 }
diff --git a/src/test/run-pass/issue-3389.rs b/src/test/run-pass/issue-3389.rs
index 55558670734..6203f14f10f 100644
--- a/src/test/run-pass/issue-3389.rs
+++ b/src/test/run-pass/issue-3389.rs
@@ -27,6 +27,6 @@ pub fn main() {
     let v = ~[~"123", ~"abc"];
     node.content = ~[~"123", ~"abc"];
     print_str_vector(v);
-    print_str_vector(copy node.content);
+    print_str_vector(node.content.clone());
 
 }
diff --git a/src/test/run-pass/issue-3609.rs b/src/test/run-pass/issue-3609.rs
index d0afd0107ee..fc6ceb4130f 100644
--- a/src/test/run-pass/issue-3609.rs
+++ b/src/test/run-pass/issue-3609.rs
@@ -19,7 +19,7 @@ fn foo(name: ~str, samples_chan: Chan<Msg>) {
                 for uint::range(0, buffer.len())
                     |i| {error!("%?: %f", i, buffer[i])}
             };
-        samples_chan.send(GetSamples(copy name, callback));
+        samples_chan.send(GetSamples(name.clone(), callback));
     };
 }
 
diff --git a/src/test/run-pass/issue-4541.rs b/src/test/run-pass/issue-4541.rs
index fdc2cc1b013..37e91cf1eb2 100644
--- a/src/test/run-pass/issue-4541.rs
+++ b/src/test/run-pass/issue-4541.rs
@@ -14,7 +14,7 @@ fn parse_args() -> ~str {
     let mut n = 0;
 
     while n < args.len() {
-        match copy args[n] {
+        match args[n].clone() {
             ~"-v" => (),
             s => {
                 return s;
diff --git a/src/test/run-pass/issue-4542.rs b/src/test/run-pass/issue-4542.rs
index f708b099c37..a5e5b10d076 100644
--- a/src/test/run-pass/issue-4542.rs
+++ b/src/test/run-pass/issue-4542.rs
@@ -11,7 +11,7 @@
 // xfail-test
 pub fn main() {
     for os::args().each |arg| {
-        match copy *arg {
+        match arg.clone() {
             s => { }
         }
     }
diff --git a/src/test/run-pass/istr.rs b/src/test/run-pass/istr.rs
index 35c46609f8f..e6e39311626 100644
--- a/src/test/run-pass/istr.rs
+++ b/src/test/run-pass/istr.rs
@@ -10,7 +10,7 @@
 
 fn test_stack_assign() {
     let s: ~str = ~"a";
-    debug!(copy s);
+    debug!(s.clone());
     let t: ~str = ~"a";
     fail_unless!((s == t));
     let u: ~str = ~"b";
@@ -49,7 +49,7 @@ fn test_append() {
 
     let mut s = ~"a";
     s += ~"b";
-    debug!(copy s);
+    debug!(s.clone());
     fail_unless!((s == ~"ab"));
 
     let mut s = ~"c";
diff --git a/src/test/run-pass/last-use-in-cap-clause.rs b/src/test/run-pass/last-use-in-cap-clause.rs
index 40075e12f4b..3d121d08745 100644
--- a/src/test/run-pass/last-use-in-cap-clause.rs
+++ b/src/test/run-pass/last-use-in-cap-clause.rs
@@ -14,7 +14,7 @@ struct A { a: ~int }
 
 fn foo() -> @fn() -> int {
     let k = ~22;
-    let _u = A {a: copy k};
+    let _u = A {a: k.clone()};
     let result: @fn() -> int = || 22;
     result
 }
diff --git a/src/test/run-pass/last-use-is-capture.rs b/src/test/run-pass/last-use-is-capture.rs
index e05d483f486..2c62b6894d0 100644
--- a/src/test/run-pass/last-use-is-capture.rs
+++ b/src/test/run-pass/last-use-is-capture.rs
@@ -15,6 +15,6 @@ struct A { a: ~int }
 pub fn main() {
     fn invoke(f: @fn()) { f(); }
     let k = ~22;
-    let _u = A {a: copy k};
-    invoke(|| error!(copy k) )
+    let _u = A {a: k.clone()};
+    invoke(|| error!(k.clone()) )
 }
diff --git a/src/test/run-pass/monad.rs b/src/test/run-pass/monad.rs
index 5f3afee693f..f046adc30b4 100644
--- a/src/test/run-pass/monad.rs
+++ b/src/test/run-pass/monad.rs
@@ -43,7 +43,7 @@ pub fn main() {
     fail_unless!(transform(Some(10)) == Some(~"11"));
     fail_unless!(transform(None) == None);
     fail_unless!((~[~"hi"])
-        .bind(|x| ~[copy *x, *x + ~"!"] )
-        .bind(|x| ~[copy *x, *x + ~"?"] ) ==
+        .bind(|x| ~[x.clone(), *x + ~"!"] )
+        .bind(|x| ~[x.clone(), *x + ~"?"] ) ==
         ~[~"hi", ~"hi?", ~"hi!", ~"hi!?"]);
 }
diff --git a/src/test/run-pass/propagate-expected-type-through-block.rs b/src/test/run-pass/propagate-expected-type-through-block.rs
index 20a6d130774..c68771e4a94 100644
--- a/src/test/run-pass/propagate-expected-type-through-block.rs
+++ b/src/test/run-pass/propagate-expected-type-through-block.rs
@@ -5,7 +5,7 @@
 pub fn main() {
     let y = ~3;
     let foo: @fn(&int) -> int = {
-        let y = copy y;
+        let y = y.clone();
         |x| *x + *y
     };
     fail_unless!(foo(@22) == 25);
diff --git a/src/test/run-pass/rec-auto.rs b/src/test/run-pass/rec-auto.rs
index fbbec638dd4..62cb3296f60 100644
--- a/src/test/run-pass/rec-auto.rs
+++ b/src/test/run-pass/rec-auto.rs
@@ -19,6 +19,6 @@ struct X { foo: ~str, bar: ~str }
 
 pub fn main() {
     let x = X {foo: ~"hello", bar: ~"world"};
-    debug!(copy x.foo);
-    debug!(copy x.bar);
+    debug!(x.foo.clone());
+    debug!(x.bar.clone());
 }
diff --git a/src/test/run-pass/reflect-visit-data.rs b/src/test/run-pass/reflect-visit-data.rs
index 78e1dd31e1a..9f093812d8a 100644
--- a/src/test/run-pass/reflect-visit-data.rs
+++ b/src/test/run-pass/reflect-visit-data.rs
@@ -647,10 +647,10 @@ pub fn main() {
         let v = @v as @TyVisitor;
         visit_tydesc(td, v);
 
-        for (copy u.vals).each |s| {
+        for (u.vals.clone()).each |s| {
             io::println(fmt!("val: %s", *s));
         }
-        error!("%?", copy u.vals);
+        error!("%?", u.vals.clone());
         fail_unless!(u.vals == ~[
             ~"1", ~"2", ~"3", ~"true", ~"false", ~"5", ~"4", ~"3", ~"12"
         ]);
diff --git a/src/test/run-pass/reflect-visit-type.rs b/src/test/run-pass/reflect-visit-type.rs
index bc67ece79de..6576a6c3fa9 100644
--- a/src/test/run-pass/reflect-visit-type.rs
+++ b/src/test/run-pass/reflect-visit-type.rs
@@ -150,7 +150,7 @@ pub fn main() {
     visit_ty::<i16>(vv);
     visit_ty::<~[int]>(vv);
 
-    for (copy v.types).each {|s|
+    for (v.types.clone()).each {|s|
         io::println(fmt!("type: %s", s));
     }
     fail_unless!(v.types == ["bool", "int", "i8", "i16",
diff --git a/src/test/run-pass/ret-break-cont-in-block.rs b/src/test/run-pass/ret-break-cont-in-block.rs
index 6fe75758842..6fe5831644f 100644
--- a/src/test/run-pass/ret-break-cont-in-block.rs
+++ b/src/test/run-pass/ret-break-cont-in-block.rs
@@ -20,9 +20,9 @@ fn iter<T>(v: ~[T], it: &fn(&T) -> bool) {
     }
 }
 
-fn find_pos<T:Eq + Copy>(n: T, h: ~[T]) -> Option<uint> {
+fn find_pos<T:Eq + Copy + Clone>(n: T, h: ~[T]) -> Option<uint> {
     let mut i = 0u;
-    for iter(copy h) |e| {
+    for iter(h.clone()) |e| {
         if *e == n { return Some(i); }
         i += 1u;
     }
@@ -31,8 +31,8 @@ fn find_pos<T:Eq + Copy>(n: T, h: ~[T]) -> Option<uint> {
 
 fn bail_deep(x: ~[~[bool]]) {
     let mut seen = false;
-    for iter(copy x) |x| {
-        for iter(copy *x) |x| {
+    for iter(x.clone()) |x| {
+        for iter(x.clone()) |x| {
             fail_unless!(!seen);
             if *x { seen = true; return; }
         }
diff --git a/src/test/run-pass/stat.rs b/src/test/run-pass/stat.rs
index 1613eec7405..f2e12294b09 100644
--- a/src/test/run-pass/stat.rs
+++ b/src/test/run-pass/stat.rs
@@ -20,7 +20,7 @@ pub fn main() {
 
     {
         match io::file_writer(&path, [io::Create, io::Truncate]) {
-            Err(copy e) => fail!(e),
+            Err(ref e) => fail!(e.clone()),
             Ok(f) => {
                 for uint::range(0, 1000) |_i| {
                     f.write_u8(0);
diff --git a/src/test/run-pass/str-append.rs b/src/test/run-pass/str-append.rs
index 230af83d1e1..d1592c46dc9 100644
--- a/src/test/run-pass/str-append.rs
+++ b/src/test/run-pass/str-append.rs
@@ -16,7 +16,7 @@ extern mod std;
 fn test1() {
     let mut s: ~str = ~"hello";
     s += ~"world";
-    debug!(copy s);
+    debug!(s.clone());
     fail_unless!((s[9] == 'd' as u8));
 }
 
@@ -26,8 +26,8 @@ fn test2() {
     let ff: ~str = ~"abc";
     let a: ~str = ff + ~"ABC" + ff;
     let b: ~str = ~"ABC" + ff + ~"ABC";
-    debug!(copy a);
-    debug!(copy b);
+    debug!(a.clone());
+    debug!(b.clone());
     fail_unless!((a == ~"abcABCabc"));
     fail_unless!((b == ~"ABCabcABC"));
 }
diff --git a/src/test/run-pass/str-concat.rs b/src/test/run-pass/str-concat.rs
index a91f5034f6b..107998d3def 100644
--- a/src/test/run-pass/str-concat.rs
+++ b/src/test/run-pass/str-concat.rs
@@ -16,6 +16,6 @@ pub fn main() {
     let a: ~str = ~"hello";
     let b: ~str = ~"world";
     let s: ~str = a + b;
-    debug!(copy s);
+    debug!(s.clone());
     fail_unless!((s[9] == 'd' as u8));
 }
diff --git a/src/test/run-pass/syntax-extension-fmt.rs b/src/test/run-pass/syntax-extension-fmt.rs
index 1336009eca8..3af58274bfb 100644
--- a/src/test/run-pass/syntax-extension-fmt.rs
+++ b/src/test/run-pass/syntax-extension-fmt.rs
@@ -11,8 +11,8 @@
 extern mod std;
 
 fn test(actual: ~str, expected: ~str) {
-    debug!(copy actual);
-    debug!(copy expected);
+    debug!(actual.clone());
+    debug!(expected.clone());
     fail_unless!((actual == expected));
 }
 
diff --git a/src/test/run-pass/trait-generic.rs b/src/test/run-pass/trait-generic.rs
index 72fcb1970c6..c11ece62813 100644
--- a/src/test/run-pass/trait-generic.rs
+++ b/src/test/run-pass/trait-generic.rs
@@ -17,7 +17,7 @@ impl to_str for int {
     fn to_str(&self) -> ~str { int::to_str(*self) }
 }
 impl to_str for ~str {
-    fn to_str(&self) -> ~str { copy *self }
+    fn to_str(&self) -> ~str { self.clone() }
 }
 impl to_str for () {
     fn to_str(&self) -> ~str { ~"()" }
diff --git a/src/test/run-pass/unique-assign-copy.rs b/src/test/run-pass/unique-assign-copy.rs
index 340a247c241..8ecff0719a2 100644
--- a/src/test/run-pass/unique-assign-copy.rs
+++ b/src/test/run-pass/unique-assign-copy.rs
@@ -12,7 +12,7 @@ pub fn main() {
     let mut i = ~1;
     // Should be a copy
     let mut j;
-    j = copy i;
+    j = i.clone();
     *i = 2;
     *j = 3;
     fail_unless!(*i == 2);
diff --git a/src/test/run-pass/unique-decl-init-copy.rs b/src/test/run-pass/unique-decl-init-copy.rs
index 2d15f09021e..177b3ed5c24 100644
--- a/src/test/run-pass/unique-decl-init-copy.rs
+++ b/src/test/run-pass/unique-decl-init-copy.rs
@@ -11,7 +11,7 @@
 pub fn main() {
     let mut i = ~1;
     // Should be a copy
-    let mut j = copy i;
+    let mut j = i.clone();
     *i = 2;
     *j = 3;
     fail_unless!(*i == 2);
diff --git a/src/test/run-pass/unique-in-vec-copy.rs b/src/test/run-pass/unique-in-vec-copy.rs
index 95b95913e98..1033fa1c22c 100644
--- a/src/test/run-pass/unique-in-vec-copy.rs
+++ b/src/test/run-pass/unique-in-vec-copy.rs
@@ -10,7 +10,7 @@
 
 pub fn main() {
     let mut a = ~[~10];
-    let b = copy a;
+    let b = a.clone();
 
     fail_unless!(*a[0] == 10);
     fail_unless!(*b[0] == 10);
diff --git a/src/test/run-pass/vec-ivec-deadlock.rs b/src/test/run-pass/vec-ivec-deadlock.rs
index 505b57ec7bb..8b6e037e840 100644
--- a/src/test/run-pass/vec-ivec-deadlock.rs
+++ b/src/test/run-pass/vec-ivec-deadlock.rs
@@ -10,6 +10,6 @@
 
 pub fn main() {
     let a = ~[1, 2, 3, 4, 5];
-    let mut b = ~[copy a, copy a];
+    let mut b = ~[a.clone(), a.clone()];
     b = b + b; // FIXME(#3387)---can't write b += b
 }
diff --git a/src/test/run-pass/vec-matching-fold.rs b/src/test/run-pass/vec-matching-fold.rs
index 1df90bf681c..dfd4f025c13 100644
--- a/src/test/run-pass/vec-matching-fold.rs
+++ b/src/test/run-pass/vec-matching-fold.rs
@@ -1,4 +1,4 @@
-fn foldl<T, U: Copy>(
+fn foldl<T, U: Copy+Clone>(
     values: &[T],
     initial: U,
     function: &fn(partial: U, element: &T) -> U
@@ -6,11 +6,11 @@ fn foldl<T, U: Copy>(
     match values {
         [head, ..tail] =>
             foldl(tail, function(initial, &head), function),
-        [] => copy initial
+        [] => initial.clone()
     }
 }
 
-fn foldr<T, U: Copy>(
+fn foldr<T, U: Copy+Clone>(
     values: &[T],
     initial: U,
     function: &fn(element: &T, partial: U) -> U
@@ -18,7 +18,7 @@ fn foldr<T, U: Copy>(
     match values {
         [..head, tail] =>
             foldr(head, function(&tail, initial), function),
-        [] => copy initial
+        [] => initial.clone()
     }
 }