// check-fail use std::fmt::{self, Display}; struct Mutex; impl Mutex { fn lock(&self) -> MutexGuard { MutexGuard(self) } } struct MutexGuard<'a>(&'a Mutex); impl<'a> Drop for MutexGuard<'a> { fn drop(&mut self) { // Empty but this is a necessary part of the repro. Otherwise borrow // checker is fine with 'a dangling at the time that MutexGuard goes out // of scope. } } struct Out; impl Out { fn write_fmt(&self, _args: fmt::Arguments) {} } impl<'a> Display for MutexGuard<'a> { fn fmt(&self, _formatter: &mut fmt::Formatter) -> fmt::Result { Ok(()) } } fn main() { // FIXME(dtolnay): We actually want both of these to work. I think it's // sadly unimplementable today though. let _write = { let mutex = Mutex; write!(Out, "{}", mutex.lock()) /* no semicolon */ //~^ ERROR `mutex` does not live long enough }; let _writeln = { let mutex = Mutex; writeln!(Out, "{}", mutex.lock()) /* no semicolon */ //~^ ERROR `mutex` does not live long enough }; }