Rollup merge of #129527 - compiler-errors:lint-nit, r=Nadrieril

Don't use `TyKind` in a lint

Allows us to remove an inherent method from `TyKind` from the type ir crate.
This commit is contained in:
Matthias Krüger 2024-08-31 10:08:53 +02:00 committed by GitHub
commit 2a321e14a5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 14 additions and 20 deletions

View File

@ -265,8 +265,6 @@ fn structurally_same_type_impl<'tcx>(
} else { } else {
// Do a full, depth-first comparison between the two. // Do a full, depth-first comparison between the two.
use rustc_type_ir::TyKind::*; use rustc_type_ir::TyKind::*;
let a_kind = a.kind();
let b_kind = b.kind();
let compare_layouts = |a, b| -> Result<bool, &'tcx LayoutError<'tcx>> { let compare_layouts = |a, b| -> Result<bool, &'tcx LayoutError<'tcx>> {
debug!("compare_layouts({:?}, {:?})", a, b); debug!("compare_layouts({:?}, {:?})", a, b);
@ -281,12 +279,11 @@ fn structurally_same_type_impl<'tcx>(
Ok(a_layout == b_layout) Ok(a_layout == b_layout)
}; };
#[allow(rustc::usage_of_ty_tykind)]
let is_primitive_or_pointer = let is_primitive_or_pointer =
|kind: &ty::TyKind<'_>| kind.is_primitive() || matches!(kind, RawPtr(..) | Ref(..)); |ty: Ty<'tcx>| ty.is_primitive() || matches!(ty.kind(), RawPtr(..) | Ref(..));
ensure_sufficient_stack(|| { ensure_sufficient_stack(|| {
match (a_kind, b_kind) { match (a.kind(), b.kind()) {
(Adt(a_def, _), Adt(b_def, _)) => { (Adt(a_def, _), Adt(b_def, _)) => {
// We can immediately rule out these types as structurally same if // We can immediately rule out these types as structurally same if
// their layouts differ. // their layouts differ.
@ -382,17 +379,21 @@ fn structurally_same_type_impl<'tcx>(
// An Adt and a primitive or pointer type. This can be FFI-safe if non-null // An Adt and a primitive or pointer type. This can be FFI-safe if non-null
// enum layout optimisation is being applied. // enum layout optimisation is being applied.
(Adt(..), other_kind) | (other_kind, Adt(..)) (Adt(..), _) if is_primitive_or_pointer(b) => {
if is_primitive_or_pointer(other_kind) => if let Some(ty) = types::repr_nullable_ptr(tcx, param_env, a, ckind) {
{ ty == b
let (primitive, adt) =
if is_primitive_or_pointer(a.kind()) { (a, b) } else { (b, a) };
if let Some(ty) = types::repr_nullable_ptr(tcx, param_env, adt, ckind) {
ty == primitive
} else { } else {
compare_layouts(a, b).unwrap_or(false) compare_layouts(a, b).unwrap_or(false)
} }
} }
(_, Adt(..)) if is_primitive_or_pointer(a) => {
if let Some(ty) = types::repr_nullable_ptr(tcx, param_env, b, ckind) {
ty == a
} else {
compare_layouts(a, b).unwrap_or(false)
}
}
// Otherwise, just compare the layouts. This may fail to lint for some // Otherwise, just compare the layouts. This may fail to lint for some
// incompatible types, but at the very least, will stop reads into // incompatible types, but at the very least, will stop reads into
// uninitialised memory. // uninitialised memory.

View File

@ -1000,7 +1000,7 @@ impl<'tcx> Ty<'tcx> {
#[inline] #[inline]
pub fn is_primitive(self) -> bool { pub fn is_primitive(self) -> bool {
self.kind().is_primitive() matches!(self.kind(), Bool | Char | Int(_) | Uint(_) | Float(_))
} }
#[inline] #[inline]

View File

@ -254,13 +254,6 @@ pub enum TyKind<I: Interner> {
Error(I::ErrorGuaranteed), Error(I::ErrorGuaranteed),
} }
impl<I: Interner> TyKind<I> {
#[inline]
pub fn is_primitive(&self) -> bool {
matches!(self, Bool | Char | Int(_) | Uint(_) | Float(_))
}
}
// This is manually implemented because a derive would require `I: Debug` // This is manually implemented because a derive would require `I: Debug`
impl<I: Interner> fmt::Debug for TyKind<I> { impl<I: Interner> fmt::Debug for TyKind<I> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {