Skip to content

closures/async blocks capture all lifetimes in scope #100372

Open

Description

@aliemjay

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

Activity

  1. added
    A-closuresArea: Closures (`|…| { … }`)
    A-impl-traitArea: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.
    C-bugCategory: This is a bug.
    T-compilerRelevant 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.
    on Aug 10, 2022
  2. changed the title [-]closures/async blocks capture all lifetime generics in scope[/-] [+]closures/async blocks capture all lifetimes in scope[/+] on Aug 10, 2022
  3. jackh726 commented on Aug 10, 2022

    @jackh726
    Member

    Is this just a duplicate of #100267?

  4. aliemjay commented on Aug 10, 2022

    @aliemjay
    ContributorAuthor

    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.

  5. jackh726 commented on Aug 10, 2022

    @jackh726
    Member

    So, same bug different test case?

  6. aliemjay commented on Aug 10, 2022

    @aliemjay
    ContributorAuthor

    This issue tracks a pre-existing problem: Opaque types inference expects the closure_substs.parent_substs to 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!)

  7. moved this from Todo to Can do after stabilization in type alias impl trait stabilizationon Sep 9, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-closuresArea: Closures (`|…| { … }`)A-impl-traitArea: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.C-bugCategory: This is a bug.F-type_alias_impl_trait`#[feature(type_alias_impl_trait)]`T-compilerRelevant 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.

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions