@@ -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
6461struct Finallyalizer < ' self > {
6562 dtor : & ' self fn ( )
@@ -108,10 +105,7 @@ fn test_retval() {
108105
109106#[ test]
110107fn 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