Open
Description
Cross posting stackoverflow because it's look like a compiler bug/limitation.
Given the following snippet:
use futures::stream::{self, StreamExt};
async fn from_bar(bar: &[Vec<&u8>]) {
let x = bar.iter().flat_map(|i| i.iter().map(|_| async { 42 }));
let foo: Vec<_> = stream::iter(x).collect().await;
}
#[tokio::main]
async fn main() {
for bar in vec![] {
tokio::spawn(async {
from_bar(bar).await;
});
}
}
I get the following errors:
error[E0308]: mismatched types
--> src/main.rs:11:9
|
11 | tokio::spawn(async {
| ^^^^^^^^^^^^ one type is more general than the other
|
= note: expected type `std::ops::FnOnce<(&&u8,)>`
found type `std::ops::FnOnce<(&&u8,)>`
error: implementation of `std::iter::Iterator` is not general enough
--> src/main.rs:11:9
|
11 | tokio::spawn(async {
| ^^^^^^^^^^^^ implementation of `std::iter::Iterator` is not general enough
|
= note: `std::iter::Iterator` would have to be implemented for the type `std::slice::Iter<'0, &u8>`, for any lifetime `'0`...
= note: ...but `std::iter::Iterator` is actually implemented for the type `std::slice::Iter<'1, &u8>`, for some specific lifetime `'1`
I was expecting no error because the lifetimes seem to be correct to me. Note that removing main()
or removing the code inside from_bar()
both eliminate the errors. Not only that, the error messages are also very strange. They may be related to a regression in the compiler, though more than that they seem to be in the wrong place (maybe related).
Version rustc 1.43.0 (4fb7144ed 2020-04-20)
:
[dependencies]
futures = '0.3.1'
[dependencies.tokio]
version = '0.2'
features = ['full']
Maybe related #64650