1 fn id<T>(x: T) -> T { x }
3 struct StateMachineIter<'a> {
4 statefn: &'a StateMachineFunc<'a>
7 type StateMachineFunc<'a> = fn(&mut StateMachineIter<'a>) -> Option<&'static str>;
9 impl<'a> Iterator for StateMachineIter<'a> {
10 type Item = &'static str;
12 fn next(&mut self) -> Option<&'static str> {
13 return (*self.statefn)(self);
17 fn state1(self_: &mut StateMachineIter) -> Option<&'static str> {
18 self_.statefn = &id(state2 as StateMachineFunc);
19 //~^ ERROR temporary value dropped while borrowed
20 return Some("state1");
23 fn state2(self_: &mut StateMachineIter) -> Option<(&'static str)> {
24 self_.statefn = &id(state3 as StateMachineFunc);
25 //~^ ERROR temporary value dropped while borrowed
26 return Some("state2");
29 fn state3(self_: &mut StateMachineIter) -> Option<(&'static str)> {
30 self_.statefn = &id(finished as StateMachineFunc);
31 //~^ ERROR temporary value dropped while borrowed
32 return Some("state3");
35 fn finished(_: &mut StateMachineIter) -> Option<(&'static str)> {
39 fn state_iter() -> StateMachineIter<'static> {
41 //~^ ERROR cannot return value referencing temporary value
42 statefn: &id(state1 as StateMachineFunc)
48 let mut it = state_iter();
49 println!("{:?}",it.next());
50 println!("{:?}",it.next());
51 println!("{:?}",it.next());
52 println!("{:?}",it.next());
53 println!("{:?}",it.next());