| // rust-lang/rust#22323: regression test demonstrating that NLL |
| // precisely tracks temporary destruction order. |
| |
| //@ check-pass |
| |
| fn main() { |
| let _s = construct().borrow().consume_borrowed(); |
| } |
| |
| fn construct() -> Value { Value } |
| |
| pub struct Value; |
| |
| impl Value { |
| fn borrow<'a>(&'a self) -> Borrowed<'a> { unimplemented!() } |
| } |
| |
| pub struct Borrowed<'a> { |
| _inner: Guard<'a, Value>, |
| } |
| |
| impl<'a> Borrowed<'a> { |
| fn consume_borrowed(self) -> String { unimplemented!() } |
| } |
| |
| pub struct Guard<'a, T: ?Sized + 'a> { |
| _lock: &'a T, |
| } |
| |
| impl<'a, T: ?Sized> Drop for Guard<'a, T> { fn drop(&mut self) {} } |