Skip to content

TAIT: hidden type captures lifetime that does not appear in bounds #104691

Description

@Dirbaio

playground

pub trait Trait {
    type FooFn<'a>:  FnOnce() + 'a where Self: 'a;

    fn foo(&mut self) -> Self::FooFn<'_>;
}

struct Thingy(u32);

impl Trait for &Thingy {
    type FooFn<'a> = impl FnOnce() + 'a where Self: 'a;
    fn foo(&mut self) -> Self::FooFn<'_> {
        move || {
            println!("{}", self.0);
        }
    }
}

fails with

error[E0700]: hidden type for `<&Thingy as Trait>::FooFn<'_>` captures lifetime that does not appear in bounds
  --> src/lib.rs:16:9
   |
13 |   impl Trait for &Thingy {
   |                  - hidden type `[closure@src/lib.rs:16:9: 16:16]` captures the anonymous lifetime as defined here
...
16 | /         move || {
17 | |             println!("{}", self.0);
18 | |         }
   | |_________^

while this used to work before. I think because the where Self: 'a part takes care of the capture (?).

Not present in nightly yet, found it by building 1cbc459 from git master. Bisected it to 7fe6f36 which is #103491 @cjgillot

@rustbot label F-type_alias_impl_trait

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions