Skip to content

closures/async blocks capture all lifetimes in scope #100372

Open
@aliemjay

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

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

    Status

    Can do after stabilization

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions