// check-pass use std::marker::PhantomData; #[derive(Default)] struct MyType<'a> { field: usize, _phantom: PhantomData<&'a ()>, } #[derive(Default)] struct MyTypeVariant<'a> { field: usize, _phantom: PhantomData<&'a ()>, } trait AsVariantTrait { type Type; } impl<'a> AsVariantTrait for MyType<'a> { type Type = MyTypeVariant<'a>; } type Variant = ::Type; fn foo(f: F) { let input = T::default(); f(input); } fn main() { foo(|a: ::Type| { a.field; }); }