about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-06-11 17:22:46 -0700
committerbors <bors@rust-lang.org>2013-06-11 17:22:46 -0700
commite06579bc0935ed1dcbddef41bc1b6a8850a2059c (patch)
treee0bb9d0588de8dee119c5b1133860bb17dc16124 /src/libstd
parent3f900dc7d1517bbc821989d68f3392d4aae96f93 (diff)
parent78404af882c5d6bc8c4c5584d0981f7b6cf877e2 (diff)
downloadrust-e06579bc0935ed1dcbddef41bc1b6a8850a2059c.tar.gz
rust-e06579bc0935ed1dcbddef41bc1b6a8850a2059c.zip
auto merge of #7056 : alexcrichton/rust/issue-4727, r=catamorphism
Closes #4727
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/unstable/finally.rs38
1 files changed, 16 insertions, 22 deletions
diff --git a/src/libstd/unstable/finally.rs b/src/libstd/unstable/finally.rs
index 5001fb421cd..b15bceddb1c 100644
--- a/src/libstd/unstable/finally.rs
+++ b/src/libstd/unstable/finally.rs
@@ -31,17 +31,20 @@ pub trait Finally<T> {
     fn finally(&self, dtor: &fn()) -> T;
 }
 
-impl<'self,T> Finally<T> for &'self fn() -> T {
-    fn finally(&self, dtor: &fn()) -> T {
-        let _d = Finallyalizer {
-            dtor: dtor
-        };
-
-        (*self)()
+macro_rules! finally_fn {
+    ($fnty:ty) => {
+        impl<T> Finally<T> for $fnty {
+            fn finally(&self, dtor: &fn()) -> T {
+                let _d = Finallyalizer {
+                    dtor: dtor
+                };
+                (*self)()
+            }
+        }
     }
 }
 
-impl<T> Finally<T> for ~fn() -> T {
+impl<'self,T> Finally<T> for &'self fn() -> T {
     fn finally(&self, dtor: &fn()) -> T {
         let _d = Finallyalizer {
             dtor: dtor
@@ -51,15 +54,9 @@ impl<T> Finally<T> for ~fn() -> T {
     }
 }
 
-impl<T> Finally<T> for @fn() -> T {
-    fn finally(&self, dtor: &fn()) -> T {
-        let _d = Finallyalizer {
-            dtor: dtor
-        };
-
-        (*self)()
-    }
-}
+finally_fn!(~fn() -> T)
+finally_fn!(@fn() -> T)
+finally_fn!(extern "Rust" fn() -> T)
 
 struct Finallyalizer<'self> {
     dtor: &'self fn()
@@ -108,10 +105,7 @@ fn test_retval() {
 
 #[test]
 fn test_compact() {
-    // FIXME #4727: Should be able to use a fn item instead
-    // of a closure for do_some_fallible_work,
-    // but it's a type error.
-    let do_some_fallible_work: &fn() = || { };
+    fn do_some_fallible_work() {}
     fn but_always_run_this_function() { }
     do_some_fallible_work.finally(
         but_always_run_this_function);
@@ -136,4 +130,4 @@ fn test_managed() {
     };
     assert_eq!(do managed.finally {}, 10);
     assert_eq!(*i, 20);
-}
\ No newline at end of file
+}