Closed
Description
In this example (play), we currently get an incorrect compilation error:
trait Foo<'a> {
type Bar;
}
impl<'a> Foo<'a> for u32 {
type Bar = &'a ();
}
fn baz<'a, T>() -> impl IntoIterator<Item = T::Bar>
where T: Foo<'a> {
None
}
fn main() { }
yields
error[E0308]: mismatched types
--> src/main.rs:11:5
|
11 | None
| ^^^^ lifetime mismatch
|
= note: expected type `Foo<'static>`
found type `Foo<'a>`
This does not seem correct. =) The problem is that T::Bar
(at HIR lowering time) does not mention 'a
. So we wind up mapping this -- because of the way the region desugaring works -- to <T as Foo<'static>>::Bar
. If you manually write <T as Foo<'a>>::Bar
in the original Rust source, the 'a
becomes visible and is lowered correctly. In other words, this version compiles:
trait Foo<'a> {
type Bar;
}
impl<'a> Foo<'a> for u32 {
type Bar = &'a ();
}
fn baz<'a, T>() -> impl IntoIterator<Item = <T as Foo<'a>>::Bar>
where T: Foo<'a> {
None
}
fn main() { }
Metadata
Metadata
Assignees
Labels
Area: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.Area: Lifetimes / regionsCategory: This is a bug.Call for participation: An issue has been fixed and does not reproduce, but no test has been added.Relevant to the compiler team, which will review and decide on the PR/issue.