Avoid looking at HIR for trait and impl items

This commit is contained in:
Oli Scherer
2025-06-13 09:15:35 +00:00
parent 70215dfe61
commit 6166cd6b50
22 changed files with 67 additions and 79 deletions

View File

@@ -328,23 +328,14 @@ fn check_trait_item<'tcx>(
) -> Result<(), ErrorGuaranteed> { ) -> Result<(), ErrorGuaranteed> {
let def_id = trait_item.owner_id.def_id; let def_id = trait_item.owner_id.def_id;
let span = match trait_item.kind {
hir::TraitItemKind::Type(_bounds, Some(ty)) => ty.span,
_ => trait_item.span,
};
// Check that an item definition in a subtrait is shadowing a supertrait item. // Check that an item definition in a subtrait is shadowing a supertrait item.
lint_item_shadowing_supertrait_item(tcx, def_id); lint_item_shadowing_supertrait_item(tcx, def_id);
let mut res = check_associated_item(tcx, def_id, span); let mut res = check_associated_item(tcx, def_id);
if matches!(trait_item.kind, hir::TraitItemKind::Fn(..)) { if matches!(trait_item.kind, hir::TraitItemKind::Fn(..)) {
for &assoc_ty_def_id in tcx.associated_types_for_impl_traits_in_associated_fn(def_id) { for &assoc_ty_def_id in tcx.associated_types_for_impl_traits_in_associated_fn(def_id) {
res = res.and(check_associated_item( res = res.and(check_associated_item(tcx, assoc_ty_def_id.expect_local()));
tcx,
assoc_ty_def_id.expect_local(),
tcx.def_span(assoc_ty_def_id),
));
} }
} }
res res
@@ -827,12 +818,7 @@ fn check_impl_item<'tcx>(
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
impl_item: &'tcx hir::ImplItem<'tcx>, impl_item: &'tcx hir::ImplItem<'tcx>,
) -> Result<(), ErrorGuaranteed> { ) -> Result<(), ErrorGuaranteed> {
let span = match impl_item.kind { check_associated_item(tcx, impl_item.owner_id.def_id)
// Constrain binding and overflow error spans to `<Ty>` in `type foo = <Ty>`.
hir::ImplItemKind::Type(ty) if ty.span != DUMMY_SP => ty.span,
_ => impl_item.span,
};
check_associated_item(tcx, impl_item.owner_id.def_id, span)
} }
fn check_param_wf(tcx: TyCtxt<'_>, param: &ty::GenericParamDef) -> Result<(), ErrorGuaranteed> { fn check_param_wf(tcx: TyCtxt<'_>, param: &ty::GenericParamDef) -> Result<(), ErrorGuaranteed> {
@@ -960,12 +946,8 @@ fn check_param_wf(tcx: TyCtxt<'_>, param: &ty::GenericParamDef) -> Result<(), Er
} }
} }
#[instrument(level = "debug", skip(tcx, span))] #[instrument(level = "debug", skip(tcx))]
fn check_associated_item( fn check_associated_item(tcx: TyCtxt<'_>, item_id: LocalDefId) -> Result<(), ErrorGuaranteed> {
tcx: TyCtxt<'_>,
item_id: LocalDefId,
span: Span,
) -> Result<(), ErrorGuaranteed> {
let loc = Some(WellFormedLoc::Ty(item_id)); let loc = Some(WellFormedLoc::Ty(item_id));
enter_wf_checking_ctxt(tcx, item_id, |wfcx| { enter_wf_checking_ctxt(tcx, item_id, |wfcx| {
let item = tcx.associated_item(item_id); let item = tcx.associated_item(item_id);
@@ -982,6 +964,8 @@ fn check_associated_item(
} }
}; };
let span = tcx.def_span(item_id);
match item.kind { match item.kind {
ty::AssocKind::Const { .. } => { ty::AssocKind::Const { .. } => {
let ty = tcx.type_of(item.def_id).instantiate_identity(); let ty = tcx.type_of(item.def_id).instantiate_identity();

View File

@@ -1,8 +1,8 @@
error: overflow evaluating associated type `Carrier<'b>::Focus<i32>` error: overflow evaluating associated type `Carrier<'b>::Focus<i32>`
--> $DIR/issue-111879-0.rs:9:25 --> $DIR/issue-111879-0.rs:9:5
| |
LL | pub type Focus<T> = &'a mut for<'b> fn(Carrier<'b>::Focus<i32>); LL | pub type Focus<T> = &'a mut for<'b> fn(Carrier<'b>::Focus<i32>);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^
error: aborting due to 1 previous error error: aborting due to 1 previous error

View File

@@ -1,8 +1,8 @@
error: overflow evaluating associated type `T::This` error: overflow evaluating associated type `T::This`
--> $DIR/normalization-overflow.rs:9:17 --> $DIR/normalization-overflow.rs:9:5
| |
LL | type This = Self::This; LL | type This = Self::This;
| ^^^^^^^^^^ | ^^^^^^^^^
error: aborting due to 1 previous error error: aborting due to 1 previous error

View File

@@ -1,10 +1,11 @@
error[E0309]: the parameter type `T` may not live long enough error[E0309]: the parameter type `T` may not live long enough
--> $DIR/regionck-1.rs:9:30 --> $DIR/regionck-1.rs:9:5
| |
LL | type NoTyOutliv<'a, T> = &'a T; LL | type NoTyOutliv<'a, T> = &'a T;
| -- ^^^^^ ...so that the reference type `&'a T` does not outlive the data it points at | ^^^^^^^^^^^^^^^^--^^^^
| | | | |
| the parameter type `T` must be valid for the lifetime `'a` as defined here... | | the parameter type `T` must be valid for the lifetime `'a` as defined here...
| ...so that the reference type `&'a T` does not outlive the data it points at
| |
help: consider adding an explicit lifetime bound help: consider adding an explicit lifetime bound
| |
@@ -12,10 +13,10 @@ LL | type NoTyOutliv<'a, T: 'a> = &'a T;
| ++++ | ++++
error[E0491]: in type `&'a &'b ()`, reference has a longer lifetime than the data it references error[E0491]: in type `&'a &'b ()`, reference has a longer lifetime than the data it references
--> $DIR/regionck-1.rs:10:31 --> $DIR/regionck-1.rs:10:5
| |
LL | type NoReOutliv<'a, 'b> = &'a &'b (); LL | type NoReOutliv<'a, 'b> = &'a &'b ();
| ^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^
| |
note: the pointer is valid for the lifetime `'a` as defined here note: the pointer is valid for the lifetime `'a` as defined here
--> $DIR/regionck-1.rs:10:21 --> $DIR/regionck-1.rs:10:21

View File

@@ -7,7 +7,7 @@ LL | | const VALUE: bool = false;
... | ... |
LL | | <IsCopy<T>>::VALUE LL | | <IsCopy<T>>::VALUE
LL | | } as usize] = []; LL | | } as usize] = [];
| |_____________________^ | |_______________^
| |
help: try adding a `where` bound help: try adding a `where` bound
| |

View File

@@ -5,12 +5,13 @@ LL | impl<'b, T, U> AsRef2 for Foo<T>
| ^ unconstrained type parameter | ^ unconstrained type parameter
error[E0309]: the parameter type `U` may not live long enough error[E0309]: the parameter type `U` may not live long enough
--> $DIR/issue-87735.rs:34:21 --> $DIR/issue-87735.rs:34:3
| |
LL | type Output<'a> = FooRef<'a, U> where Self: 'a; LL | type Output<'a> = FooRef<'a, U> where Self: 'a;
| -- ^^^^^^^^^^^^^ ...so that the type `U` will meet its required lifetime bounds... | ^^^^^^^^^^^^--^
| | | | |
| the parameter type `U` must be valid for the lifetime `'a` as defined here... | | the parameter type `U` must be valid for the lifetime `'a` as defined here...
| ...so that the type `U` will meet its required lifetime bounds...
| |
note: ...that is required by this bound note: ...that is required by this bound
--> $DIR/issue-87735.rs:23:22 --> $DIR/issue-87735.rs:23:22

View File

@@ -5,12 +5,13 @@ LL | impl<'q, Q, I, F> A for TestB<Q, F>
| ^ unconstrained type parameter | ^ unconstrained type parameter
error[E0309]: the parameter type `F` may not live long enough error[E0309]: the parameter type `F` may not live long enough
--> $DIR/issue-88526.rs:16:18 --> $DIR/issue-88526.rs:16:5
| |
LL | type I<'a> = &'a F; LL | type I<'a> = &'a F;
| -- ^^^^^ ...so that the reference type `&'a F` does not outlive the data it points at | ^^^^^^^--^
| | | | |
| the parameter type `F` must be valid for the lifetime `'a` as defined here... | | the parameter type `F` must be valid for the lifetime `'a` as defined here...
| ...so that the reference type `&'a F` does not outlive the data it points at
| |
help: consider adding an explicit lifetime bound help: consider adding an explicit lifetime bound
| |

View File

@@ -18,12 +18,13 @@ LL | type Item<'a> = &'a mut T where Self: 'a;
| ++++++++++++++ | ++++++++++++++
error[E0309]: the parameter type `T` may not live long enough error[E0309]: the parameter type `T` may not live long enough
--> $DIR/issue-84931.rs:14:21 --> $DIR/issue-84931.rs:14:5
| |
LL | type Item<'a> = &'a mut T; LL | type Item<'a> = &'a mut T;
| -- ^^^^^^^^^ ...so that the reference type `&'a mut T` does not outlive the data it points at | ^^^^^^^^^^--^
| | | | |
| the parameter type `T` must be valid for the lifetime `'a` as defined here... | | the parameter type `T` must be valid for the lifetime `'a` as defined here...
| ...so that the reference type `&'a mut T` does not outlive the data it points at
| |
help: consider adding an explicit lifetime bound help: consider adding an explicit lifetime bound
| |

View File

@@ -2,7 +2,7 @@ error: unconstrained generic constant
--> $DIR/evaluatable-bounds.rs:14:5 --> $DIR/evaluatable-bounds.rs:14:5
| |
LL | const ARRAY: [i32; Self::LEN]; LL | const ARRAY: [i32; Self::LEN];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
help: try adding a `where` bound help: try adding a `where` bound
| |

View File

@@ -53,10 +53,10 @@ LL | Ctx<()>: for<'a> BufferUdpStateContext<&'a ()>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `EthernetWorker` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `EthernetWorker`
error[E0277]: the trait bound `for<'a> &'a (): BufferMut` is not satisfied error[E0277]: the trait bound `for<'a> &'a (): BufferMut` is not satisfied
--> $DIR/issue-89118.rs:22:20 --> $DIR/issue-89118.rs:22:5
| |
LL | type Handler = Ctx<C::Dispatcher>; LL | type Handler = Ctx<C::Dispatcher>;
| ^^^^^^^^^^^^^^^^^^ the trait `for<'a> BufferMut` is not implemented for `&'a ()` | ^^^^^^^^^^^^ the trait `for<'a> BufferMut` is not implemented for `&'a ()`
| |
help: this trait has no implementations, consider adding one help: this trait has no implementations, consider adding one
--> $DIR/issue-89118.rs:1:1 --> $DIR/issue-89118.rs:1:1

View File

@@ -1,5 +1,5 @@
error[E0491]: in type `&'a &'b ()`, reference has a longer lifetime than the data it references error[E0491]: in type `&'a &'b ()`, reference has a longer lifetime than the data it references
--> $DIR/impl-header-unnormalized-types.rs:15:18 --> $DIR/impl-header-unnormalized-types.rs:15:5
| |
LL | type Assoc = &'a &'b (); LL | type Assoc = &'a &'b ();
| ^^^^^^^^^^ | ^^^^^^^^^^

View File

@@ -1,8 +1,8 @@
error[E0478]: lifetime bound not satisfied error[E0478]: lifetime bound not satisfied
--> $DIR/lifetime-not-long-enough-suggestion-regression-test-124563.rs:19:16 --> $DIR/lifetime-not-long-enough-suggestion-regression-test-124563.rs:19:5
| |
LL | type Bar = BarImpl<'a, 'b, T>; LL | type Bar = BarImpl<'a, 'b, T>;
| ^^^^^^^^^^^^^^^^^^ | ^^^^^^^^
| |
note: lifetime parameter instantiated with the lifetime `'a` as defined here note: lifetime parameter instantiated with the lifetime `'a` as defined here
--> $DIR/lifetime-not-long-enough-suggestion-regression-test-124563.rs:14:6 --> $DIR/lifetime-not-long-enough-suggestion-regression-test-124563.rs:14:6

View File

@@ -1,8 +1,8 @@
error[E0491]: in type `&'a Foo<'b>`, reference has a longer lifetime than the data it references error[E0491]: in type `&'a Foo<'b>`, reference has a longer lifetime than the data it references
--> $DIR/regions-outlives-nominal-type-region-rev.rs:17:20 --> $DIR/regions-outlives-nominal-type-region-rev.rs:17:9
| |
LL | type Out = &'a Foo<'b>; LL | type Out = &'a Foo<'b>;
| ^^^^^^^^^^^ | ^^^^^^^^
| |
note: the pointer is valid for the lifetime `'a` as defined here note: the pointer is valid for the lifetime `'a` as defined here
--> $DIR/regions-outlives-nominal-type-region-rev.rs:16:10 --> $DIR/regions-outlives-nominal-type-region-rev.rs:16:10

View File

@@ -1,8 +1,8 @@
error[E0491]: in type `&'a Foo<'b>`, reference has a longer lifetime than the data it references error[E0491]: in type `&'a Foo<'b>`, reference has a longer lifetime than the data it references
--> $DIR/regions-outlives-nominal-type-region.rs:17:20 --> $DIR/regions-outlives-nominal-type-region.rs:17:9
| |
LL | type Out = &'a Foo<'b>; LL | type Out = &'a Foo<'b>;
| ^^^^^^^^^^^ | ^^^^^^^^
| |
note: the pointer is valid for the lifetime `'a` as defined here note: the pointer is valid for the lifetime `'a` as defined here
--> $DIR/regions-outlives-nominal-type-region.rs:16:10 --> $DIR/regions-outlives-nominal-type-region.rs:16:10

View File

@@ -1,8 +1,8 @@
error[E0491]: in type `&'a Foo<&'b i32>`, reference has a longer lifetime than the data it references error[E0491]: in type `&'a Foo<&'b i32>`, reference has a longer lifetime than the data it references
--> $DIR/regions-outlives-nominal-type-type-rev.rs:17:20 --> $DIR/regions-outlives-nominal-type-type-rev.rs:17:9
| |
LL | type Out = &'a Foo<&'b i32>; LL | type Out = &'a Foo<&'b i32>;
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^
| |
note: the pointer is valid for the lifetime `'a` as defined here note: the pointer is valid for the lifetime `'a` as defined here
--> $DIR/regions-outlives-nominal-type-type-rev.rs:16:10 --> $DIR/regions-outlives-nominal-type-type-rev.rs:16:10

View File

@@ -1,8 +1,8 @@
error[E0491]: in type `&'a Foo<&'b i32>`, reference has a longer lifetime than the data it references error[E0491]: in type `&'a Foo<&'b i32>`, reference has a longer lifetime than the data it references
--> $DIR/regions-outlives-nominal-type-type.rs:17:20 --> $DIR/regions-outlives-nominal-type-type.rs:17:9
| |
LL | type Out = &'a Foo<&'b i32>; LL | type Out = &'a Foo<&'b i32>;
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^
| |
note: the pointer is valid for the lifetime `'a` as defined here note: the pointer is valid for the lifetime `'a` as defined here
--> $DIR/regions-outlives-nominal-type-type.rs:16:10 --> $DIR/regions-outlives-nominal-type-type.rs:16:10

View File

@@ -1,10 +1,10 @@
error[E0309]: the parameter type `T` may not live long enough error[E0309]: the parameter type `T` may not live long enough
--> $DIR/regions-struct-not-wf.rs:13:16 --> $DIR/regions-struct-not-wf.rs:13:5
| |
LL | impl<'a, T> Trait<'a, T> for usize { LL | impl<'a, T> Trait<'a, T> for usize {
| -- the parameter type `T` must be valid for the lifetime `'a` as defined here... | -- the parameter type `T` must be valid for the lifetime `'a` as defined here...
LL | type Out = &'a T; LL | type Out = &'a T;
| ^^^^^ ...so that the reference type `&'a T` does not outlive the data it points at | ^^^^^^^^ ...so that the reference type `&'a T` does not outlive the data it points at
| |
help: consider adding an explicit lifetime bound help: consider adding an explicit lifetime bound
| |
@@ -12,12 +12,12 @@ LL | impl<'a, T: 'a> Trait<'a, T> for usize {
| ++++ | ++++
error[E0309]: the parameter type `T` may not live long enough error[E0309]: the parameter type `T` may not live long enough
--> $DIR/regions-struct-not-wf.rs:21:16 --> $DIR/regions-struct-not-wf.rs:21:5
| |
LL | impl<'a, T> Trait<'a, T> for u32 { LL | impl<'a, T> Trait<'a, T> for u32 {
| -- the parameter type `T` must be valid for the lifetime `'a` as defined here... | -- the parameter type `T` must be valid for the lifetime `'a` as defined here...
LL | type Out = RefOk<'a, T>; LL | type Out = RefOk<'a, T>;
| ^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds... | ^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds...
| |
note: ...that is required by this bound note: ...that is required by this bound
--> $DIR/regions-struct-not-wf.rs:16:20 --> $DIR/regions-struct-not-wf.rs:16:20
@@ -30,10 +30,10 @@ LL | impl<'a, T: 'a> Trait<'a, T> for u32 {
| ++++ | ++++
error[E0491]: in type `&'a &'b T`, reference has a longer lifetime than the data it references error[E0491]: in type `&'a &'b T`, reference has a longer lifetime than the data it references
--> $DIR/regions-struct-not-wf.rs:25:16 --> $DIR/regions-struct-not-wf.rs:25:5
| |
LL | type Out = &'a &'b T; LL | type Out = &'a &'b T;
| ^^^^^^^^^ | ^^^^^^^^
| |
note: the pointer is valid for the lifetime `'a` as defined here note: the pointer is valid for the lifetime `'a` as defined here
--> $DIR/regions-struct-not-wf.rs:24:6 --> $DIR/regions-struct-not-wf.rs:24:6

View File

@@ -1,8 +1,8 @@
error: unconstrained generic constant error: unconstrained generic constant
--> $DIR/issue-51892.rs:14:17 --> $DIR/issue-51892.rs:14:5
| |
LL | type Type = [u8; std::mem::size_of::<<T as Trait>::Type>()]; LL | type Type = [u8; std::mem::size_of::<<T as Trait>::Type>()];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^
| |
help: try adding a `where` bound help: try adding a `where` bound
| |

View File

@@ -11,10 +11,10 @@ note: required by a bound in `std::iter::IntoIterator::IntoIter`
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
error[E0277]: `&'a T` is not an iterator error[E0277]: `&'a T` is not an iterator
--> $DIR/hir-wf-check-erase-regions.rs:7:21 --> $DIR/hir-wf-check-erase-regions.rs:7:5
| |
LL | type IntoIter = std::iter::Flatten<std::slice::Iter<'a, T>>; LL | type IntoIter = std::iter::Flatten<std::slice::Iter<'a, T>>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `&'a T` is not an iterator | ^^^^^^^^^^^^^ `&'a T` is not an iterator
| |
= help: the trait `Iterator` is not implemented for `&'a T` = help: the trait `Iterator` is not implemented for `&'a T`
= help: the trait `Iterator` is implemented for `&mut I` = help: the trait `Iterator` is implemented for `&mut I`

View File

@@ -1,10 +1,10 @@
error[E0309]: the parameter type `T` may not live long enough error[E0309]: the parameter type `T` may not live long enough
--> $DIR/wf-impl-associated-type-region.rs:10:16 --> $DIR/wf-impl-associated-type-region.rs:10:5
| |
LL | impl<'a, T> Foo<'a> for T { LL | impl<'a, T> Foo<'a> for T {
| -- the parameter type `T` must be valid for the lifetime `'a` as defined here... | -- the parameter type `T` must be valid for the lifetime `'a` as defined here...
LL | type Bar = &'a T; LL | type Bar = &'a T;
| ^^^^^ ...so that the reference type `&'a T` does not outlive the data it points at | ^^^^^^^^ ...so that the reference type `&'a T` does not outlive the data it points at
| |
help: consider adding an explicit lifetime bound help: consider adding an explicit lifetime bound
| |

View File

@@ -1,10 +1,10 @@
error[E0309]: the parameter type `T` may not live long enough error[E0309]: the parameter type `T` may not live long enough
--> $DIR/wf-outlives-ty-in-fn-or-trait.rs:9:16 --> $DIR/wf-outlives-ty-in-fn-or-trait.rs:9:5
| |
LL | impl<'a, T> Trait<'a, T> for usize { LL | impl<'a, T> Trait<'a, T> for usize {
| -- the parameter type `T` must be valid for the lifetime `'a` as defined here... | -- the parameter type `T` must be valid for the lifetime `'a` as defined here...
LL | type Out = &'a fn(T); LL | type Out = &'a fn(T);
| ^^^^^^^^^ ...so that the reference type `&'a fn(T)` does not outlive the data it points at | ^^^^^^^^ ...so that the reference type `&'a fn(T)` does not outlive the data it points at
| |
help: consider adding an explicit lifetime bound help: consider adding an explicit lifetime bound
| |
@@ -12,12 +12,12 @@ LL | impl<'a, T: 'a> Trait<'a, T> for usize {
| ++++ | ++++
error[E0309]: the parameter type `T` may not live long enough error[E0309]: the parameter type `T` may not live long enough
--> $DIR/wf-outlives-ty-in-fn-or-trait.rs:19:16 --> $DIR/wf-outlives-ty-in-fn-or-trait.rs:19:5
| |
LL | impl<'a, T> Trait<'a, T> for u32 { LL | impl<'a, T> Trait<'a, T> for u32 {
| -- the parameter type `T` must be valid for the lifetime `'a` as defined here... | -- the parameter type `T` must be valid for the lifetime `'a` as defined here...
LL | type Out = &'a dyn Baz<T>; LL | type Out = &'a dyn Baz<T>;
| ^^^^^^^^^^^^^^ ...so that the reference type `&'a (dyn Baz<T> + 'a)` does not outlive the data it points at | ^^^^^^^^ ...so that the reference type `&'a (dyn Baz<T> + 'a)` does not outlive the data it points at
| |
help: consider adding an explicit lifetime bound help: consider adding an explicit lifetime bound
| |

View File

@@ -1,11 +1,11 @@
error[E0309]: the associated type `<Self as SomeTrait<'a>>::Type1` may not live long enough error[E0309]: the associated type `<Self as SomeTrait<'a>>::Type1` may not live long enough
--> $DIR/wf-trait-associated-type-region.rs:9:18 --> $DIR/wf-trait-associated-type-region.rs:9:5
| |
LL | trait SomeTrait<'a> { LL | trait SomeTrait<'a> {
| -- the associated type `<Self as SomeTrait<'a>>::Type1` must be valid for the lifetime `'a` as defined here... | -- the associated type `<Self as SomeTrait<'a>>::Type1` must be valid for the lifetime `'a` as defined here...
LL | type Type1; LL | type Type1;
LL | type Type2 = &'a Self::Type1; LL | type Type2 = &'a Self::Type1;
| ^^^^^^^^^^^^^^^ ...so that the reference type `&'a <Self as SomeTrait<'a>>::Type1` does not outlive the data it points at | ^^^^^^^^^^ ...so that the reference type `&'a <Self as SomeTrait<'a>>::Type1` does not outlive the data it points at
| |
help: consider adding an explicit lifetime bound help: consider adding an explicit lifetime bound
| |