use crate::{LateContext, LateLintPass, LintContext};
-use rustc_errors::DelayDm;
use rustc_hir as hir;
use rustc_span::sym;
impl<'tcx> LateLintPass<'tcx> for MultipleSupertraitUpcastable {
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'tcx>) {
let def_id = item.owner_id.to_def_id();
+ // NOTE(nbdd0121): use `object_safety_violations` instead of `check_is_object_safe` because
+ // the latter will report `where_clause_object_safety` lint.
if let hir::ItemKind::Trait(_, _, _, _, _) = item.kind
- && cx.tcx.is_object_safe(def_id)
+ && cx.tcx.object_safety_violations(def_id).is_empty()
{
let direct_super_traits_iter = cx.tcx
.super_predicates_of(def_id)
.into_iter()
.filter_map(|(pred, _)| pred.to_opt_poly_trait_pred());
if direct_super_traits_iter.count() > 1 {
- cx.struct_span_lint(
+ cx.emit_spanned_lint(
MULTIPLE_SUPERTRAIT_UPCASTABLE,
cx.tcx.def_span(def_id),
- DelayDm(|| {
- format!(
- "`{}` is object-safe and has multiple supertraits",
- item.ident,
- )
- }),
- |diag| diag,
+ crate::lints::MultipleSupertraitUpcastable {
+ ident: item.ident
+ },
);
}
}