// This is a reduction of a concrete test illustrating a case that was // annoying to Rust developer stephaneyfx (see issue #46413). // // With resolving issue #54556, pnkfelix hopes that the new diagnostic // output produced by NLL helps to *explain* the semantic significance // of temp drop order, and thus why storing the result in `x` and then // returning `x` works. pub struct Statement; pub struct Rows<'stmt>(&'stmt Statement); impl<'stmt> Drop for Rows<'stmt> { fn drop(&mut self) {} } impl<'stmt> Iterator for Rows<'stmt> { type Item = String; fn next(&mut self) -> Option { None } } fn get_names() -> Option { let stmt = Statement; let rows = Rows(&stmt); //~ ERROR does not live long enough rows.map(|row| row).next() // let x = rows.map(|row| row).next(); // x // // Removing the map works too as does removing the Drop impl. } fn main() {}