Repository navigation
closures/async blocks capture all lifetimes in scope #100372
Copy link
Copy link
Open
Labels
A-closuresArea: Closures (`|…| { … }`)Area: Closures (`|…| { … }`)A-impl-traitArea: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.Area: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.C-bugCategory: This is a bug.Category: This is a bug.F-type_alias_impl_trait`#[feature(type_alias_impl_trait)]``#[feature(type_alias_impl_trait)]`T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.T-typesRelevant to the types team, which will review and decide on the PR/issue.Relevant to the types team, which will review and decide on the PR/issue.
Description
This should compile, but it fails with a cryptic error message:
#![feature(type_alias_impl_trait)]
trait Trait {}
type Fut = impl Sized;
fn call<'a>() -> Fut
where
&'a (): Trait,
{
async {}
//~^ ERROR the trait bound `&'<empty> (): Trait` is not satisfied
}The reason for this is that the hidden type of Fut in the defining function is call::<'a>::generator#0, but because we can't reference 'a in the hidden type, the type is converted to call::<'empty>::generator#0 here:
| .unwrap_or(infcx.tcx.lifetimes.re_root_empty), |
The hidden type then fails WF checks because of the additional checks done in #96899 and #97183.
This now affects only type-alias-impl-trait, only because we don't WF-check the hidden type of return-position-impl-trait after borrow-checking.
@rustbot label A-impl-trait A-closures F-type_alias_impl_trait C-bug T-compiler T-types
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
A-closuresArea: Closures (`|…| { … }`)Area: Closures (`|…| { … }`)A-impl-traitArea: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.Area: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.C-bugCategory: This is a bug.Category: This is a bug.F-type_alias_impl_trait`#[feature(type_alias_impl_trait)]``#[feature(type_alias_impl_trait)]`T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the compiler team, which will review and decide on the PR/issue.T-typesRelevant to the types team, which will review and decide on the PR/issue.Relevant to the types team, which will review and decide on the PR/issue.
Type
Projects
- StatusShow more project fieldsCan do after stabilization
Activity
[-]closures/async blocks capture all lifetime generics in scope[/-][+]closures/async blocks capture all lifetimes in scope[/+]jackh726 commentedon Aug 10, 2022
Is this just a duplicate of #100267?
aliemjay commentedon Aug 10, 2022
Oh, I should've made it more clear. They're indeed closely related. #100267 is a regression that I wanted to close so I opened this ticket to track other subtle manifestations of the same underlying bug that are not really regressions of #98835.
jackh726 commentedon Aug 10, 2022
So, same bug different test case?
aliemjay commentedon Aug 10, 2022
This issue tracks a pre-existing problem: Opaque types inference expects the
closure_substs.parent_subststo be free region variables independent of the the parent function. This why #98835 caused a regression in opaque types, it breaks this invariant. But this is already a buggy behavior as demonstrated by the above example and I think we can do better (maybe #92617 can help!)