Don't eagerly convert principal to string

This commit is contained in:
clubby789 2023-02-17 14:32:08 +00:00
parent b5c8c329a7
commit eebd31c187
4 changed files with 24 additions and 4 deletions

View File

@ -78,7 +78,7 @@ impl<'tcx> LateLintPass<'tcx> for DerefIntoDynSupertrait {
}); });
cx.emit_spanned_lint(DEREF_INTO_DYN_SUPERTRAIT, cx.tcx.def_span(item.owner_id.def_id), SupertraitAsDerefTarget { cx.emit_spanned_lint(DEREF_INTO_DYN_SUPERTRAIT, cx.tcx.def_span(item.owner_id.def_id), SupertraitAsDerefTarget {
t, t,
target_principal: target_principal.to_string(), target_principal,
label, label,
}); });
} }

View File

@ -8,7 +8,7 @@ use rustc_errors::{
}; };
use rustc_hir::def_id::DefId; use rustc_hir::def_id::DefId;
use rustc_macros::{LintDiagnostic, Subdiagnostic}; use rustc_macros::{LintDiagnostic, Subdiagnostic};
use rustc_middle::ty::{Predicate, Ty, TyCtxt}; use rustc_middle::ty::{PolyExistentialTraitRef, Predicate, Ty, TyCtxt};
use rustc_session::parse::ParseSess; use rustc_session::parse::ParseSess;
use rustc_span::{edition::Edition, sym, symbol::Ident, Span, Symbol}; use rustc_span::{edition::Edition, sym, symbol::Ident, Span, Symbol};
@ -556,8 +556,7 @@ pub struct BuiltinUnexpectedCliConfigValue {
#[diag(lint_supertrait_as_deref_target)] #[diag(lint_supertrait_as_deref_target)]
pub struct SupertraitAsDerefTarget<'a> { pub struct SupertraitAsDerefTarget<'a> {
pub t: Ty<'a>, pub t: Ty<'a>,
pub target_principal: String, pub target_principal: PolyExistentialTraitRef<'a>,
// pub target_principal: Binder<'a, ExistentialTraitRef<'b>>,
#[subdiagnostic] #[subdiagnostic]
pub label: Option<SupertraitAsDerefTargetLabel>, pub label: Option<SupertraitAsDerefTargetLabel>,
} }

View File

@ -933,6 +933,12 @@ impl<'tcx> PolyExistentialTraitRef<'tcx> {
} }
} }
impl rustc_errors::IntoDiagnosticArg for PolyExistentialTraitRef<'_> {
fn into_diagnostic_arg(self) -> rustc_errors::DiagnosticArgValue<'static> {
self.to_string().into_diagnostic_arg()
}
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, TyEncodable, TyDecodable)] #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, TyEncodable, TyDecodable)]
#[derive(HashStable)] #[derive(HashStable)]
pub enum BoundVariableKind { pub enum BoundVariableKind {

View File

@ -0,0 +1,15 @@
// check-pass
// check that `deref_into_dyn_supertrait` doesn't cause ICE by eagerly converting
// a cancelled lint
#![allow(deref_into_dyn_supertrait)]
trait Trait {}
impl std::ops::Deref for dyn Trait + Send + Sync {
type Target = dyn Trait;
fn deref(&self) -> &Self::Target {
self
}
}
fn main() {}