| // Copyright 2014 The Rust Project Developers. See the COPYRIGHT |
| // file at the top-level directory of this distribution and at |
| // http://rust-lang.org/COPYRIGHT. |
| // |
| // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or |
| // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license |
| // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your |
| // option. This file may not be copied, modified, or distributed |
| // except according to those terms. |
| |
| #![feature(core)] |
| use std::boxed::FnBox; |
| |
| struct FuncContainer { |
| f1: fn(data: u8), |
| f2: extern "C" fn(data: u8), |
| f3: unsafe fn(data: u8), |
| } |
| |
| struct FuncContainerOuter { |
| container: Box<FuncContainer> |
| } |
| |
| struct Obj<F> where F: FnOnce() -> u32 { |
| closure: F, |
| not_closure: usize, |
| } |
| |
| struct BoxedObj { |
| boxed_closure: Box<FnBox() -> u32>, |
| } |
| |
| struct Wrapper<F> where F: FnMut() -> u32 { |
| wrap: Obj<F>, |
| } |
| |
| fn func() -> u32 { |
| 0 |
| } |
| |
| fn check_expression() -> Obj<Box<FnBox() -> u32>> { |
| Obj { closure: Box::new(|| 42_u32) as Box<FnBox() -> u32>, not_closure: 42 } |
| } |
| |
| fn main() { |
| // test variations of function |
| |
| let o_closure = Obj { closure: || 42, not_closure: 42 }; |
| o_closure.closure(); //~ ERROR no method named `closure` found |
| //~^ NOTE use `(o_closure.closure)(...)` if you meant to call the function stored |
| |
| o_closure.not_closure(); //~ ERROR no method named `not_closure` found |
| //~^ NOTE did you mean to write `o_closure.not_closure`? |
| |
| let o_func = Obj { closure: func, not_closure: 5 }; |
| o_func.closure(); //~ ERROR no method named `closure` found |
| //~^ NOTE use `(o_func.closure)(...)` if you meant to call the function stored |
| |
| let boxed_fn = BoxedObj { boxed_closure: Box::new(func) }; |
| boxed_fn.boxed_closure();//~ ERROR no method named `boxed_closure` found |
| //~^ NOTE use `(boxed_fn.boxed_closure)(...)` if you meant to call the function stored |
| |
| let boxed_closure = BoxedObj { boxed_closure: Box::new(|| 42_u32) as Box<FnBox() -> u32> }; |
| boxed_closure.boxed_closure();//~ ERROR no method named `boxed_closure` found |
| //~^ NOTE use `(boxed_closure.boxed_closure)(...)` if you meant to call the function stored |
| |
| // test expression writing in the notes |
| |
| let w = Wrapper { wrap: o_func }; |
| w.wrap.closure();//~ ERROR no method named `closure` found |
| //~^ NOTE use `(w.wrap.closure)(...)` if you meant to call the function stored |
| |
| w.wrap.not_closure();//~ ERROR no method named `not_closure` found |
| //~^ NOTE did you mean to write `w.wrap.not_closure`? |
| |
| check_expression().closure();//~ ERROR no method named `closure` found |
| //~^ NOTE use `(check_expression().closure)(...)` if you meant to call the function stored |
| } |
| |
| impl FuncContainerOuter { |
| fn run(&self) { |
| unsafe { |
| (*self.container).f1(1); //~ ERROR no method named `f1` found |
| //~^ NOTE use `((*self.container).f1)(...)` |
| (*self.container).f2(1); //~ ERROR no method named `f2` found |
| //~^ NOTE use `((*self.container).f2)(...)` |
| (*self.container).f3(1); //~ ERROR no method named `f3` found |
| //~^ NOTE use `((*self.container).f3)(...)` |
| } |
| } |
| } |