Rollup merge of #134285 - oli-obk:push-vwrqsqlwnuxo, r=Urgau
Add some convenience helper methods on `hir::Safety` Makes a lot of call sites simpler and should make any refactorings needed for https://github.com/rust-lang/rust/pull/134090#issuecomment-2541332415 simpler, as fewer sites have to be touched in case we end up storing some information in the variants of `hir::Safety`
This commit is contained in:
commit
d48af09ffd
28 changed files with 74 additions and 70 deletions
|
@ -6,7 +6,7 @@ use rustc_errors::{DiagMessage, SubdiagMessage, struct_span_code_err};
|
||||||
use rustc_hir::def::DefKind;
|
use rustc_hir::def::DefKind;
|
||||||
use rustc_hir::def_id::{DefId, LOCAL_CRATE, LocalDefId};
|
use rustc_hir::def_id::{DefId, LOCAL_CRATE, LocalDefId};
|
||||||
use rustc_hir::weak_lang_items::WEAK_LANG_ITEMS;
|
use rustc_hir::weak_lang_items::WEAK_LANG_ITEMS;
|
||||||
use rustc_hir::{self as hir, HirId, LangItem, lang_items};
|
use rustc_hir::{HirId, LangItem, lang_items};
|
||||||
use rustc_middle::middle::codegen_fn_attrs::{
|
use rustc_middle::middle::codegen_fn_attrs::{
|
||||||
CodegenFnAttrFlags, CodegenFnAttrs, PatchableFunctionEntry,
|
CodegenFnAttrFlags, CodegenFnAttrs, PatchableFunctionEntry,
|
||||||
};
|
};
|
||||||
|
@ -251,7 +251,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, did: LocalDefId) -> CodegenFnAttrs {
|
||||||
sym::target_feature => {
|
sym::target_feature => {
|
||||||
if !tcx.is_closure_like(did.to_def_id())
|
if !tcx.is_closure_like(did.to_def_id())
|
||||||
&& let Some(fn_sig) = fn_sig()
|
&& let Some(fn_sig) = fn_sig()
|
||||||
&& fn_sig.skip_binder().safety() == hir::Safety::Safe
|
&& fn_sig.skip_binder().safety().is_safe()
|
||||||
{
|
{
|
||||||
if tcx.sess.target.is_like_wasm || tcx.sess.opts.actually_rustdoc {
|
if tcx.sess.target.is_like_wasm || tcx.sess.opts.actually_rustdoc {
|
||||||
// The `#[target_feature]` attribute is allowed on
|
// The `#[target_feature]` attribute is allowed on
|
||||||
|
|
|
@ -57,9 +57,8 @@ fn is_promotable_const_fn(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
|
||||||
Some(stab) => {
|
Some(stab) => {
|
||||||
if cfg!(debug_assertions) && stab.promotable {
|
if cfg!(debug_assertions) && stab.promotable {
|
||||||
let sig = tcx.fn_sig(def_id);
|
let sig = tcx.fn_sig(def_id);
|
||||||
assert_eq!(
|
assert!(
|
||||||
sig.skip_binder().safety(),
|
sig.skip_binder().safety().is_safe(),
|
||||||
hir::Safety::Safe,
|
|
||||||
"don't mark const unsafe fns as promotable",
|
"don't mark const unsafe fns as promotable",
|
||||||
// https://github.com/rust-lang/rust/pull/53851#issuecomment-418760682
|
// https://github.com/rust-lang/rust/pull/53851#issuecomment-418760682
|
||||||
);
|
);
|
||||||
|
|
|
@ -3434,6 +3434,19 @@ impl Safety {
|
||||||
Self::Safe => "",
|
Self::Safe => "",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn is_unsafe(self) -> bool {
|
||||||
|
!self.is_safe()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn is_safe(self) -> bool {
|
||||||
|
match self {
|
||||||
|
Self::Unsafe => false,
|
||||||
|
Self::Safe => true,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for Safety {
|
impl fmt::Display for Safety {
|
||||||
|
@ -3478,7 +3491,7 @@ impl FnHeader {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_unsafe(&self) -> bool {
|
pub fn is_unsafe(&self) -> bool {
|
||||||
matches!(&self.safety, Safety::Unsafe)
|
self.safety.is_unsafe()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ use rustc_data_structures::unord::{UnordMap, UnordSet};
|
||||||
use rustc_errors::MultiSpan;
|
use rustc_errors::MultiSpan;
|
||||||
use rustc_errors::codes::*;
|
use rustc_errors::codes::*;
|
||||||
use rustc_hir::def::{CtorKind, DefKind};
|
use rustc_hir::def::{CtorKind, DefKind};
|
||||||
use rustc_hir::{Node, Safety, intravisit};
|
use rustc_hir::{Node, intravisit};
|
||||||
use rustc_infer::infer::{RegionVariableOrigin, TyCtxtInferExt};
|
use rustc_infer::infer::{RegionVariableOrigin, TyCtxtInferExt};
|
||||||
use rustc_infer::traits::{Obligation, ObligationCauseCode};
|
use rustc_infer::traits::{Obligation, ObligationCauseCode};
|
||||||
use rustc_lint_defs::builtin::{
|
use rustc_lint_defs::builtin::{
|
||||||
|
@ -161,7 +161,7 @@ fn check_unsafe_fields(tcx: TyCtxt<'_>, item_def_id: LocalDefId) {
|
||||||
};
|
};
|
||||||
let typing_env = ty::TypingEnv::non_body_analysis(tcx, item_def_id);
|
let typing_env = ty::TypingEnv::non_body_analysis(tcx, item_def_id);
|
||||||
for field in def.all_fields() {
|
for field in def.all_fields() {
|
||||||
if field.safety != Safety::Unsafe {
|
if !field.safety.is_unsafe() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let Ok(field_ty) = tcx.try_normalize_erasing_regions(typing_env, field.ty(tcx, args))
|
let Ok(field_ty) = tcx.try_normalize_erasing_regions(typing_env, field.ty(tcx, args))
|
||||||
|
|
|
@ -863,7 +863,8 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
|
||||||
let outer_universe = self.infcx.universe();
|
let outer_universe = self.infcx.universe();
|
||||||
|
|
||||||
let result = if let ty::FnPtr(_, hdr_b) = b.kind()
|
let result = if let ty::FnPtr(_, hdr_b) = b.kind()
|
||||||
&& let (hir::Safety::Safe, hir::Safety::Unsafe) = (fn_ty_a.safety(), hdr_b.safety)
|
&& fn_ty_a.safety().is_safe()
|
||||||
|
&& hdr_b.safety.is_unsafe()
|
||||||
{
|
{
|
||||||
let unsafe_a = self.tcx.safe_to_unsafe_fn_ty(fn_ty_a);
|
let unsafe_a = self.tcx.safe_to_unsafe_fn_ty(fn_ty_a);
|
||||||
self.unify_and(unsafe_a, b, to_unsafe)
|
self.unify_and(unsafe_a, b, to_unsafe)
|
||||||
|
@ -925,7 +926,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
|
||||||
|
|
||||||
// Safe `#[target_feature]` functions are not assignable to safe fn pointers (RFC 2396).
|
// Safe `#[target_feature]` functions are not assignable to safe fn pointers (RFC 2396).
|
||||||
|
|
||||||
if b_hdr.safety == hir::Safety::Safe
|
if b_hdr.safety.is_safe()
|
||||||
&& !self.tcx.codegen_fn_attrs(def_id).target_features.is_empty()
|
&& !self.tcx.codegen_fn_attrs(def_id).target_features.is_empty()
|
||||||
{
|
{
|
||||||
return Err(TypeError::TargetFeatureCast(def_id));
|
return Err(TypeError::TargetFeatureCast(def_id));
|
||||||
|
|
|
@ -762,7 +762,7 @@ fn compute_unsafe_infer_vars<'a, 'tcx>(
|
||||||
if let Some(def_id) = typeck_results.type_dependent_def_id(ex.hir_id)
|
if let Some(def_id) = typeck_results.type_dependent_def_id(ex.hir_id)
|
||||||
&& let method_ty = self.fcx.tcx.type_of(def_id).instantiate_identity()
|
&& let method_ty = self.fcx.tcx.type_of(def_id).instantiate_identity()
|
||||||
&& let sig = method_ty.fn_sig(self.fcx.tcx)
|
&& let sig = method_ty.fn_sig(self.fcx.tcx)
|
||||||
&& let hir::Safety::Unsafe = sig.safety()
|
&& sig.safety().is_unsafe()
|
||||||
{
|
{
|
||||||
let mut collector = InferVarCollector {
|
let mut collector = InferVarCollector {
|
||||||
value: (ex.hir_id, ex.span, UnsafeUseReason::Method),
|
value: (ex.hir_id, ex.span, UnsafeUseReason::Method),
|
||||||
|
@ -782,7 +782,7 @@ fn compute_unsafe_infer_vars<'a, 'tcx>(
|
||||||
|
|
||||||
if func_ty.is_fn()
|
if func_ty.is_fn()
|
||||||
&& let sig = func_ty.fn_sig(self.fcx.tcx)
|
&& let sig = func_ty.fn_sig(self.fcx.tcx)
|
||||||
&& let hir::Safety::Unsafe = sig.safety()
|
&& sig.safety().is_unsafe()
|
||||||
{
|
{
|
||||||
let mut collector = InferVarCollector {
|
let mut collector = InferVarCollector {
|
||||||
value: (ex.hir_id, ex.span, UnsafeUseReason::Call),
|
value: (ex.hir_id, ex.span, UnsafeUseReason::Call),
|
||||||
|
@ -813,7 +813,7 @@ fn compute_unsafe_infer_vars<'a, 'tcx>(
|
||||||
// `is_fn` excludes closures, but those can't be unsafe.
|
// `is_fn` excludes closures, but those can't be unsafe.
|
||||||
if ty.is_fn()
|
if ty.is_fn()
|
||||||
&& let sig = ty.fn_sig(self.fcx.tcx)
|
&& let sig = ty.fn_sig(self.fcx.tcx)
|
||||||
&& let hir::Safety::Unsafe = sig.safety()
|
&& sig.safety().is_unsafe()
|
||||||
{
|
{
|
||||||
let mut collector = InferVarCollector {
|
let mut collector = InferVarCollector {
|
||||||
value: (ex.hir_id, ex.span, UnsafeUseReason::Path),
|
value: (ex.hir_id, ex.span, UnsafeUseReason::Path),
|
||||||
|
|
|
@ -586,7 +586,7 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn trait_is_unsafe(self, trait_def_id: Self::DefId) -> bool {
|
fn trait_is_unsafe(self, trait_def_id: Self::DefId) -> bool {
|
||||||
self.trait_def(trait_def_id).safety == hir::Safety::Unsafe
|
self.trait_def(trait_def_id).safety.is_unsafe()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_impl_trait_in_trait(self, def_id: DefId) -> bool {
|
fn is_impl_trait_in_trait(self, def_id: DefId) -> bool {
|
||||||
|
@ -722,7 +722,7 @@ impl<'tcx> rustc_type_ir::inherent::Safety<TyCtxt<'tcx>> for hir::Safety {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_safe(self) -> bool {
|
fn is_safe(self) -> bool {
|
||||||
matches!(self, hir::Safety::Safe)
|
self.is_safe()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prefix_str(self) -> &'static str {
|
fn prefix_str(self) -> &'static str {
|
||||||
|
@ -2521,7 +2521,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||||
/// that is, a `fn` type that is equivalent in every way for being
|
/// that is, a `fn` type that is equivalent in every way for being
|
||||||
/// unsafe.
|
/// unsafe.
|
||||||
pub fn safe_to_unsafe_fn_ty(self, sig: PolyFnSig<'tcx>) -> Ty<'tcx> {
|
pub fn safe_to_unsafe_fn_ty(self, sig: PolyFnSig<'tcx>) -> Ty<'tcx> {
|
||||||
assert_eq!(sig.safety(), hir::Safety::Safe);
|
assert!(sig.safety().is_safe());
|
||||||
Ty::new_fn_ptr(self, sig.map_bound(|sig| ty::FnSig { safety: hir::Safety::Unsafe, ..sig }))
|
Ty::new_fn_ptr(self, sig.map_bound(|sig| ty::FnSig { safety: hir::Safety::Unsafe, ..sig }))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,9 +33,9 @@ use rustc_data_structures::intern::Interned;
|
||||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||||
use rustc_data_structures::steal::Steal;
|
use rustc_data_structures::steal::Steal;
|
||||||
use rustc_errors::{Diag, ErrorGuaranteed, StashKey};
|
use rustc_errors::{Diag, ErrorGuaranteed, StashKey};
|
||||||
|
use rustc_hir::LangItem;
|
||||||
use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
|
use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
|
||||||
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
|
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
|
||||||
use rustc_hir::{LangItem, Safety};
|
|
||||||
use rustc_index::IndexVec;
|
use rustc_index::IndexVec;
|
||||||
use rustc_macros::{
|
use rustc_macros::{
|
||||||
Decodable, Encodable, HashStable, TyDecodable, TyEncodable, TypeFoldable, TypeVisitable,
|
Decodable, Encodable, HashStable, TyDecodable, TyEncodable, TypeFoldable, TypeVisitable,
|
||||||
|
@ -1281,7 +1281,7 @@ impl VariantDef {
|
||||||
|
|
||||||
/// Returns whether this variant has unsafe fields.
|
/// Returns whether this variant has unsafe fields.
|
||||||
pub fn has_unsafe_fields(&self) -> bool {
|
pub fn has_unsafe_fields(&self) -> bool {
|
||||||
self.fields.iter().any(|x| x.safety == Safety::Unsafe)
|
self.fields.iter().any(|x| x.safety.is_unsafe())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1291,7 +1291,7 @@ impl<'tcx> Ty<'tcx> {
|
||||||
/// Checks whether this type is an ADT that has unsafe fields.
|
/// Checks whether this type is an ADT that has unsafe fields.
|
||||||
pub fn has_unsafe_fields(self) -> bool {
|
pub fn has_unsafe_fields(self) -> bool {
|
||||||
if let ty::Adt(adt_def, ..) = self.kind() {
|
if let ty::Adt(adt_def, ..) = self.kind() {
|
||||||
adt_def.all_fields().any(|x| x.safety == hir::Safety::Unsafe)
|
adt_def.all_fields().any(|x| x.safety.is_unsafe())
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ use std::ops::Bound;
|
||||||
|
|
||||||
use rustc_errors::DiagArgValue;
|
use rustc_errors::DiagArgValue;
|
||||||
use rustc_hir::def::DefKind;
|
use rustc_hir::def::DefKind;
|
||||||
use rustc_hir::{self as hir, BindingMode, ByRef, HirId, Mutability, Safety};
|
use rustc_hir::{self as hir, BindingMode, ByRef, HirId, Mutability};
|
||||||
use rustc_middle::middle::codegen_fn_attrs::TargetFeature;
|
use rustc_middle::middle::codegen_fn_attrs::TargetFeature;
|
||||||
use rustc_middle::mir::BorrowKind;
|
use rustc_middle::mir::BorrowKind;
|
||||||
use rustc_middle::span_bug;
|
use rustc_middle::span_bug;
|
||||||
|
@ -342,7 +342,7 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
|
||||||
PatKind::Leaf { subpatterns, .. } => {
|
PatKind::Leaf { subpatterns, .. } => {
|
||||||
if let ty::Adt(adt_def, ..) = pat.ty.kind() {
|
if let ty::Adt(adt_def, ..) = pat.ty.kind() {
|
||||||
for pat in subpatterns {
|
for pat in subpatterns {
|
||||||
if adt_def.non_enum_variant().fields[pat.field].safety == Safety::Unsafe {
|
if adt_def.non_enum_variant().fields[pat.field].safety.is_unsafe() {
|
||||||
self.requires_unsafe(pat.pattern.span, UseOfUnsafeField);
|
self.requires_unsafe(pat.pattern.span, UseOfUnsafeField);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -367,7 +367,7 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
|
||||||
PatKind::Variant { adt_def, args: _, variant_index, subpatterns } => {
|
PatKind::Variant { adt_def, args: _, variant_index, subpatterns } => {
|
||||||
for pat in subpatterns {
|
for pat in subpatterns {
|
||||||
let field = &pat.field;
|
let field = &pat.field;
|
||||||
if adt_def.variant(*variant_index).fields[*field].safety == Safety::Unsafe {
|
if adt_def.variant(*variant_index).fields[*field].safety.is_unsafe() {
|
||||||
self.requires_unsafe(pat.pattern.span, UseOfUnsafeField);
|
self.requires_unsafe(pat.pattern.span, UseOfUnsafeField);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -479,7 +479,7 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
|
||||||
return; // don't visit the whole expression
|
return; // don't visit the whole expression
|
||||||
}
|
}
|
||||||
ExprKind::Call { fun, ty: _, args: _, from_hir_call: _, fn_span: _ } => {
|
ExprKind::Call { fun, ty: _, args: _, from_hir_call: _, fn_span: _ } => {
|
||||||
if self.thir[fun].ty.fn_sig(self.tcx).safety() == hir::Safety::Unsafe {
|
if self.thir[fun].ty.fn_sig(self.tcx).safety().is_unsafe() {
|
||||||
let func_id = if let ty::FnDef(func_id, _) = self.thir[fun].ty.kind() {
|
let func_id = if let ty::FnDef(func_id, _) = self.thir[fun].ty.kind() {
|
||||||
Some(*func_id)
|
Some(*func_id)
|
||||||
} else {
|
} else {
|
||||||
|
@ -623,7 +623,7 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
|
||||||
ExprKind::Field { lhs, variant_index, name } => {
|
ExprKind::Field { lhs, variant_index, name } => {
|
||||||
let lhs = &self.thir[lhs];
|
let lhs = &self.thir[lhs];
|
||||||
if let ty::Adt(adt_def, _) = lhs.ty.kind() {
|
if let ty::Adt(adt_def, _) = lhs.ty.kind() {
|
||||||
if adt_def.variant(variant_index).fields[name].safety == Safety::Unsafe {
|
if adt_def.variant(variant_index).fields[name].safety.is_unsafe() {
|
||||||
self.requires_unsafe(expr.span, UseOfUnsafeField);
|
self.requires_unsafe(expr.span, UseOfUnsafeField);
|
||||||
} else if adt_def.is_union() {
|
} else if adt_def.is_union() {
|
||||||
if let Some(assigned_ty) = self.assignment_info {
|
if let Some(assigned_ty) = self.assignment_info {
|
||||||
|
@ -1112,11 +1112,7 @@ pub(crate) fn check_unsafety(tcx: TyCtxt<'_>, def: LocalDefId) {
|
||||||
|
|
||||||
let hir_id = tcx.local_def_id_to_hir_id(def);
|
let hir_id = tcx.local_def_id_to_hir_id(def);
|
||||||
let safety_context = tcx.hir().fn_sig_by_hir_id(hir_id).map_or(SafetyContext::Safe, |fn_sig| {
|
let safety_context = tcx.hir().fn_sig_by_hir_id(hir_id).map_or(SafetyContext::Safe, |fn_sig| {
|
||||||
if fn_sig.header.safety == hir::Safety::Unsafe {
|
if fn_sig.header.safety.is_unsafe() { SafetyContext::UnsafeFn } else { SafetyContext::Safe }
|
||||||
SafetyContext::UnsafeFn
|
|
||||||
} else {
|
|
||||||
SafetyContext::Safe
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
let body_target_features = &tcx.body_codegen_attrs(def.to_def_id()).target_features;
|
let body_target_features = &tcx.body_codegen_attrs(def.to_def_id()).target_features;
|
||||||
let mut warnings = Vec::new();
|
let mut warnings = Vec::new();
|
||||||
|
|
|
@ -715,7 +715,8 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
||||||
attrs: &[Attribute],
|
attrs: &[Attribute],
|
||||||
) {
|
) {
|
||||||
match target {
|
match target {
|
||||||
Target::Fn => {
|
Target::Method(MethodKind::Trait { body: true } | MethodKind::Inherent)
|
||||||
|
| Target::Fn => {
|
||||||
// `#[target_feature]` is not allowed in lang items.
|
// `#[target_feature]` is not allowed in lang items.
|
||||||
if let Some((lang_item, _)) = hir::lang_items::extract(attrs)
|
if let Some((lang_item, _)) = hir::lang_items::extract(attrs)
|
||||||
// Calling functions with `#[target_feature]` is
|
// Calling functions with `#[target_feature]` is
|
||||||
|
@ -732,7 +733,6 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Target::Method(MethodKind::Trait { body: true } | MethodKind::Inherent) => {}
|
|
||||||
// FIXME: #[target_feature] was previously erroneously allowed on statements and some
|
// FIXME: #[target_feature] was previously erroneously allowed on statements and some
|
||||||
// crates used this, so only emit a warning.
|
// crates used this, so only emit a warning.
|
||||||
Target::Statement => {
|
Target::Statement => {
|
||||||
|
|
|
@ -439,7 +439,7 @@ impl<'tcx> Printer<'tcx> for SymbolMangler<'tcx> {
|
||||||
let sig = sig_tys.with(hdr);
|
let sig = sig_tys.with(hdr);
|
||||||
self.push("F");
|
self.push("F");
|
||||||
self.in_binder(&sig, |cx, sig| {
|
self.in_binder(&sig, |cx, sig| {
|
||||||
if sig.safety == hir::Safety::Unsafe {
|
if sig.safety.is_unsafe() {
|
||||||
cx.push("U");
|
cx.push("U");
|
||||||
}
|
}
|
||||||
match sig.abi {
|
match sig.abi {
|
||||||
|
|
|
@ -84,7 +84,7 @@ pub fn type_allowed_to_implement_copy<'tcx>(
|
||||||
return Err(CopyImplementationError::HasDestructor);
|
return Err(CopyImplementationError::HasDestructor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if impl_safety == hir::Safety::Safe && self_type.has_unsafe_fields() {
|
if impl_safety.is_safe() && self_type.has_unsafe_fields() {
|
||||||
return Err(CopyImplementationError::HasUnsafeFields);
|
return Err(CopyImplementationError::HasUnsafeFields);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1626,10 +1626,7 @@ pub(crate) trait PrintWithSpace {
|
||||||
|
|
||||||
impl PrintWithSpace for hir::Safety {
|
impl PrintWithSpace for hir::Safety {
|
||||||
fn print_with_space(&self) -> &str {
|
fn print_with_space(&self) -> &str {
|
||||||
match self {
|
self.prefix_str()
|
||||||
hir::Safety::Unsafe => "unsafe ",
|
|
||||||
hir::Safety::Safe => "",
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -469,7 +469,7 @@ fn item_module(w: &mut Buffer, cx: &Context<'_>, item: &clean::Item, items: &[cl
|
||||||
|
|
||||||
let unsafety_flag = match myitem.kind {
|
let unsafety_flag = match myitem.kind {
|
||||||
clean::FunctionItem(_) | clean::ForeignFunctionItem(..)
|
clean::FunctionItem(_) | clean::ForeignFunctionItem(..)
|
||||||
if myitem.fn_header(tcx).unwrap().safety == hir::Safety::Unsafe =>
|
if myitem.fn_header(tcx).unwrap().safety.is_unsafe() =>
|
||||||
{
|
{
|
||||||
"<sup title=\"unsafe function\">⚠</sup>"
|
"<sup title=\"unsafe function\">⚠</sup>"
|
||||||
}
|
}
|
||||||
|
@ -1926,9 +1926,7 @@ fn item_static(
|
||||||
buffer,
|
buffer,
|
||||||
"{vis}{safe}static {mutability}{name}: {typ}",
|
"{vis}{safe}static {mutability}{name}: {typ}",
|
||||||
vis = visibility_print_with_space(it, cx),
|
vis = visibility_print_with_space(it, cx),
|
||||||
safe = safety
|
safe = safety.map(|safe| safe.prefix_str()).unwrap_or(""),
|
||||||
.map(|safe| if safe == hir::Safety::Unsafe { "unsafe " } else { "" })
|
|
||||||
.unwrap_or(""),
|
|
||||||
mutability = s.mutability.print_with_space(),
|
mutability = s.mutability.print_with_space(),
|
||||||
name = it.name.unwrap(),
|
name = it.name.unwrap(),
|
||||||
typ = s.type_.print(cx)
|
typ = s.type_.print(cx)
|
||||||
|
|
|
@ -639,7 +639,7 @@ impl FromClean<clean::BareFunctionDecl> for FunctionPointer {
|
||||||
let clean::BareFunctionDecl { safety, generic_params, decl, abi } = bare_decl;
|
let clean::BareFunctionDecl { safety, generic_params, decl, abi } = bare_decl;
|
||||||
FunctionPointer {
|
FunctionPointer {
|
||||||
header: FunctionHeader {
|
header: FunctionHeader {
|
||||||
is_unsafe: matches!(safety, rustc_hir::Safety::Unsafe),
|
is_unsafe: safety.is_unsafe(),
|
||||||
is_const: false,
|
is_const: false,
|
||||||
is_async: false,
|
is_async: false,
|
||||||
abi: convert_abi(abi),
|
abi: convert_abi(abi),
|
||||||
|
@ -669,7 +669,7 @@ impl FromClean<clean::Trait> for Trait {
|
||||||
fn from_clean(trait_: clean::Trait, renderer: &JsonRenderer<'_>) -> Self {
|
fn from_clean(trait_: clean::Trait, renderer: &JsonRenderer<'_>) -> Self {
|
||||||
let tcx = renderer.tcx;
|
let tcx = renderer.tcx;
|
||||||
let is_auto = trait_.is_auto(tcx);
|
let is_auto = trait_.is_auto(tcx);
|
||||||
let is_unsafe = trait_.safety(tcx) == rustc_hir::Safety::Unsafe;
|
let is_unsafe = trait_.safety(tcx).is_unsafe();
|
||||||
let is_dyn_compatible = trait_.is_dyn_compatible(tcx);
|
let is_dyn_compatible = trait_.is_dyn_compatible(tcx);
|
||||||
let clean::Trait { items, generics, bounds, .. } = trait_;
|
let clean::Trait { items, generics, bounds, .. } = trait_;
|
||||||
Trait {
|
Trait {
|
||||||
|
@ -711,7 +711,7 @@ impl FromClean<clean::Impl> for Impl {
|
||||||
ty::ImplPolarity::Negative => true,
|
ty::ImplPolarity::Negative => true,
|
||||||
};
|
};
|
||||||
Impl {
|
Impl {
|
||||||
is_unsafe: safety == rustc_hir::Safety::Unsafe,
|
is_unsafe: safety.is_unsafe(),
|
||||||
generics: generics.into_json(renderer),
|
generics: generics.into_json(renderer),
|
||||||
provided_trait_methods: provided_trait_methods
|
provided_trait_methods: provided_trait_methods
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
@ -840,7 +840,7 @@ fn convert_static(
|
||||||
Static {
|
Static {
|
||||||
type_: (*stat.type_).into_json(renderer),
|
type_: (*stat.type_).into_json(renderer),
|
||||||
is_mutable: stat.mutability == ast::Mutability::Mut,
|
is_mutable: stat.mutability == ast::Mutability::Mut,
|
||||||
is_unsafe: safety == rustc_hir::Safety::Unsafe,
|
is_unsafe: safety.is_unsafe(),
|
||||||
expr: stat
|
expr: stat
|
||||||
.expr
|
.expr
|
||||||
.map(|e| rendered_const(tcx, tcx.hir().body(e), tcx.hir().body_owner_def_id(e)))
|
.map(|e| rendered_const(tcx, tcx.hir().body(e), tcx.hir().body_owner_def_id(e)))
|
||||||
|
|
|
@ -7,7 +7,7 @@ use rustc_errors::Applicability;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::intravisit::{FnKind, Visitor, walk_expr, walk_fn, walk_item};
|
use rustc_hir::intravisit::{FnKind, Visitor, walk_expr, walk_fn, walk_item};
|
||||||
use rustc_hir::{
|
use rustc_hir::{
|
||||||
self as hir, BlockCheckMode, BodyId, Expr, ExprKind, FnDecl, Impl, Item, ItemKind, Safety, UnsafeSource,
|
self as hir, BlockCheckMode, BodyId, Expr, ExprKind, FnDecl, Impl, Item, ItemKind, UnsafeSource,
|
||||||
};
|
};
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
use rustc_middle::hir::nested_filter;
|
use rustc_middle::hir::nested_filter;
|
||||||
|
@ -421,7 +421,7 @@ impl<'tcx> Visitor<'tcx> for UnsafeVisitor<'_, 'tcx> {
|
||||||
id: LocalDefId,
|
id: LocalDefId,
|
||||||
) -> Self::Result {
|
) -> Self::Result {
|
||||||
if let Some(header) = kind.header()
|
if let Some(header) = kind.header()
|
||||||
&& header.safety == Safety::Unsafe
|
&& header.safety.is_unsafe()
|
||||||
{
|
{
|
||||||
ControlFlow::Break(())
|
ControlFlow::Break(())
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -281,7 +281,7 @@ fn check_inputs(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_sig<'tcx>(closure_sig: FnSig<'tcx>, call_sig: FnSig<'tcx>) -> bool {
|
fn check_sig<'tcx>(closure_sig: FnSig<'tcx>, call_sig: FnSig<'tcx>) -> bool {
|
||||||
call_sig.safety == Safety::Safe && !has_late_bound_to_non_late_bound_regions(closure_sig, call_sig)
|
call_sig.safety.is_safe() && !has_late_bound_to_non_late_bound_regions(closure_sig, call_sig)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This walks through both signatures and checks for any time a late-bound region is expected by an
|
/// This walks through both signatures and checks for any time a late-bound region is expected by an
|
||||||
|
|
|
@ -2,7 +2,7 @@ use clippy_utils::diagnostics::span_lint_and_then;
|
||||||
use clippy_utils::source::snippet;
|
use clippy_utils::source::snippet;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir::intravisit::FnKind;
|
use rustc_hir::intravisit::FnKind;
|
||||||
use rustc_hir::{Body, ExprKind, FnDecl, ImplicitSelfKind, Safety};
|
use rustc_hir::{Body, ExprKind, FnDecl, ImplicitSelfKind};
|
||||||
use rustc_lint::LateContext;
|
use rustc_lint::LateContext;
|
||||||
use rustc_middle::ty;
|
use rustc_middle::ty;
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
@ -34,7 +34,7 @@ pub fn check_fn(cx: &LateContext<'_>, kind: FnKind<'_>, decl: &FnDecl<'_>, body:
|
||||||
ImplicitSelfKind::None => return,
|
ImplicitSelfKind::None => return,
|
||||||
};
|
};
|
||||||
|
|
||||||
let name = if sig.header.safety == Safety::Unsafe {
|
let name = if sig.header.safety.is_unsafe() {
|
||||||
name.strip_suffix("_unchecked").unwrap_or(name)
|
name.strip_suffix("_unchecked").unwrap_or(name)
|
||||||
} else {
|
} else {
|
||||||
name
|
name
|
||||||
|
|
|
@ -42,7 +42,7 @@ fn check_raw_ptr<'tcx>(
|
||||||
body: &'tcx hir::Body<'tcx>,
|
body: &'tcx hir::Body<'tcx>,
|
||||||
def_id: LocalDefId,
|
def_id: LocalDefId,
|
||||||
) {
|
) {
|
||||||
if safety == hir::Safety::Safe && cx.effective_visibilities.is_exported(def_id) {
|
if safety.is_safe() && cx.effective_visibilities.is_exported(def_id) {
|
||||||
let raw_ptrs = iter_input_pats(decl, body)
|
let raw_ptrs = iter_input_pats(decl, body)
|
||||||
.filter_map(|arg| raw_ptr_arg(cx, arg))
|
.filter_map(|arg| raw_ptr_arg(cx, arg))
|
||||||
.collect::<HirIdSet>();
|
.collect::<HirIdSet>();
|
||||||
|
@ -58,7 +58,7 @@ fn check_raw_ptr<'tcx>(
|
||||||
},
|
},
|
||||||
hir::ExprKind::MethodCall(_, recv, args, _) => {
|
hir::ExprKind::MethodCall(_, recv, args, _) => {
|
||||||
let def_id = typeck.type_dependent_def_id(e.hir_id).unwrap();
|
let def_id = typeck.type_dependent_def_id(e.hir_id).unwrap();
|
||||||
if cx.tcx.fn_sig(def_id).skip_binder().skip_binder().safety == hir::Safety::Unsafe {
|
if cx.tcx.fn_sig(def_id).skip_binder().skip_binder().safety.is_unsafe() {
|
||||||
check_arg(cx, &raw_ptrs, recv);
|
check_arg(cx, &raw_ptrs, recv);
|
||||||
for arg in args {
|
for arg in args {
|
||||||
check_arg(cx, &raw_ptrs, arg);
|
check_arg(cx, &raw_ptrs, arg);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use clippy_utils::diagnostics::span_lint_and_help;
|
use clippy_utils::diagnostics::span_lint_and_help;
|
||||||
use clippy_utils::ty::{implements_trait, is_type_lang_item};
|
use clippy_utils::ty::{implements_trait, is_type_lang_item};
|
||||||
use clippy_utils::{return_ty, trait_ref_of_method};
|
use clippy_utils::{return_ty, trait_ref_of_method};
|
||||||
use rustc_hir::{GenericParamKind, ImplItem, ImplItemKind, LangItem, Safety};
|
use rustc_hir::{GenericParamKind, ImplItem, ImplItemKind, LangItem};
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
use rustc_session::declare_lint_pass;
|
use rustc_session::declare_lint_pass;
|
||||||
use rustc_span::sym;
|
use rustc_span::sym;
|
||||||
|
@ -95,7 +95,7 @@ impl<'tcx> LateLintPass<'tcx> for InherentToString {
|
||||||
if let ImplItemKind::Fn(ref signature, _) = impl_item.kind
|
if let ImplItemKind::Fn(ref signature, _) = impl_item.kind
|
||||||
// #11201
|
// #11201
|
||||||
&& let header = signature.header
|
&& let header = signature.header
|
||||||
&& header.safety == Safety::Safe
|
&& header.safety.is_safe()
|
||||||
&& header.abi == Abi::Rust
|
&& header.abi == Abi::Rust
|
||||||
&& impl_item.ident.name == sym::to_string
|
&& impl_item.ident.name == sym::to_string
|
||||||
&& let decl = signature.decl
|
&& let decl = signature.decl
|
||||||
|
|
|
@ -2,7 +2,7 @@ use clippy_utils::diagnostics::span_lint_and_then;
|
||||||
use clippy_utils::visitors::{Descend, Visitable, for_each_expr};
|
use clippy_utils::visitors::{Descend, Visitable, for_each_expr};
|
||||||
use core::ops::ControlFlow::Continue;
|
use core::ops::ControlFlow::Continue;
|
||||||
use hir::def::{DefKind, Res};
|
use hir::def::{DefKind, Res};
|
||||||
use hir::{BlockCheckMode, ExprKind, QPath, Safety, UnOp};
|
use hir::{BlockCheckMode, ExprKind, QPath, UnOp};
|
||||||
use rustc_ast::Mutability;
|
use rustc_ast::Mutability;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
|
@ -133,7 +133,7 @@ fn collect_unsafe_exprs<'tcx>(
|
||||||
ty::FnPtr(sig_tys, hdr) => sig_tys.with(hdr),
|
ty::FnPtr(sig_tys, hdr) => sig_tys.with(hdr),
|
||||||
_ => return Continue(Descend::Yes),
|
_ => return Continue(Descend::Yes),
|
||||||
};
|
};
|
||||||
if sig.safety() == Safety::Unsafe {
|
if sig.safety().is_unsafe() {
|
||||||
unsafe_ops.push(("unsafe function call occurs here", expr.span));
|
unsafe_ops.push(("unsafe function call occurs here", expr.span));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -144,7 +144,7 @@ fn collect_unsafe_exprs<'tcx>(
|
||||||
.type_dependent_def_id(expr.hir_id)
|
.type_dependent_def_id(expr.hir_id)
|
||||||
.map(|def_id| cx.tcx.fn_sig(def_id))
|
.map(|def_id| cx.tcx.fn_sig(def_id))
|
||||||
{
|
{
|
||||||
if sig.skip_binder().safety() == Safety::Unsafe {
|
if sig.skip_binder().safety().is_unsafe() {
|
||||||
unsafe_ops.push(("unsafe method call occurs here", expr.span));
|
unsafe_ops.push(("unsafe method call occurs here", expr.span));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,7 @@ impl<'tcx> LateLintPass<'tcx> for NewWithoutDefault {
|
||||||
if let hir::ImplItemKind::Fn(ref sig, _) = impl_item.kind {
|
if let hir::ImplItemKind::Fn(ref sig, _) = impl_item.kind {
|
||||||
let name = impl_item.ident.name;
|
let name = impl_item.ident.name;
|
||||||
let id = impl_item.owner_id;
|
let id = impl_item.owner_id;
|
||||||
if sig.header.safety == hir::Safety::Unsafe {
|
if sig.header.safety.is_unsafe() {
|
||||||
// can't be implemented for unsafe new
|
// can't be implemented for unsafe new
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ use rustc_hir::hir_id::{HirId, HirIdMap};
|
||||||
use rustc_hir::intravisit::{Visitor, walk_expr};
|
use rustc_hir::intravisit::{Visitor, walk_expr};
|
||||||
use rustc_hir::{
|
use rustc_hir::{
|
||||||
self as hir, AnonConst, BinOpKind, BindingMode, Body, Expr, ExprKind, FnRetTy, FnSig, GenericArg, ImplItemKind,
|
self as hir, AnonConst, BinOpKind, BindingMode, Body, Expr, ExprKind, FnRetTy, FnSig, GenericArg, ImplItemKind,
|
||||||
ItemKind, Lifetime, Mutability, Node, Param, PatKind, QPath, Safety, TraitFn, TraitItem, TraitItemKind, TyKind,
|
ItemKind, Lifetime, Mutability, Node, Param, PatKind, QPath, TraitFn, TraitItem, TraitItemKind, TyKind,
|
||||||
};
|
};
|
||||||
use rustc_infer::infer::TyCtxtInferExt;
|
use rustc_infer::infer::TyCtxtInferExt;
|
||||||
use rustc_infer::traits::{Obligation, ObligationCause};
|
use rustc_infer::traits::{Obligation, ObligationCause};
|
||||||
|
@ -541,7 +541,7 @@ fn check_mut_from_ref<'tcx>(cx: &LateContext<'tcx>, sig: &FnSig<'_>, body: Optio
|
||||||
.collect();
|
.collect();
|
||||||
if let Some(args) = args
|
if let Some(args) = args
|
||||||
&& !args.is_empty()
|
&& !args.is_empty()
|
||||||
&& body.is_none_or(|body| sig.header.safety == Safety::Unsafe || contains_unsafe_block(cx, body.value))
|
&& body.is_none_or(|body| sig.header.safety.is_unsafe() || contains_unsafe_block(cx, body.value))
|
||||||
{
|
{
|
||||||
span_lint_and_then(
|
span_lint_and_then(
|
||||||
cx,
|
cx,
|
||||||
|
|
|
@ -203,7 +203,7 @@ impl<'tcx> LateLintPass<'tcx> for UndocumentedUnsafeBlocks {
|
||||||
let item_has_safety_comment = item_has_safety_comment(cx, item);
|
let item_has_safety_comment = item_has_safety_comment(cx, item);
|
||||||
match (&item.kind, item_has_safety_comment) {
|
match (&item.kind, item_has_safety_comment) {
|
||||||
// lint unsafe impl without safety comment
|
// lint unsafe impl without safety comment
|
||||||
(ItemKind::Impl(impl_), HasSafetyComment::No) if impl_.safety == hir::Safety::Unsafe => {
|
(ItemKind::Impl(impl_), HasSafetyComment::No) if impl_.safety.is_unsafe() => {
|
||||||
if !is_lint_allowed(cx, UNDOCUMENTED_UNSAFE_BLOCKS, item.hir_id())
|
if !is_lint_allowed(cx, UNDOCUMENTED_UNSAFE_BLOCKS, item.hir_id())
|
||||||
&& !is_unsafe_from_proc_macro(cx, item.span)
|
&& !is_unsafe_from_proc_macro(cx, item.span)
|
||||||
{
|
{
|
||||||
|
@ -227,7 +227,7 @@ impl<'tcx> LateLintPass<'tcx> for UndocumentedUnsafeBlocks {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// lint safe impl with unnecessary safety comment
|
// lint safe impl with unnecessary safety comment
|
||||||
(ItemKind::Impl(impl_), HasSafetyComment::Yes(pos)) if impl_.safety == hir::Safety::Safe => {
|
(ItemKind::Impl(impl_), HasSafetyComment::Yes(pos)) if impl_.safety.is_safe() => {
|
||||||
if !is_lint_allowed(cx, UNNECESSARY_SAFETY_COMMENT, item.hir_id()) {
|
if !is_lint_allowed(cx, UNNECESSARY_SAFETY_COMMENT, item.hir_id()) {
|
||||||
let (span, help_span) = mk_spans(pos);
|
let (span, help_span) = mk_spans(pos);
|
||||||
|
|
||||||
|
|
|
@ -373,7 +373,7 @@ fn ty_search_pat(ty: &Ty<'_>) -> (Pat, Pat) {
|
||||||
TyKind::Ptr(MutTy { ty, .. }) => (Pat::Str("*"), ty_search_pat(ty).1),
|
TyKind::Ptr(MutTy { ty, .. }) => (Pat::Str("*"), ty_search_pat(ty).1),
|
||||||
TyKind::Ref(_, MutTy { ty, .. }) => (Pat::Str("&"), ty_search_pat(ty).1),
|
TyKind::Ref(_, MutTy { ty, .. }) => (Pat::Str("&"), ty_search_pat(ty).1),
|
||||||
TyKind::BareFn(bare_fn) => (
|
TyKind::BareFn(bare_fn) => (
|
||||||
if bare_fn.safety == Safety::Unsafe {
|
if bare_fn.safety.is_unsafe() {
|
||||||
Pat::Str("unsafe")
|
Pat::Str("unsafe")
|
||||||
} else if bare_fn.abi != Abi::Rust {
|
} else if bare_fn.abi != Abi::Rust {
|
||||||
Pat::Str("extern")
|
Pat::Str("extern")
|
||||||
|
|
|
@ -9,7 +9,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
|
use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::{Expr, FnDecl, LangItem, Safety, TyKind};
|
use rustc_hir::{Expr, FnDecl, LangItem, TyKind};
|
||||||
use rustc_infer::infer::TyCtxtInferExt;
|
use rustc_infer::infer::TyCtxtInferExt;
|
||||||
use rustc_lint::LateContext;
|
use rustc_lint::LateContext;
|
||||||
use rustc_middle::mir::ConstValue;
|
use rustc_middle::mir::ConstValue;
|
||||||
|
@ -531,7 +531,7 @@ pub fn peel_mid_ty_refs_is_mutable(ty: Ty<'_>) -> (Ty<'_>, usize, Mutability) {
|
||||||
/// Returns `true` if the given type is an `unsafe` function.
|
/// Returns `true` if the given type is an `unsafe` function.
|
||||||
pub fn type_is_unsafe_function<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>) -> bool {
|
pub fn type_is_unsafe_function<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>) -> bool {
|
||||||
match ty.kind() {
|
match ty.kind() {
|
||||||
ty::FnDef(..) | ty::FnPtr(..) => ty.fn_sig(cx.tcx).safety() == Safety::Unsafe,
|
ty::FnDef(..) | ty::FnPtr(..) => ty.fn_sig(cx.tcx).safety().is_unsafe(),
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ use rustc_hir::def::{CtorKind, DefKind, Res};
|
||||||
use rustc_hir::intravisit::{self, Visitor, walk_block, walk_expr};
|
use rustc_hir::intravisit::{self, Visitor, walk_block, walk_expr};
|
||||||
use rustc_hir::{
|
use rustc_hir::{
|
||||||
AnonConst, Arm, Block, BlockCheckMode, Body, BodyId, Expr, ExprKind, HirId, ItemId, ItemKind, LetExpr, Pat, QPath,
|
AnonConst, Arm, Block, BlockCheckMode, Body, BodyId, Expr, ExprKind, HirId, ItemId, ItemKind, LetExpr, Pat, QPath,
|
||||||
Safety, Stmt, UnOp, UnsafeSource, StructTailExpr,
|
Stmt, UnOp, UnsafeSource, StructTailExpr,
|
||||||
};
|
};
|
||||||
use rustc_lint::LateContext;
|
use rustc_lint::LateContext;
|
||||||
use rustc_middle::hir::nested_filter;
|
use rustc_middle::hir::nested_filter;
|
||||||
|
@ -426,15 +426,15 @@ pub fn is_expr_unsafe<'tcx>(cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) -> bool {
|
||||||
.cx
|
.cx
|
||||||
.typeck_results()
|
.typeck_results()
|
||||||
.type_dependent_def_id(e.hir_id)
|
.type_dependent_def_id(e.hir_id)
|
||||||
.is_some_and(|id| self.cx.tcx.fn_sig(id).skip_binder().safety() == Safety::Unsafe) =>
|
.is_some_and(|id| self.cx.tcx.fn_sig(id).skip_binder().safety().is_unsafe()) =>
|
||||||
{
|
{
|
||||||
ControlFlow::Break(())
|
ControlFlow::Break(())
|
||||||
},
|
},
|
||||||
ExprKind::Call(func, _) => match *self.cx.typeck_results().expr_ty(func).peel_refs().kind() {
|
ExprKind::Call(func, _) => match *self.cx.typeck_results().expr_ty(func).peel_refs().kind() {
|
||||||
ty::FnDef(id, _) if self.cx.tcx.fn_sig(id).skip_binder().safety() == Safety::Unsafe => {
|
ty::FnDef(id, _) if self.cx.tcx.fn_sig(id).skip_binder().safety().is_unsafe() => {
|
||||||
ControlFlow::Break(())
|
ControlFlow::Break(())
|
||||||
},
|
},
|
||||||
ty::FnPtr(_, hdr) if hdr.safety == Safety::Unsafe => ControlFlow::Break(()),
|
ty::FnPtr(_, hdr) if hdr.safety.is_unsafe() => ControlFlow::Break(()),
|
||||||
_ => walk_expr(self, e),
|
_ => walk_expr(self, e),
|
||||||
},
|
},
|
||||||
ExprKind::Path(ref p)
|
ExprKind::Path(ref p)
|
||||||
|
@ -458,7 +458,7 @@ pub fn is_expr_unsafe<'tcx>(cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) -> bool {
|
||||||
}
|
}
|
||||||
fn visit_nested_item(&mut self, id: ItemId) -> Self::Result {
|
fn visit_nested_item(&mut self, id: ItemId) -> Self::Result {
|
||||||
if let ItemKind::Impl(i) = &self.cx.tcx.hir().item(id).kind
|
if let ItemKind::Impl(i) = &self.cx.tcx.hir().item(id).kind
|
||||||
&& i.safety == Safety::Unsafe
|
&& i.safety.is_unsafe()
|
||||||
{
|
{
|
||||||
ControlFlow::Break(())
|
ControlFlow::Break(())
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue