2018-10-03 15:47:23 +00:00
|
|
|
// 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<Self::Item> {
|
|
|
|
None
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn get_names() -> Option<String> {
|
|
|
|
let stmt = Statement;
|
2018-11-27 09:56:36 +00:00
|
|
|
let rows = Rows(&stmt); //~ ERROR does not live long enough
|
2018-10-03 15:47:23 +00:00
|
|
|
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() {}
|