Skip to content

Commit cbf4781

Browse files
committed
Tweak logic to account for methods implemented on trait
1 parent aebcb29 commit cbf4781

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

compiler/rustc_borrowck/src/diagnostics/region_errors.rs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -637,11 +637,28 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
637637
return;
638638
};
639639
let def_id = instance.def_id();
640-
let parent = tcx.parent(def_id);
641-
let hir::def::DefKind::Impl { .. } = tcx.def_kind(parent) else {
642-
return;
643-
};
644-
let ty = tcx.type_of(parent).instantiate(tcx, instance.args);
640+
let mut parent = tcx.parent(def_id);
641+
match tcx.def_kind(parent) {
642+
hir::def::DefKind::Impl { .. } => {}
643+
hir::def::DefKind::Trait => {
644+
let Some(ty) = args.get(0).and_then(|arg| arg.as_type()) else {
645+
return;
646+
};
647+
let mut impls = vec![];
648+
tcx.for_each_relevant_impl(parent, ty, |id| {
649+
impls.push(id);
650+
});
651+
if let [def_id] = impls[..] {
652+
// The method we have is on the trait, but for `parent` we want to analyze the
653+
// relevant impl instead.
654+
parent = def_id;
655+
} else {
656+
return;
657+
};
658+
}
659+
_ => return,
660+
}
661+
let ty = tcx.type_of(parent).instantiate_identity();
645662
if self.to_error_region(outlived_fr) != Some(tcx.lifetimes.re_static) {
646663
return;
647664
}
@@ -723,7 +740,6 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
723740
}),
724741
..
725742
})) = tcx.hir().get_if_local(parent)
726-
&& let Some(hir::Node::ImplItem(hir::ImplItem { .. })) = tcx.hir().get_if_local(def_id)
727743
{
728744
let suggestion = match lt.res {
729745
hir::LifetimeName::ImplicitObjectLifetimeDefault if predicates.is_empty() => {

tests/ui/suggestions/impl-on-dyn-trait-with-implicit-static-bound.stderr

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ LL | fn use_self(&self) -> &() { panic!() }
6969
...
7070
LL | impl MyTrait for dyn ObjectTrait {}
7171
| ^^^^^^^^^^^ this has an implicit `'static` lifetime requirement
72+
help: consider relaxing the implicit `'static` requirement on the impl
73+
|
74+
LL | impl MyTrait for dyn ObjectTrait + '_ {}
75+
| ++++
7276

7377
error[E0521]: borrowed data escapes outside of function
7478
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:112:9
@@ -91,6 +95,10 @@ LL | fn use_self(&self) -> &() { panic!() }
9195
...
9296
LL | impl MyTrait for dyn ObjectTrait {}
9397
| ^^^^^^^^^^^ this has an implicit `'static` lifetime requirement
98+
help: consider relaxing the implicit `'static` requirement on the impl
99+
|
100+
LL | impl MyTrait for dyn ObjectTrait + '_ {}
101+
| ++++
94102

95103
error[E0521]: borrowed data escapes outside of function
96104
--> $DIR/impl-on-dyn-trait-with-implicit-static-bound.rs:38:9

0 commit comments

Comments
 (0)