mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
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:
commit
2a321e14a5
@ -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.
|
||||||
|
@ -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]
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user