Use nicer spans for deref_into_dyn_supertrait

This commit is contained in:
Maybe Waffle 2022-11-23 16:12:51 +00:00
parent 0d4a5c725a
commit 20f3de5ab1
3 changed files with 17 additions and 13 deletions

View File

@ -3,6 +3,7 @@ use crate::{LateContext, LateLintPass, LintContext};
use rustc_errors::DelayDm; use rustc_errors::DelayDm;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_middle::{traits::util::supertraits, ty}; use rustc_middle::{traits::util::supertraits, ty};
use rustc_span::sym;
declare_lint! { declare_lint! {
/// The `deref_into_dyn_supertrait` lint is output whenever there is a use of the /// The `deref_into_dyn_supertrait` lint is output whenever there is a use of the
@ -72,13 +73,19 @@ impl<'tcx> LateLintPass<'tcx> for DerefIntoDynSupertrait {
{ {
cx.struct_span_lint( cx.struct_span_lint(
DEREF_INTO_DYN_SUPERTRAIT, DEREF_INTO_DYN_SUPERTRAIT,
item.span, cx.tcx.def_span(item.owner_id.def_id),
DelayDm(|| { DelayDm(|| {
format!( format!(
"`{t}` implements `Deref` with supertrait `{target_principal}` as output" "`{t}` implements `Deref` with supertrait `{target_principal}` as target"
) )
}), }),
|lint| lint, |lint| {
if let Some(target_span) = impl_.items.iter().find_map(|i| (i.ident.name == sym::Target).then_some(i.span)) {
lint.span_label(target_span, "target type is set here");
}
lint
},
) )
} }
} }

View File

@ -9,7 +9,7 @@ trait A {}
trait B: A {} trait B: A {}
impl<'a> Deref for dyn 'a + B { impl<'a> Deref for dyn 'a + B {
//~^ ERROR `(dyn B + 'a)` implements `Deref` with supertrait `A` as output //~^ ERROR `(dyn B + 'a)` implements `Deref` with supertrait `A` as target
//~| WARN this was previously accepted by the compiler but is being phased out; //~| WARN this was previously accepted by the compiler but is being phased out;
type Target = dyn A; type Target = dyn A;

View File

@ -1,14 +1,11 @@
error: `(dyn B + 'a)` implements `Deref` with supertrait `A` as output error: `(dyn B + 'a)` implements `Deref` with supertrait `A` as target
--> $DIR/migrate-lint-deny.rs:11:1 --> $DIR/migrate-lint-deny.rs:11:1
| |
LL | / impl<'a> Deref for dyn 'a + B { LL | impl<'a> Deref for dyn 'a + B {
LL | | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
LL | | ...
LL | | LL | type Target = dyn A;
... | | -------------------- target type is set here
LL | | }
LL | | }
| |_^
| |
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #89460 <https://github.com/rust-lang/rust/issues/89460> = note: for more information, see issue #89460 <https://github.com/rust-lang/rust/issues/89460>