Open
Description
This example (playground):
use std::rc::Rc;
fn iterate(data: Rc<Vec<u32>>) -> impl Iterator<Item = u32> {
data.iter().cloned()
}
fn main() {
for x in iterate(Rc::new(vec![1, 2, 3])) {
println!("Hi! {}", x);
}
}
gives this error:
error[E0597]: `data` would be dropped while still borrowed
--> src/main.rs:4:5
|
4 | data.iter().cloned()
| ^^^^ borrowed value does not live long enough
5 | }
| - borrowed value only lives until here
|
= note: borrowed value must be valid for the static lifetime...
I think we could do better. For example, we don't explain anything about how impl Iterator
disallows lifetimes; and I think we can clarify why `data is being dropped.
I don't yet have a concrete suggestion, though, have to think about it.
Related to #52534 -- in some sense a specific instance of that.
Metadata
Metadata
Assignees
Labels
Type
Projects
Milestone
Relationships
Development
No branches or pull requests
Activity
[-]improve error message when [/-][+]improve error message when returning iterator with reference into stack frame [/+]nikomatsakis commentedon Sep 1, 2018
With respect to impl Iterator, one thing I thought of is this
But in a way -- in this particular case -- it doesn't matter anyway, as there is nothing you could change that signature too that would work.
matthewjasper commentedon Sep 1, 2018
I've assigned myself since I've been working on things in this area recently, but other things have come up as higher priority, so I might not get around to this for a few weeks.
Nadrieril commentedon Nov 30, 2023
The current error is:
Which is already much better! I think "opaque type requires that" could point to the
impl Iterator
return type as Niko suggested, and "borrowed value does not live long enough" doesn't explain what it points to. My personal ideal would look like: