From 9e1c9be16f9140e09f26de947fddf806c27a957f Mon Sep 17 00:00:00 2001
From: Patrick Walton <pcwalton@mimiga.net>
Date: Wed, 28 Nov 2012 15:42:16 -0800
Subject: [PATCH] librustc: Make the Drop trait use explicit self

---
 src/libcore/ops.rs                            |  2 +-
 src/librustc/middle/trans/expr.rs             |  2 +-
 src/librustc/middle/trans/glue.rs             | 35 ++++++++++++++----
 src/librustc/middle/trans/machine.rs          |  2 +-
 src/librustc/middle/trans/type_of.rs          |  2 +-
 src/librustc/middle/ty.rs                     | 36 +++++++++++++++----
 src/libstd/arc.rs                             |  2 +-
 src/libstd/arena.rs                           |  2 +-
 src/libstd/c_vec.rs                           | 10 +++---
 src/libstd/future.rs                          |  2 +-
 src/libstd/net_tcp.rs                         |  8 ++---
 src/libstd/sort.rs                            |  2 +-
 src/libstd/sync.rs                            | 18 +++++-----
 src/test/auxiliary/issue-2526.rs              |  4 +--
 src/test/auxiliary/issue-3012-1.rs            |  2 +-
 src/test/auxiliary/issue2170lib.rs            |  2 +-
 src/test/auxiliary/test_comm.rs               |  2 +-
 src/test/bench/task-perf-alloc-unwind.rs      |  2 +-
 ...her-can-live-while-the-other-survives-1.rs |  2 +-
 ...her-can-live-while-the-other-survives-2.rs |  2 +-
 ...her-can-live-while-the-other-survives-3.rs |  2 +-
 ...her-can-live-while-the-other-survives-4.rs |  2 +-
 .../compile-fail/bind-by-move-no-lvalues-1.rs |  2 +-
 .../compile-fail/bind-by-move-no-lvalues-2.rs |  2 +-
 .../bind-by-move-no-sub-bindings.rs           |  2 +-
 .../block-must-not-have-result-res.rs         |  2 +-
 .../borrowck-borrowed-uniq-rvalue-2.rs        |  2 +-
 .../compile-fail/borrowck-unary-move-2.rs     |  2 +-
 .../compile-fail/cap-clause-illegal-cap.rs    |  2 +-
 src/test/compile-fail/copy-a-resource.rs      |  2 +-
 ...lowed-deconstructing-destructing-struct.rs |  2 +-
 src/test/compile-fail/drop-on-non-struct.rs   |  2 +-
 .../compile-fail/explicit-call-to-dtor.rs     |  2 +-
 .../explicit-call-to-supertrait-dtor.rs       |  2 +-
 .../compile-fail/functional-struct-update.rs  |  2 +-
 src/test/compile-fail/issue-2487-b.rs         |  2 +-
 src/test/compile-fail/issue-2548.rs           |  2 +-
 src/test/compile-fail/issue-2587-2.rs         |  2 +-
 src/test/compile-fail/issue-2823.rs           |  2 +-
 src/test/compile-fail/issue-3214.rs           |  2 +-
 src/test/compile-fail/liveness-unused.rs      |  2 +-
 src/test/compile-fail/no-send-res-ports.rs    |  2 +-
 src/test/compile-fail/non-const.rs            |  4 +--
 src/test/compile-fail/noncopyable-class.rs    |  2 +-
 src/test/compile-fail/pinned-deep-copy.rs     |  2 +-
 src/test/compile-fail/record-with-resource.rs |  2 +-
 src/test/compile-fail/regions-in-rsrcs.rs     |  6 ++--
 .../compile-fail/repeat-to-run-dtor-twice.rs  |  2 +-
 .../compile-fail/unique-object-noncopyable.rs |  2 +-
 src/test/compile-fail/unique-pinned-nocopy.rs |  2 +-
 src/test/compile-fail/unique-vec-res.rs       |  2 +-
 src/test/compile-fail/vec-res-add.rs          |  2 +-
 src/test/run-fail/issue-2061.rs               |  2 +-
 src/test/run-fail/morestack2.rs               |  2 +-
 src/test/run-fail/morestack3.rs               |  2 +-
 src/test/run-fail/morestack4.rs               |  2 +-
 src/test/run-fail/rt-set-exit-status-fail2.rs |  2 +-
 src/test/run-fail/unwind-box-res.rs           |  2 +-
 src/test/run-fail/unwind-resource-fail3.rs    |  2 +-
 src/test/run-pass/class-attributes-1.rs       |  2 +-
 src/test/run-pass/class-attributes-2.rs       |  2 +-
 src/test/run-pass/class-dtor.rs               |  2 +-
 src/test/run-pass/drop-trait-generic.rs       |  2 +-
 src/test/run-pass/drop-trait.rs               |  2 +-
 src/test/run-pass/init-res-into-things.rs     |  2 +-
 src/test/run-pass/issue-2487-a.rs             |  2 +-
 src/test/run-pass/issue-2708.rs               |  2 +-
 src/test/run-pass/issue-2718.rs               |  4 +--
 src/test/run-pass/issue-2735-2.rs             |  2 +-
 src/test/run-pass/issue-2735-3.rs             |  2 +-
 src/test/run-pass/issue-2895.rs               |  2 +-
 src/test/run-pass/issue-3220.rs               |  2 +-
 src/test/run-pass/issue-979.rs                |  2 +-
 src/test/run-pass/option-unwrap.rs            |  2 +-
 .../run-pass/pipe-presentation-examples.rs    |  2 +-
 .../run-pass/resource-assign-is-not-copy.rs   |  2 +-
 src/test/run-pass/resource-cycle.rs           |  2 +-
 src/test/run-pass/resource-cycle2.rs          |  2 +-
 src/test/run-pass/resource-cycle3.rs          |  2 +-
 src/test/run-pass/resource-destruct.rs        |  2 +-
 src/test/run-pass/resource-generic.rs         |  2 +-
 src/test/run-pass/resource-in-struct.rs       |  2 +-
 src/test/run-pass/send-resource.rs            |  2 +-
 src/test/run-pass/struct-literal-dtor.rs      |  2 +-
 src/test/run-pass/task-compare.rs             |  2 +-
 src/test/run-pass/task-killjoin-rsrc.rs       |  2 +-
 src/test/run-pass/type-param-constraints.rs   |  2 +-
 src/test/run-pass/unique-pinned-nocopy-2.rs   |  2 +-
 src/test/run-pass/unwind-resource.rs          |  2 +-
 src/test/run-pass/unwind-resource2.rs         |  2 +-
 src/test/run-pass/vec-slice-drop.rs           |  2 +-
 91 files changed, 166 insertions(+), 123 deletions(-)

diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs
index 87c165266f8..5c56ed7608f 100644
--- a/src/libcore/ops.rs
+++ b/src/libcore/ops.rs
@@ -25,7 +25,7 @@ pub trait Owned {
 
 #[lang="drop"]
 pub trait Drop {
-    fn finalize();  // XXX: Rename to "drop"? --pcwalton
+    fn finalize(&self);  // XXX: Rename to "drop"? --pcwalton
 }
 
 #[lang="add"]
diff --git a/src/librustc/middle/trans/expr.rs b/src/librustc/middle/trans/expr.rs
index 721e4fddb4c..36696594e42 100644
--- a/src/librustc/middle/trans/expr.rs
+++ b/src/librustc/middle/trans/expr.rs
@@ -888,7 +888,7 @@ fn with_field_tys<R>(tcx: ty::ctxt,
         }
 
         ty::ty_class(did, ref substs) => {
-            let has_dtor = ty::ty_dtor(tcx, did).is_some();
+            let has_dtor = ty::ty_dtor(tcx, did).is_present();
             op(has_dtor, class_items_as_mutable_fields(tcx, did, substs))
         }
 
diff --git a/src/librustc/middle/trans/glue.rs b/src/librustc/middle/trans/glue.rs
index 76d5770ac3d..0a44028c7df 100644
--- a/src/librustc/middle/trans/glue.rs
+++ b/src/librustc/middle/trans/glue.rs
@@ -397,8 +397,14 @@ fn make_free_glue(bcx: block, v: ValueRef, t: ty::t) {
       }
       ty::ty_class(did, ref substs) => {
         // Call the dtor if there is one
-        do option::map_default(&ty::ty_dtor(bcx.tcx(), did), bcx) |dt_id| {
-            trans_class_drop(bcx, v, *dt_id, did, substs)
+        match ty::ty_dtor(bcx.tcx(), did) {
+            ty::NoDtor => bcx,
+            ty::LegacyDtor(ref dt_id) => {
+                trans_class_drop(bcx, v, *dt_id, did, substs, false)
+            }
+            ty::TraitDtor(ref dt_id) => {
+                trans_class_drop(bcx, v, *dt_id, did, substs, true)
+            }
         }
       }
       _ => bcx
@@ -410,7 +416,8 @@ fn trans_class_drop(bcx: block,
                     v0: ValueRef,
                     dtor_did: ast::def_id,
                     class_did: ast::def_id,
-                    substs: &ty::substs) -> block {
+                    substs: &ty::substs,
+                    take_ref: bool) -> block {
     let drop_flag = GEPi(bcx, v0, struct_dtor());
     do with_cond(bcx, IsNotNull(bcx, Load(bcx, drop_flag))) |cx| {
         let mut bcx = cx;
@@ -427,7 +434,18 @@ fn trans_class_drop(bcx: block,
         // just consist of the output pointer and the environment
         // (self)
         assert(params.len() == 2);
-        let self_arg = PointerCast(bcx, v0, params[1]);
+
+        // If we need to take a reference to the class (because it's using
+        // the Drop trait), do so now.
+        let llval;
+        if take_ref {
+            llval = alloca(bcx, val_ty(v0));
+            Store(bcx, v0, llval);
+        } else {
+            llval = v0;
+        }
+
+        let self_arg = PointerCast(bcx, llval, params[1]);
         let args = ~[bcx.fcx.llretptr, self_arg];
         Call(bcx, dtor_addr, args);
 
@@ -465,10 +483,13 @@ fn make_drop_glue(bcx: block, v0: ValueRef, t: ty::t) {
       ty::ty_class(did, ref substs) => {
         let tcx = bcx.tcx();
         match ty::ty_dtor(tcx, did) {
-          Some(dtor) => {
-            trans_class_drop(bcx, v0, dtor, did, substs)
+          ty::TraitDtor(dtor) => {
+            trans_class_drop(bcx, v0, dtor, did, substs, true)
           }
-          None => {
+          ty::LegacyDtor(dtor) => {
+            trans_class_drop(bcx, v0, dtor, did, substs, false)
+          }
+          ty::NoDtor => {
             // No dtor? Just the default case
             iter_structural_ty(bcx, v0, t, drop_ty)
           }
diff --git a/src/librustc/middle/trans/machine.rs b/src/librustc/middle/trans/machine.rs
index 5515d80f4bd..6f6a5c52ecd 100644
--- a/src/librustc/middle/trans/machine.rs
+++ b/src/librustc/middle/trans/machine.rs
@@ -27,7 +27,7 @@ pub fn simplify_type(tcx: ty::ctxt, typ: ty::t) -> ty::t {
           // Reduce a class type to a record type in which all the fields are
           // simplified
           ty::ty_class(did, ref substs) => {
-            let simpl_fields = (if ty::ty_dtor(tcx, did).is_some() {
+            let simpl_fields = (if ty::ty_dtor(tcx, did).is_present() {
                 // remember the drop flag
                   ~[{ident: syntax::parse::token::special_idents::dtor,
                      mt: {ty: ty::mk_u8(tcx),
diff --git a/src/librustc/middle/trans/type_of.rs b/src/librustc/middle/trans/type_of.rs
index 604bad2312f..9251b315684 100644
--- a/src/librustc/middle/trans/type_of.rs
+++ b/src/librustc/middle/trans/type_of.rs
@@ -199,7 +199,7 @@ fn type_of(cx: @crate_ctxt, t: ty::t) -> TypeRef {
 
         // include a byte flag if there is a dtor so that we know when we've
         // been dropped
-        if ty::ty_dtor(cx.tcx, did) != None {
+        if ty::ty_dtor(cx.tcx, did).is_present() {
             common::set_struct_body(llty, ~[T_struct(tys), T_i8()]);
         } else {
             common::set_struct_body(llty, ~[T_struct(tys)]);
diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs
index 520875f3b15..b37fbd9feb4 100644
--- a/src/librustc/middle/ty.rs
+++ b/src/librustc/middle/ty.rs
@@ -75,6 +75,7 @@ export enum_variants, substd_enum_variants, enum_is_univariant;
 export trait_methods, store_trait_methods, impl_traits;
 export enum_variant_with_id;
 export ty_dtor;
+export DtorKind, NoDtor, LegacyDtor, TraitDtor;
 export ty_param_bounds_and_ty;
 export ty_param_substs_and_ty;
 export ty_bool, mk_bool, type_is_bool;
@@ -1868,7 +1869,7 @@ fn type_needs_drop(cx: ctxt, ty: t) -> bool {
       }
       ty_class(did, ref substs) => {
          // Any class with a dtor needs a drop
-         ty_dtor(cx, did).is_some() || {
+         ty_dtor(cx, did).is_present() || {
              for vec::each(ty::class_items_as_fields(cx, did, substs)) |f| {
                  if type_needs_drop(cx, f.mt.ty) { accum = true; }
              }
@@ -3954,11 +3955,29 @@ fn item_path_str(cx: ctxt, id: ast::def_id) -> ~str {
     ast_map::path_to_str(item_path(cx, id), cx.sess.parse_sess.interner)
 }
 
+enum DtorKind {
+    NoDtor,
+    LegacyDtor(def_id),
+    TraitDtor(def_id)
+}
+
+impl DtorKind {
+    pure fn is_not_present(&const self) -> bool {
+        match *self {
+            NoDtor => true,
+            _ => false
+        }
+    }
+    pure fn is_present(&const self) -> bool {
+        !self.is_not_present()
+    }
+}
+
 /* If class_id names a class with a dtor, return Some(the dtor's id).
    Otherwise return none. */
-fn ty_dtor(cx: ctxt, class_id: def_id) -> Option<def_id> {
+fn ty_dtor(cx: ctxt, class_id: def_id) -> DtorKind {
     match cx.destructor_for_type.find(class_id) {
-        Some(method_def_id) => return Some(method_def_id),
+        Some(method_def_id) => return TraitDtor(method_def_id),
         None => {}  // Continue.
     }
 
@@ -3968,18 +3987,21 @@ fn ty_dtor(cx: ctxt, class_id: def_id) -> Option<def_id> {
                node: ast::item_class(@{ dtor: Some(dtor), _ }, _),
                _
            }, _)) =>
-               Some(local_def(dtor.node.id)),
+               LegacyDtor(local_def(dtor.node.id)),
            _ =>
-               None
+               NoDtor
        }
     }
     else {
-      csearch::class_dtor(cx.sess.cstore, class_id)
+      match csearch::class_dtor(cx.sess.cstore, class_id) {
+        None => NoDtor,
+        Some(did) => LegacyDtor(did),
+      }
     }
 }
 
 fn has_dtor(cx: ctxt, class_id: def_id) -> bool {
-    ty_dtor(cx, class_id).is_some()
+    ty_dtor(cx, class_id).is_present()
 }
 
 fn item_path(cx: ctxt, id: ast::def_id) -> ast_map::path {
diff --git a/src/libstd/arc.rs b/src/libstd/arc.rs
index 628d72f99c1..3ced56e6f50 100644
--- a/src/libstd/arc.rs
+++ b/src/libstd/arc.rs
@@ -229,7 +229,7 @@ struct PoisonOnFail {
 }
 
 impl PoisonOnFail : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         /* assert !*self.failed; -- might be false in case of cond.wait() */
         if task::failing() { *self.failed = true; }
     }
diff --git a/src/libstd/arena.rs b/src/libstd/arena.rs
index cf8bbc628f0..ea247d4bd3f 100644
--- a/src/libstd/arena.rs
+++ b/src/libstd/arena.rs
@@ -58,7 +58,7 @@ pub struct Arena {
 }
 
 impl Arena : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         unsafe {
             destroy_chunk(&self.head);
             for list::each(self.chunks) |chunk| {
diff --git a/src/libstd/c_vec.rs b/src/libstd/c_vec.rs
index 2e94f07d2d8..8777592eacc 100644
--- a/src/libstd/c_vec.rs
+++ b/src/libstd/c_vec.rs
@@ -42,11 +42,11 @@ struct DtorRes {
 }
 
 impl DtorRes : Drop {
-    fn finalize() {
-    match self.dtor {
-      option::None => (),
-      option::Some(f) => f()
-    }
+    fn finalize(&self) {
+        match self.dtor {
+          option::None => (),
+          option::Some(f) => f()
+        }
     }
 }
 
diff --git a/src/libstd/future.rs b/src/libstd/future.rs
index 31144740c8a..a22e4d67468 100644
--- a/src/libstd/future.rs
+++ b/src/libstd/future.rs
@@ -28,7 +28,7 @@ pub struct Future<A> {
 // FIXME(#2829) -- futures should not be copyable, because they close
 // over fn~'s that have pipes and so forth within!
 impl<A> Future<A> : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 priv enum FutureState<A> {
diff --git a/src/libstd/net_tcp.rs b/src/libstd/net_tcp.rs
index 182ec2a233c..2dd0c2b286d 100644
--- a/src/libstd/net_tcp.rs
+++ b/src/libstd/net_tcp.rs
@@ -30,10 +30,10 @@ struct TcpSocket {
 }
 
 impl TcpSocket : Drop {
-    fn finalize() {
-    unsafe {
-        tear_down_socket_data(self.socket_data)
-    }
+    fn finalize(&self) {
+        unsafe {
+            tear_down_socket_data(self.socket_data)
+        }
     }
 }
 
diff --git a/src/libstd/sort.rs b/src/libstd/sort.rs
index c6e8c72e6d6..c9981c2fef5 100644
--- a/src/libstd/sort.rs
+++ b/src/libstd/sort.rs
@@ -1137,7 +1137,7 @@ mod big_tests {
     }
 
     impl LVal : Drop {
-        fn finalize() {
+        fn finalize(&self) {
             let x = unsafe { task::local_data::local_data_get(self.key) };
             match x {
                 Some(@y) => {
diff --git a/src/libstd/sync.rs b/src/libstd/sync.rs
index c288e4dc4d3..61201d44d2f 100644
--- a/src/libstd/sync.rs
+++ b/src/libstd/sync.rs
@@ -153,7 +153,7 @@ struct SemRelease {
 }
 
 impl SemRelease : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         self.sem.release();
     }
 }
@@ -170,7 +170,7 @@ struct SemAndSignalRelease {
 }
 
 impl SemAndSignalRelease : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         self.sem.release();
     }
 }
@@ -185,7 +185,7 @@ fn SemAndSignalRelease(sem: &r/Sem<~[mut Waitqueue]>)
 /// A mechanism for atomic-unlock-and-deschedule blocking and signalling.
 pub struct Condvar { priv sem: &Sem<~[mut Waitqueue]> }
 
-impl Condvar : Drop { fn finalize() {} }
+impl Condvar : Drop { fn finalize(&self) {} }
 
 impl &Condvar {
     /**
@@ -257,7 +257,7 @@ impl &Condvar {
         }
 
         impl SemAndSignalReacquire : Drop {
-            fn finalize() {
+            fn finalize(&self) {
                 unsafe {
                     // Needs to succeed, instead of itself dying.
                     do task::unkillable {
@@ -607,7 +607,7 @@ struct RWlockReleaseRead {
 }
 
 impl RWlockReleaseRead : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         unsafe {
             do task::unkillable {
                 let mut last_reader = false;
@@ -641,7 +641,7 @@ struct RWlockReleaseDowngrade {
 }
 
 impl RWlockReleaseDowngrade : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         unsafe {
             do task::unkillable {
                 let mut writer_or_last_reader = false;
@@ -678,10 +678,10 @@ fn RWlockReleaseDowngrade(lock: &r/RWlock) -> RWlockReleaseDowngrade/&r {
 
 /// The "write permission" token used for rwlock.write_downgrade().
 pub struct RWlockWriteMode { /* priv */ lock: &RWlock }
-impl RWlockWriteMode : Drop { fn finalize() {} }
+impl RWlockWriteMode : Drop { fn finalize(&self) {} }
 /// The "read permission" token used for rwlock.write_downgrade().
 pub struct RWlockReadMode  { priv lock: &RWlock }
-impl RWlockReadMode : Drop { fn finalize() {} }
+impl RWlockReadMode : Drop { fn finalize(&self) {} }
 
 impl &RWlockWriteMode {
     /// Access the pre-downgrade rwlock in write mode.
@@ -993,7 +993,7 @@ mod tests {
         }
 
         impl SendOnFailure : Drop {
-            fn finalize() {
+            fn finalize(&self) {
                 self.c.send(());
             }
         }
diff --git a/src/test/auxiliary/issue-2526.rs b/src/test/auxiliary/issue-2526.rs
index d17de197e24..b3e5c645edb 100644
--- a/src/test/auxiliary/issue-2526.rs
+++ b/src/test/auxiliary/issue-2526.rs
@@ -12,7 +12,7 @@ struct arc_destruct<T:Const> {
 }
 
 impl<T:Const> arc_destruct<T> : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn arc_destruct<T: Const>(data: int) -> arc_destruct<T> {
@@ -34,7 +34,7 @@ struct context_res {
 }
 
 impl context_res : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn context_res() -> context_res {
diff --git a/src/test/auxiliary/issue-3012-1.rs b/src/test/auxiliary/issue-3012-1.rs
index ba123cf5254..15c7cf53e2f 100644
--- a/src/test/auxiliary/issue-3012-1.rs
+++ b/src/test/auxiliary/issue-3012-1.rs
@@ -12,7 +12,7 @@ struct socket_handle {
 }
 
 impl socket_handle : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         /* c::close(self.sockfd); */
     }
 }
diff --git a/src/test/auxiliary/issue2170lib.rs b/src/test/auxiliary/issue2170lib.rs
index 3ce738fd5e0..9a78fd34613 100644
--- a/src/test/auxiliary/issue2170lib.rs
+++ b/src/test/auxiliary/issue2170lib.rs
@@ -8,7 +8,7 @@ struct rsrc {
 }
 
 impl rsrc : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         foo(self.x);
     }
 }
diff --git a/src/test/auxiliary/test_comm.rs b/src/test/auxiliary/test_comm.rs
index 9664dc24c33..36e336d2ad3 100644
--- a/src/test/auxiliary/test_comm.rs
+++ b/src/test/auxiliary/test_comm.rs
@@ -32,7 +32,7 @@ struct port_ptr<T:Send> {
 }
 
 impl<T:Send> port_ptr<T> : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         unsafe {
             debug!("in the port_ptr destructor");
                do task::unkillable {
diff --git a/src/test/bench/task-perf-alloc-unwind.rs b/src/test/bench/task-perf-alloc-unwind.rs
index 65fb9ec1739..f2652b10cdc 100644
--- a/src/test/bench/task-perf-alloc-unwind.rs
+++ b/src/test/bench/task-perf-alloc-unwind.rs
@@ -45,7 +45,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn r(l: @nillist) -> r {
diff --git a/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-1.rs b/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-1.rs
index 1f7989d1ae9..5753a862582 100644
--- a/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-1.rs
+++ b/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-1.rs
@@ -1,7 +1,7 @@
 struct X { x: () }
 
 impl X : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("destructor runs");
     }
 }
diff --git a/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-2.rs b/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-2.rs
index 598fc4b0a08..2cf08c0139f 100644
--- a/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-2.rs
+++ b/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-2.rs
@@ -1,7 +1,7 @@
 struct X { x: (), }
 
 impl X : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("destructor runs");
     }
 }
diff --git a/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-3.rs b/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-3.rs
index 1cd62e92889..3dd000a1da8 100644
--- a/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-3.rs
+++ b/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-3.rs
@@ -1,7 +1,7 @@
 struct X { x: (), }
 
 impl X : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("destructor runs");
     }
 }
diff --git a/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-4.rs b/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-4.rs
index 3cd6c45af0b..e7f146e5bd3 100644
--- a/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-4.rs
+++ b/src/test/compile-fail/bind-by-move-neither-can-live-while-the-other-survives-4.rs
@@ -1,7 +1,7 @@
 struct X { x: (), }
 
 impl X : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("destructor runs");
     }
 }
diff --git a/src/test/compile-fail/bind-by-move-no-lvalues-1.rs b/src/test/compile-fail/bind-by-move-no-lvalues-1.rs
index 29d21ee670d..cd5bf5e17f3 100644
--- a/src/test/compile-fail/bind-by-move-no-lvalues-1.rs
+++ b/src/test/compile-fail/bind-by-move-no-lvalues-1.rs
@@ -1,7 +1,7 @@
 struct X { x: (), }
 
 impl X : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("destructor runs");
     }
 }
diff --git a/src/test/compile-fail/bind-by-move-no-lvalues-2.rs b/src/test/compile-fail/bind-by-move-no-lvalues-2.rs
index b1b38b587e8..be016034ff3 100644
--- a/src/test/compile-fail/bind-by-move-no-lvalues-2.rs
+++ b/src/test/compile-fail/bind-by-move-no-lvalues-2.rs
@@ -1,7 +1,7 @@
 struct X { x: (), }
 
 impl X : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("destructor runs");
     }
 }
diff --git a/src/test/compile-fail/bind-by-move-no-sub-bindings.rs b/src/test/compile-fail/bind-by-move-no-sub-bindings.rs
index 2a36d9e0db6..3c1ffbd86d7 100644
--- a/src/test/compile-fail/bind-by-move-no-sub-bindings.rs
+++ b/src/test/compile-fail/bind-by-move-no-sub-bindings.rs
@@ -1,7 +1,7 @@
 struct X { x: (), }
 
 impl X : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("destructor runs");
     }
 }
diff --git a/src/test/compile-fail/block-must-not-have-result-res.rs b/src/test/compile-fail/block-must-not-have-result-res.rs
index a2823521234..464d6b1bc03 100644
--- a/src/test/compile-fail/block-must-not-have-result-res.rs
+++ b/src/test/compile-fail/block-must-not-have-result-res.rs
@@ -3,7 +3,7 @@
 struct r {}
 
 impl r : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         true
     }
 }
diff --git a/src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs b/src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs
index 4920a0239a5..cd24a8bb323 100644
--- a/src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs
+++ b/src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs
@@ -3,7 +3,7 @@ struct defer {
 }
 
 impl defer : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("%?", self.x);
     }
 }
diff --git a/src/test/compile-fail/borrowck-unary-move-2.rs b/src/test/compile-fail/borrowck-unary-move-2.rs
index b8fcf695c3f..eedeac84f83 100644
--- a/src/test/compile-fail/borrowck-unary-move-2.rs
+++ b/src/test/compile-fail/borrowck-unary-move-2.rs
@@ -3,7 +3,7 @@ struct noncopyable {
 }
 
 impl noncopyable : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("dropped");
     }
 }
diff --git a/src/test/compile-fail/cap-clause-illegal-cap.rs b/src/test/compile-fail/cap-clause-illegal-cap.rs
index be630ec8518..c174a4b50bc 100644
--- a/src/test/compile-fail/cap-clause-illegal-cap.rs
+++ b/src/test/compile-fail/cap-clause-illegal-cap.rs
@@ -3,7 +3,7 @@
 struct foo { x: int, }
 
 impl foo : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn foo(x: int) -> foo {
diff --git a/src/test/compile-fail/copy-a-resource.rs b/src/test/compile-fail/copy-a-resource.rs
index 9f86b9e894a..311eecae7db 100644
--- a/src/test/compile-fail/copy-a-resource.rs
+++ b/src/test/compile-fail/copy-a-resource.rs
@@ -5,7 +5,7 @@ struct foo {
 }
 
 impl foo : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn foo(i:int) -> foo {
diff --git a/src/test/compile-fail/disallowed-deconstructing-destructing-struct.rs b/src/test/compile-fail/disallowed-deconstructing-destructing-struct.rs
index 407b786016d..053a4075d2f 100644
--- a/src/test/compile-fail/disallowed-deconstructing-destructing-struct.rs
+++ b/src/test/compile-fail/disallowed-deconstructing-destructing-struct.rs
@@ -3,7 +3,7 @@ struct X {
 }
 
 impl X : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("value: %s", self.x);
     }
 }
diff --git a/src/test/compile-fail/drop-on-non-struct.rs b/src/test/compile-fail/drop-on-non-struct.rs
index 8ee72d9d2fd..f3db004da13 100644
--- a/src/test/compile-fail/drop-on-non-struct.rs
+++ b/src/test/compile-fail/drop-on-non-struct.rs
@@ -1,7 +1,7 @@
 type Foo = @[u8];
 
 impl Foo : Drop {   //~ ERROR the Drop trait may only be implemented
-    fn finalize() {
+    fn finalize(&self) {
         io::println("kaboom");
     }
 }
diff --git a/src/test/compile-fail/explicit-call-to-dtor.rs b/src/test/compile-fail/explicit-call-to-dtor.rs
index 56af671852b..0f78d8e1ae3 100644
--- a/src/test/compile-fail/explicit-call-to-dtor.rs
+++ b/src/test/compile-fail/explicit-call-to-dtor.rs
@@ -3,7 +3,7 @@ struct Foo {
 }
 
 impl Foo : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         io::println("kaboom");
     }
 }
diff --git a/src/test/compile-fail/explicit-call-to-supertrait-dtor.rs b/src/test/compile-fail/explicit-call-to-supertrait-dtor.rs
index c7c2748235a..83464270eb5 100644
--- a/src/test/compile-fail/explicit-call-to-supertrait-dtor.rs
+++ b/src/test/compile-fail/explicit-call-to-supertrait-dtor.rs
@@ -7,7 +7,7 @@ trait Bar : Drop {
 }
 
 impl Foo : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         io::println("kaboom");
     }
 }
diff --git a/src/test/compile-fail/functional-struct-update.rs b/src/test/compile-fail/functional-struct-update.rs
index 13012f146bf..a1a156d9ff5 100644
--- a/src/test/compile-fail/functional-struct-update.rs
+++ b/src/test/compile-fail/functional-struct-update.rs
@@ -3,7 +3,7 @@ struct Bar {
 }
 
 impl Bar : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         io::println("Goodbye, cruel world");
     }
 }
diff --git a/src/test/compile-fail/issue-2487-b.rs b/src/test/compile-fail/issue-2487-b.rs
index 5476ab24000..a6248c158b7 100644
--- a/src/test/compile-fail/issue-2487-b.rs
+++ b/src/test/compile-fail/issue-2487-b.rs
@@ -3,7 +3,7 @@ struct socket {
 }
 
 impl socket : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 impl socket {
diff --git a/src/test/compile-fail/issue-2548.rs b/src/test/compile-fail/issue-2548.rs
index 5567e5855e4..d47d51b2a2b 100644
--- a/src/test/compile-fail/issue-2548.rs
+++ b/src/test/compile-fail/issue-2548.rs
@@ -7,7 +7,7 @@ struct foo {
 }
 
 impl foo : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         io::println("Goodbye, World!");
         *self.x += 1;
     }
diff --git a/src/test/compile-fail/issue-2587-2.rs b/src/test/compile-fail/issue-2587-2.rs
index 8b1bcb69e01..d8d2f82da97 100644
--- a/src/test/compile-fail/issue-2587-2.rs
+++ b/src/test/compile-fail/issue-2587-2.rs
@@ -9,7 +9,7 @@ struct S {
 }
 
 impl S : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn S(x: int) -> S { S { x: x } }
diff --git a/src/test/compile-fail/issue-2823.rs b/src/test/compile-fail/issue-2823.rs
index 5b02a6da458..e613114fee5 100644
--- a/src/test/compile-fail/issue-2823.rs
+++ b/src/test/compile-fail/issue-2823.rs
@@ -3,7 +3,7 @@ struct C {
 }
 
 impl C : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("dropping: %?", self.x);
     }
 }
diff --git a/src/test/compile-fail/issue-3214.rs b/src/test/compile-fail/issue-3214.rs
index 9e38c39bb72..ad97377324c 100644
--- a/src/test/compile-fail/issue-3214.rs
+++ b/src/test/compile-fail/issue-3214.rs
@@ -5,7 +5,7 @@ fn foo<T>() {
     }
 
     impl<T> foo<T> : Drop {
-        fn finalize() {}
+        fn finalize(&self) {}
     }
 }
 fn main() { }
diff --git a/src/test/compile-fail/liveness-unused.rs b/src/test/compile-fail/liveness-unused.rs
index 3aaaa2ef16f..3c4d70e058b 100644
--- a/src/test/compile-fail/liveness-unused.rs
+++ b/src/test/compile-fail/liveness-unused.rs
@@ -53,7 +53,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn main() {
diff --git a/src/test/compile-fail/no-send-res-ports.rs b/src/test/compile-fail/no-send-res-ports.rs
index 7f5c7e1f59b..87f149d3928 100644
--- a/src/test/compile-fail/no-send-res-ports.rs
+++ b/src/test/compile-fail/no-send-res-ports.rs
@@ -4,7 +4,7 @@ fn main() {
     }
 
     impl foo : Drop {
-        fn finalize() {}
+        fn finalize(&self) {}
     }
 
     fn foo(x: comm::Port<()>) -> foo {
diff --git a/src/test/compile-fail/non-const.rs b/src/test/compile-fail/non-const.rs
index 084b357561a..0808997676b 100644
--- a/src/test/compile-fail/non-const.rs
+++ b/src/test/compile-fail/non-const.rs
@@ -7,7 +7,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn r(x:int) -> r {
@@ -21,7 +21,7 @@ struct r2 {
 }
 
 impl r2 : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn r2(x:@mut int) -> r2 {
diff --git a/src/test/compile-fail/noncopyable-class.rs b/src/test/compile-fail/noncopyable-class.rs
index 0d56867225d..ee786370dfb 100644
--- a/src/test/compile-fail/noncopyable-class.rs
+++ b/src/test/compile-fail/noncopyable-class.rs
@@ -7,7 +7,7 @@ struct bar {
 }
 
 impl bar : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn bar(x:int) -> bar {
diff --git a/src/test/compile-fail/pinned-deep-copy.rs b/src/test/compile-fail/pinned-deep-copy.rs
index c95e2f0b54d..dbb57d7ee86 100644
--- a/src/test/compile-fail/pinned-deep-copy.rs
+++ b/src/test/compile-fail/pinned-deep-copy.rs
@@ -5,7 +5,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         *(self.i) = *(self.i) + 1;
     }
 }
diff --git a/src/test/compile-fail/record-with-resource.rs b/src/test/compile-fail/record-with-resource.rs
index 6bcac8f56e0..01a6c729e7f 100644
--- a/src/test/compile-fail/record-with-resource.rs
+++ b/src/test/compile-fail/record-with-resource.rs
@@ -5,7 +5,7 @@ struct my_resource {
 }
 
 impl my_resource : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         log(error, self.x);
     }
 }
diff --git a/src/test/compile-fail/regions-in-rsrcs.rs b/src/test/compile-fail/regions-in-rsrcs.rs
index cce998bea2d..bcd7e5b03ab 100644
--- a/src/test/compile-fail/regions-in-rsrcs.rs
+++ b/src/test/compile-fail/regions-in-rsrcs.rs
@@ -3,7 +3,7 @@ struct yes0 {
 }
 
 impl yes0 : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 struct yes1 {
@@ -11,7 +11,7 @@ struct yes1 {
 }
 
 impl yes1 : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 struct yes2 {
@@ -19,7 +19,7 @@ struct yes2 {
 }
 
 impl yes2 : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn main() {}
diff --git a/src/test/compile-fail/repeat-to-run-dtor-twice.rs b/src/test/compile-fail/repeat-to-run-dtor-twice.rs
index fb5b2509cb8..2037358c36d 100644
--- a/src/test/compile-fail/repeat-to-run-dtor-twice.rs
+++ b/src/test/compile-fail/repeat-to-run-dtor-twice.rs
@@ -7,7 +7,7 @@ struct Foo {
 }
 
 impl Foo : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         io::println("Goodbye!");
     }
 }
diff --git a/src/test/compile-fail/unique-object-noncopyable.rs b/src/test/compile-fail/unique-object-noncopyable.rs
index 32739a1075a..f42bfea9562 100644
--- a/src/test/compile-fail/unique-object-noncopyable.rs
+++ b/src/test/compile-fail/unique-object-noncopyable.rs
@@ -7,7 +7,7 @@ struct Bar {
 }
 
 impl Bar : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 impl Bar : Foo {
diff --git a/src/test/compile-fail/unique-pinned-nocopy.rs b/src/test/compile-fail/unique-pinned-nocopy.rs
index 6a665c29240..d9eeced26fe 100644
--- a/src/test/compile-fail/unique-pinned-nocopy.rs
+++ b/src/test/compile-fail/unique-pinned-nocopy.rs
@@ -5,7 +5,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn main() {
diff --git a/src/test/compile-fail/unique-vec-res.rs b/src/test/compile-fail/unique-vec-res.rs
index 157b4435d07..0c3ab53dcc7 100644
--- a/src/test/compile-fail/unique-vec-res.rs
+++ b/src/test/compile-fail/unique-vec-res.rs
@@ -5,7 +5,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         *(self.i) = *(self.i) + 1;
     }
 }
diff --git a/src/test/compile-fail/vec-res-add.rs b/src/test/compile-fail/vec-res-add.rs
index 452c7e490cc..c0e6f2b60c1 100644
--- a/src/test/compile-fail/vec-res-add.rs
+++ b/src/test/compile-fail/vec-res-add.rs
@@ -7,7 +7,7 @@ struct r {
 fn r(i:int) -> r { r { i: i } }
 
 impl r : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn main() {
diff --git a/src/test/run-fail/issue-2061.rs b/src/test/run-fail/issue-2061.rs
index bed54138acb..9ffc10b86ae 100644
--- a/src/test/run-fail/issue-2061.rs
+++ b/src/test/run-fail/issue-2061.rs
@@ -5,7 +5,7 @@ struct R {
 }
 
 impl R : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         let _y = R { b: self.b };
     }
 }
diff --git a/src/test/run-fail/morestack2.rs b/src/test/run-fail/morestack2.rs
index 29ea363ecae..32b45c5396e 100644
--- a/src/test/run-fail/morestack2.rs
+++ b/src/test/run-fail/morestack2.rs
@@ -26,7 +26,7 @@ struct and_then_get_big_again {
 }
 
 impl and_then_get_big_again : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         fn getbig(i: int) {
             if i != 0 {
                 getbig(i - 1);
diff --git a/src/test/run-fail/morestack3.rs b/src/test/run-fail/morestack3.rs
index 9d021b96226..1892be596c1 100644
--- a/src/test/run-fail/morestack3.rs
+++ b/src/test/run-fail/morestack3.rs
@@ -18,7 +18,7 @@ struct and_then_get_big_again {
 }
 
 impl and_then_get_big_again : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         fn getbig(i: int) {
             if i != 0 {
                 getbig(i - 1);
diff --git a/src/test/run-fail/morestack4.rs b/src/test/run-fail/morestack4.rs
index fac54ae2507..c5d3161cbf6 100644
--- a/src/test/run-fail/morestack4.rs
+++ b/src/test/run-fail/morestack4.rs
@@ -18,7 +18,7 @@ struct and_then_get_big_again {
 }
 
 impl and_then_get_big_again : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn and_then_get_big_again(x:int) -> and_then_get_big_again {
diff --git a/src/test/run-fail/rt-set-exit-status-fail2.rs b/src/test/run-fail/rt-set-exit-status-fail2.rs
index d8c5662e193..45385927566 100644
--- a/src/test/run-fail/rt-set-exit-status-fail2.rs
+++ b/src/test/run-fail/rt-set-exit-status-fail2.rs
@@ -8,7 +8,7 @@ struct r {
 // failed has no effect and the process exits with the
 // runtime's exit code
 impl r : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         os::set_exit_status(50);
     }
 }
diff --git a/src/test/run-fail/unwind-box-res.rs b/src/test/run-fail/unwind-box-res.rs
index d9e347079f4..1c61704bdbe 100644
--- a/src/test/run-fail/unwind-box-res.rs
+++ b/src/test/run-fail/unwind-box-res.rs
@@ -9,7 +9,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         unsafe {
             let _v2: ~int = cast::reinterpret_cast(&self.v);
         }
diff --git a/src/test/run-fail/unwind-resource-fail3.rs b/src/test/run-fail/unwind-resource-fail3.rs
index 628ef64626c..17acfd105bb 100644
--- a/src/test/run-fail/unwind-resource-fail3.rs
+++ b/src/test/run-fail/unwind-resource-fail3.rs
@@ -8,7 +8,7 @@ struct faily_box {
 fn faily_box(i: @int) -> faily_box { faily_box { i: i } }
 
 impl faily_box : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         fail ~"quux";
     }
 }
diff --git a/src/test/run-pass/class-attributes-1.rs b/src/test/run-pass/class-attributes-1.rs
index f3f887230d2..29abb4c9d7e 100644
--- a/src/test/run-pass/class-attributes-1.rs
+++ b/src/test/run-pass/class-attributes-1.rs
@@ -6,7 +6,7 @@ struct cat {
 
 impl cat: Drop {
     #[cat_dropper]
-    fn finalize() { error!("%s landed on hir feet",self.name); }
+    fn finalize(&self) { error!("%s landed on hir feet",self.name); }
 }
 
 
diff --git a/src/test/run-pass/class-attributes-2.rs b/src/test/run-pass/class-attributes-2.rs
index 5bcec8d3b0d..00d3730554e 100644
--- a/src/test/run-pass/class-attributes-2.rs
+++ b/src/test/run-pass/class-attributes-2.rs
@@ -7,7 +7,7 @@ impl cat : Drop {
     /**
        Actually, cats don't always land on their feet when you drop them.
     */
-    fn finalize() {
+    fn finalize(&self) {
         error!("%s landed on hir feet", self.name);
     }
 }
diff --git a/src/test/run-pass/class-dtor.rs b/src/test/run-pass/class-dtor.rs
index 318392921d8..e9194f05778 100644
--- a/src/test/run-pass/class-dtor.rs
+++ b/src/test/run-pass/class-dtor.rs
@@ -4,7 +4,7 @@ struct cat {
 }
 
 impl cat : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         self.done(self.meows);
     }
 }
diff --git a/src/test/run-pass/drop-trait-generic.rs b/src/test/run-pass/drop-trait-generic.rs
index 6df59ed8ca9..a56cd0f6eca 100644
--- a/src/test/run-pass/drop-trait-generic.rs
+++ b/src/test/run-pass/drop-trait-generic.rs
@@ -3,7 +3,7 @@ struct S<T> {
 }
 
 impl<T> S<T> : core::ops::Drop {
-    fn finalize() {
+    fn finalize(&self) {
         io::println("bye");
     }
 }
diff --git a/src/test/run-pass/drop-trait.rs b/src/test/run-pass/drop-trait.rs
index 3a379a4c9dc..f55981e58be 100644
--- a/src/test/run-pass/drop-trait.rs
+++ b/src/test/run-pass/drop-trait.rs
@@ -3,7 +3,7 @@ struct Foo {
 }
 
 impl Foo : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         io::println("bye");
     }
 }
diff --git a/src/test/run-pass/init-res-into-things.rs b/src/test/run-pass/init-res-into-things.rs
index 04520d925b1..c9824d96c9c 100644
--- a/src/test/run-pass/init-res-into-things.rs
+++ b/src/test/run-pass/init-res-into-things.rs
@@ -6,7 +6,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         *(self.i) = *(self.i) + 1;
     }
 }
diff --git a/src/test/run-pass/issue-2487-a.rs b/src/test/run-pass/issue-2487-a.rs
index 15c46ffbaf8..10074864632 100644
--- a/src/test/run-pass/issue-2487-a.rs
+++ b/src/test/run-pass/issue-2487-a.rs
@@ -4,7 +4,7 @@ struct socket {
 }
 
 impl socket : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 impl socket {
diff --git a/src/test/run-pass/issue-2708.rs b/src/test/run-pass/issue-2708.rs
index aefcca9004b..e4ff1fef539 100644
--- a/src/test/run-pass/issue-2708.rs
+++ b/src/test/run-pass/issue-2708.rs
@@ -6,7 +6,7 @@ struct Font {
 }
 
 impl Font : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn Font() -> Font {
diff --git a/src/test/run-pass/issue-2718.rs b/src/test/run-pass/issue-2718.rs
index 3148c68fe11..82ad82c64a3 100644
--- a/src/test/run-pass/issue-2718.rs
+++ b/src/test/run-pass/issue-2718.rs
@@ -144,7 +144,7 @@ mod pipes {
     }
 
     impl<T: Send> send_packet<T> : Drop {
-        fn finalize() {
+        fn finalize(&self) {
             if self.p != None {
                 let mut p = None;
                 p <-> self.p;
@@ -172,7 +172,7 @@ mod pipes {
     }
 
     impl<T: Send> recv_packet<T> : Drop {
-        fn finalize() {
+        fn finalize(&self) {
             if self.p != None {
                 let mut p = None;
                 p <-> self.p;
diff --git a/src/test/run-pass/issue-2735-2.rs b/src/test/run-pass/issue-2735-2.rs
index 86458989ffd..501d37f7d39 100644
--- a/src/test/run-pass/issue-2735-2.rs
+++ b/src/test/run-pass/issue-2735-2.rs
@@ -4,7 +4,7 @@ struct defer {
 }
 
 impl defer : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         *(self.b) = true;
     }
 }
diff --git a/src/test/run-pass/issue-2735-3.rs b/src/test/run-pass/issue-2735-3.rs
index 4a93de936bc..cfaad51f3b6 100644
--- a/src/test/run-pass/issue-2735-3.rs
+++ b/src/test/run-pass/issue-2735-3.rs
@@ -4,7 +4,7 @@ struct defer {
 }
 
 impl defer : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         *(self.b) = true;
     }
 }
diff --git a/src/test/run-pass/issue-2895.rs b/src/test/run-pass/issue-2895.rs
index d15edccaa18..c45a582fd66 100644
--- a/src/test/run-pass/issue-2895.rs
+++ b/src/test/run-pass/issue-2895.rs
@@ -10,7 +10,7 @@ struct Kitty {
 }
 
 impl Kitty : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 #[cfg(target_arch = "x86_64")]
diff --git a/src/test/run-pass/issue-3220.rs b/src/test/run-pass/issue-3220.rs
index 273db8505a1..6e51ae80baf 100644
--- a/src/test/run-pass/issue-3220.rs
+++ b/src/test/run-pass/issue-3220.rs
@@ -1,7 +1,7 @@
 struct thing { x: int, }
 
 impl thing : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn thing() -> thing {
diff --git a/src/test/run-pass/issue-979.rs b/src/test/run-pass/issue-979.rs
index 970afb0597e..e8e1def99c0 100644
--- a/src/test/run-pass/issue-979.rs
+++ b/src/test/run-pass/issue-979.rs
@@ -3,7 +3,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         *(self.b) += 1;
     }
 }
diff --git a/src/test/run-pass/option-unwrap.rs b/src/test/run-pass/option-unwrap.rs
index d2ae1e02a41..3294f76c25e 100644
--- a/src/test/run-pass/option-unwrap.rs
+++ b/src/test/run-pass/option-unwrap.rs
@@ -4,7 +4,7 @@ struct dtor {
 }
 
 impl dtor : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         // abuse access to shared mutable state to write this code
         *self.x -= 1;
     }
diff --git a/src/test/run-pass/pipe-presentation-examples.rs b/src/test/run-pass/pipe-presentation-examples.rs
index 06c1734a28f..e29eb9787c0 100644
--- a/src/test/run-pass/pipe-presentation-examples.rs
+++ b/src/test/run-pass/pipe-presentation-examples.rs
@@ -69,7 +69,7 @@ struct Buffer {
 }
 
 impl Buffer : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 proto! double_buffer (
diff --git a/src/test/run-pass/resource-assign-is-not-copy.rs b/src/test/run-pass/resource-assign-is-not-copy.rs
index 522392d99ad..8a6a9a48a04 100644
--- a/src/test/run-pass/resource-assign-is-not-copy.rs
+++ b/src/test/run-pass/resource-assign-is-not-copy.rs
@@ -3,7 +3,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         *(self.i) += 1;
     }
 }
diff --git a/src/test/run-pass/resource-cycle.rs b/src/test/run-pass/resource-cycle.rs
index 6b637e668ed..e9ec45d97e9 100644
--- a/src/test/run-pass/resource-cycle.rs
+++ b/src/test/run-pass/resource-cycle.rs
@@ -5,7 +5,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         unsafe {
             debug!("r's dtor: self = %x, self.v = %x, self.v's value = %x",
               cast::reinterpret_cast::<*r, uint>(&ptr::addr_of(&self)),
diff --git a/src/test/run-pass/resource-cycle2.rs b/src/test/run-pass/resource-cycle2.rs
index ec04699ae98..00225ee1190 100644
--- a/src/test/run-pass/resource-cycle2.rs
+++ b/src/test/run-pass/resource-cycle2.rs
@@ -11,7 +11,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         unsafe {
             let v2: ~int = cast::reinterpret_cast(&self.v.c);
         }
diff --git a/src/test/run-pass/resource-cycle3.rs b/src/test/run-pass/resource-cycle3.rs
index 22b0f1272a8..62703724337 100644
--- a/src/test/run-pass/resource-cycle3.rs
+++ b/src/test/run-pass/resource-cycle3.rs
@@ -15,7 +15,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         unsafe {
             let _v2: ~int = cast::reinterpret_cast(&self.v.c);
             // let _v3: ~int = unsafe::reinterpret_cast(self.x);
diff --git a/src/test/run-pass/resource-destruct.rs b/src/test/run-pass/resource-destruct.rs
index 92a57004b50..82023aa99d2 100644
--- a/src/test/run-pass/resource-destruct.rs
+++ b/src/test/run-pass/resource-destruct.rs
@@ -3,7 +3,7 @@ struct shrinky_pointer {
 }
 
 impl shrinky_pointer : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         log(error, ~"Hello!"); **(self.i) -= 1;
     }
 }
diff --git a/src/test/run-pass/resource-generic.rs b/src/test/run-pass/resource-generic.rs
index 476f695e783..04c4c6672a3 100644
--- a/src/test/run-pass/resource-generic.rs
+++ b/src/test/run-pass/resource-generic.rs
@@ -6,7 +6,7 @@ struct finish<T: Copy> {
 }
 
 impl<T: Copy> finish<T> : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         self.arg.fin(self.arg.val);
     }
 }
diff --git a/src/test/run-pass/resource-in-struct.rs b/src/test/run-pass/resource-in-struct.rs
index b350955bec0..b4ffab2782a 100644
--- a/src/test/run-pass/resource-in-struct.rs
+++ b/src/test/run-pass/resource-in-struct.rs
@@ -9,7 +9,7 @@ struct close_res {
 }
 
 impl close_res : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         *(self.i) = false;
     }
 }
diff --git a/src/test/run-pass/send-resource.rs b/src/test/run-pass/send-resource.rs
index ebef3f39eea..f183f7cc650 100644
--- a/src/test/run-pass/send-resource.rs
+++ b/src/test/run-pass/send-resource.rs
@@ -6,7 +6,7 @@ struct test {
 }
 
 impl test : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn test(f: int) -> test {
diff --git a/src/test/run-pass/struct-literal-dtor.rs b/src/test/run-pass/struct-literal-dtor.rs
index 6bc605f2a08..27fdbcc07b9 100644
--- a/src/test/run-pass/struct-literal-dtor.rs
+++ b/src/test/run-pass/struct-literal-dtor.rs
@@ -3,7 +3,7 @@ struct foo {
 }
 
 impl foo : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("%s", self.x);
     }
 }
diff --git a/src/test/run-pass/task-compare.rs b/src/test/run-pass/task-compare.rs
index 2996ce8ff73..552f1a13c1c 100644
--- a/src/test/run-pass/task-compare.rs
+++ b/src/test/run-pass/task-compare.rs
@@ -12,7 +12,7 @@ struct notify {
 }
 
 impl notify : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("notify: task=%? v=%x unwinding=%b b=%b",
                task::get_task(),
                ptr::addr_of(&(*(self.v))) as uint,
diff --git a/src/test/run-pass/task-killjoin-rsrc.rs b/src/test/run-pass/task-killjoin-rsrc.rs
index fbbdaea2c94..68b09166b66 100644
--- a/src/test/run-pass/task-killjoin-rsrc.rs
+++ b/src/test/run-pass/task-killjoin-rsrc.rs
@@ -10,7 +10,7 @@ struct notify {
 }
 
 impl notify : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("notify: task=%? v=%x unwinding=%b b=%b",
                task::get_task(),
                ptr::addr_of(&(*(self.v))) as uint,
diff --git a/src/test/run-pass/type-param-constraints.rs b/src/test/run-pass/type-param-constraints.rs
index 3016778dea3..a668105ab5a 100644
--- a/src/test/run-pass/type-param-constraints.rs
+++ b/src/test/run-pass/type-param-constraints.rs
@@ -10,7 +10,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn r(i:int) -> r {
diff --git a/src/test/run-pass/unique-pinned-nocopy-2.rs b/src/test/run-pass/unique-pinned-nocopy-2.rs
index ad7e8d20400..fb5f4541634 100644
--- a/src/test/run-pass/unique-pinned-nocopy-2.rs
+++ b/src/test/run-pass/unique-pinned-nocopy-2.rs
@@ -3,7 +3,7 @@ struct r {
 }
 
 impl r : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         *(self.i) = *(self.i) + 1;
     }
 }
diff --git a/src/test/run-pass/unwind-resource.rs b/src/test/run-pass/unwind-resource.rs
index 00ab35e9e61..e49a5ddc19b 100644
--- a/src/test/run-pass/unwind-resource.rs
+++ b/src/test/run-pass/unwind-resource.rs
@@ -6,7 +6,7 @@ struct complainer {
 }
 
 impl complainer : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         error!("About to send!");
         comm::send(self.c, true);
         error!("Sent!");
diff --git a/src/test/run-pass/unwind-resource2.rs b/src/test/run-pass/unwind-resource2.rs
index 7a159464aab..8458dcfb9ea 100644
--- a/src/test/run-pass/unwind-resource2.rs
+++ b/src/test/run-pass/unwind-resource2.rs
@@ -6,7 +6,7 @@ struct complainer {
 }
 
 impl complainer : Drop {
-    fn finalize() {}
+    fn finalize(&self) {}
 }
 
 fn complainer(c: @int) -> complainer {
diff --git a/src/test/run-pass/vec-slice-drop.rs b/src/test/run-pass/vec-slice-drop.rs
index e057117c4a5..732075868bf 100644
--- a/src/test/run-pass/vec-slice-drop.rs
+++ b/src/test/run-pass/vec-slice-drop.rs
@@ -4,7 +4,7 @@ struct foo {
 }
 
 impl foo : Drop {
-    fn finalize() {
+    fn finalize(&self) {
         *self.x += 1;
     }
 }