Skip to content

Commit 41dae55

Browse files
committed
auto merge of #7056 : alexcrichton/rust/issue-4727, r=graydon
Closes #4727
2 parents d0b1979 + 0c7ba3c commit 41dae55

File tree

1 file changed

+16
-22
lines changed

1 file changed

+16
-22
lines changed

src/libstd/unstable/finally.rs

+16-22
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,20 @@ pub trait Finally<T> {
3131
fn finally(&self, dtor: &fn()) -> T;
3232
}
3333

34-
impl<'self,T> Finally<T> for &'self fn() -> T {
35-
fn finally(&self, dtor: &fn()) -> T {
36-
let _d = Finallyalizer {
37-
dtor: dtor
38-
};
39-
40-
(*self)()
34+
macro_rules! finally_fn {
35+
($fnty:ty) => {
36+
impl<T> Finally<T> for $fnty {
37+
fn finally(&self, dtor: &fn()) -> T {
38+
let _d = Finallyalizer {
39+
dtor: dtor
40+
};
41+
(*self)()
42+
}
43+
}
4144
}
4245
}
4346

44-
impl<T> Finally<T> for ~fn() -> T {
47+
impl<'self,T> Finally<T> for &'self fn() -> T {
4548
fn finally(&self, dtor: &fn()) -> T {
4649
let _d = Finallyalizer {
4750
dtor: dtor
@@ -51,15 +54,9 @@ impl<T> Finally<T> for ~fn() -> T {
5154
}
5255
}
5356

54-
impl<T> Finally<T> for @fn() -> T {
55-
fn finally(&self, dtor: &fn()) -> T {
56-
let _d = Finallyalizer {
57-
dtor: dtor
58-
};
59-
60-
(*self)()
61-
}
62-
}
57+
finally_fn!(~fn() -> T)
58+
finally_fn!(@fn() -> T)
59+
finally_fn!(extern "Rust" fn() -> T)
6360

6461
struct Finallyalizer<'self> {
6562
dtor: &'self fn()
@@ -108,10 +105,7 @@ fn test_retval() {
108105

109106
#[test]
110107
fn test_compact() {
111-
// FIXME #4727: Should be able to use a fn item instead
112-
// of a closure for do_some_fallible_work,
113-
// but it's a type error.
114-
let do_some_fallible_work: &fn() = || { };
108+
fn do_some_fallible_work() {}
115109
fn but_always_run_this_function() { }
116110
do_some_fallible_work.finally(
117111
but_always_run_this_function);
@@ -136,4 +130,4 @@ fn test_managed() {
136130
};
137131
assert_eq!(do managed.finally {}, 10);
138132
assert_eq!(*i, 20);
139-
}
133+
}

0 commit comments

Comments
 (0)