Skip to content

Commit 74edf83

Browse files
committed
Tweak logic to account for methods implemented on trait
1 parent 2bab9e6 commit 74edf83

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

compiler/rustc_borrowck/src/diagnostics/region_errors.rs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -634,11 +634,26 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
634634
return;
635635
};
636636
let def_id = instance.def_id();
637-
let parent = tcx.parent(def_id);
638-
let hir::def::DefKind::Impl { .. } = tcx.def_kind(parent) else {
639-
return;
640-
};
641-
let ty = tcx.type_of(parent).instantiate(tcx, instance.args);
637+
let mut parent = tcx.parent(def_id);
638+
match tcx.def_kind(parent) {
639+
hir::def::DefKind::Impl { .. } => {}
640+
hir::def::DefKind::Trait => {
641+
let Some(ty) = args.get(0).and_then(|arg| arg.as_type()) else {
642+
return;
643+
};
644+
let mut impls = vec![];
645+
tcx.for_each_relevant_impl(parent, ty, |id| { impls.push(id); });
646+
if let [def_id] = impls[..] {
647+
// The method we have is on the trait, but for `parent` we want to analyze the
648+
// relevant impl instead.
649+
parent = def_id;
650+
} else {
651+
return;
652+
};
653+
}
654+
_ => return,
655+
}
656+
let ty = tcx.type_of(parent).instantiate_identity();
642657
if self.to_error_region(outlived_fr) != Some(tcx.lifetimes.re_static) {
643658
return;
644659
}
@@ -719,9 +734,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
719734
..
720735
}),
721736
..
722-
})) = tcx.hir().get_if_local(parent)
723-
&& let Some(hir::Node::ImplItem(hir::ImplItem { .. })) = tcx.hir().get_if_local(def_id)
724-
{
737+
})) = tcx.hir().get_if_local(parent) {
725738
let suggestion = match lt.res {
726739
hir::LifetimeName::ImplicitObjectLifetimeDefault if predicates.is_empty() => {
727740
// `impl dyn Trait {}`

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)