@@ -31,17 +31,20 @@ pub trait Finally<T> {
31
31
fn finally ( & self , dtor : & fn ( ) ) -> T ;
32
32
}
33
33
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
+ }
41
44
}
42
45
}
43
46
44
- impl < T > Finally < T > for ~ fn ( ) -> T {
47
+ impl < ' self , T > Finally < T > for & ' self fn ( ) -> T {
45
48
fn finally ( & self , dtor : & fn ( ) ) -> T {
46
49
let _d = Finallyalizer {
47
50
dtor : dtor
@@ -51,15 +54,9 @@ impl<T> Finally<T> for ~fn() -> T {
51
54
}
52
55
}
53
56
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 )
63
60
64
61
struct Finallyalizer < ' self > {
65
62
dtor : & ' self fn ( )
@@ -108,10 +105,7 @@ fn test_retval() {
108
105
109
106
#[ test]
110
107
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 ( ) { }
115
109
fn but_always_run_this_function ( ) { }
116
110
do_some_fallible_work. finally (
117
111
but_always_run_this_function) ;
@@ -136,4 +130,4 @@ fn test_managed() {
136
130
} ;
137
131
assert_eq ! ( do managed. finally { } , 10 ) ;
138
132
assert_eq ! ( * i, 20 ) ;
139
- }
133
+ }
0 commit comments