| //@ run-pass |
| |
| // A test for something that NLL enables. It sometimes happens that |
| // the `while let` pattern makes some borrows from a variable (in this |
| // case, `x`) that you need in order to compute the next value for |
| // `x`. The lexical checker makes this very painful. The NLL checker |
| // does not. |
| |
| use std::rc::Rc; |
| |
| #[derive(Debug, PartialEq, Eq)] |
| enum Foo { |
| Base(usize), |
| Next(Rc<Foo>), |
| } |
| |
| fn find_base(mut x: Rc<Foo>) -> Rc<Foo> { |
| while let Foo::Next(n) = &*x { |
| x = n.clone(); |
| } |
| x |
| } |
| |
| fn main() { |
| let chain = Rc::new(Foo::Next(Rc::new(Foo::Base(44)))); |
| let base = find_base(chain); |
| assert_eq!(&*base, &Foo::Base(44)); |
| } |