Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/diagnostics/unsafe_check.rs')
-rw-r--r--crates/hir-ty/src/diagnostics/unsafe_check.rs40
1 files changed, 22 insertions, 18 deletions
diff --git a/crates/hir-ty/src/diagnostics/unsafe_check.rs b/crates/hir-ty/src/diagnostics/unsafe_check.rs
index 21f263723b..09c648139c 100644
--- a/crates/hir-ty/src/diagnostics/unsafe_check.rs
+++ b/crates/hir-ty/src/diagnostics/unsafe_check.rs
@@ -5,11 +5,12 @@ use std::mem;
use either::Either;
use hir_def::{
- AdtId, CallableDefId, DefWithBodyId, FieldId, FunctionId, VariantId,
- expr_store::{Body, path::Path},
+ AdtId, CallableDefId, DefWithBodyId, ExpressionStoreOwnerId, FieldId, FunctionId, GenericDefId,
+ VariantId,
+ expr_store::{Body, ExpressionStore, path::Path},
hir::{AsmOperand, Expr, ExprId, ExprOrPatId, InlineAsmKind, Pat, PatId, Statement, UnaryOp},
resolver::{HasResolver, ResolveValueResult, Resolver, ValueNs},
- signatures::StaticFlags,
+ signatures::{FunctionSignature, StaticFlags, StaticSignature},
type_ref::Rawness,
};
use rustc_type_ir::inherent::IntoKind;
@@ -34,15 +35,15 @@ pub fn missing_unsafe(db: &dyn HirDatabase, def: DefWithBodyId) -> MissingUnsafe
let _p = tracing::info_span!("missing_unsafe").entered();
let is_unsafe = match def {
- DefWithBodyId::FunctionId(it) => db.function_signature(it).is_unsafe(),
+ DefWithBodyId::FunctionId(it) => FunctionSignature::of(db, it).is_unsafe(),
DefWithBodyId::StaticId(_) | DefWithBodyId::ConstId(_) | DefWithBodyId::VariantId(_) => {
false
}
};
let mut res = MissingUnsafeResult { fn_is_unsafe: is_unsafe, ..MissingUnsafeResult::default() };
- let body = db.body(def);
- let infer = InferenceResult::for_body(db, def);
+ let body = Body::of(db, def);
+ let infer = InferenceResult::of(db, def);
let mut callback = |diag| match diag {
UnsafeDiagnostic::UnsafeOperation { node, inside_unsafe_block, reason } => {
if inside_unsafe_block == InsideUnsafeBlock::No {
@@ -55,8 +56,8 @@ pub fn missing_unsafe(db: &dyn HirDatabase, def: DefWithBodyId) -> MissingUnsafe
}
}
};
- let mut visitor = UnsafeVisitor::new(db, infer, &body, def, &mut callback);
- visitor.walk_expr(body.body_expr);
+ let mut visitor = UnsafeVisitor::new(db, infer, body, def.into(), &mut callback);
+ visitor.walk_expr(body.root_expr());
if !is_unsafe {
// Unsafety in function parameter patterns (that can only be union destructuring)
@@ -109,8 +110,8 @@ pub fn unsafe_operations_for_body(
callback(node);
}
};
- let mut visitor = UnsafeVisitor::new(db, infer, body, def, &mut visitor_callback);
- visitor.walk_expr(body.body_expr);
+ let mut visitor = UnsafeVisitor::new(db, infer, body, def.into(), &mut visitor_callback);
+ visitor.walk_expr(body.root_expr());
for &param in &body.params {
visitor.walk_pat(param);
}
@@ -119,8 +120,8 @@ pub fn unsafe_operations_for_body(
pub fn unsafe_operations(
db: &dyn HirDatabase,
infer: &InferenceResult,
- def: DefWithBodyId,
- body: &Body,
+ def: ExpressionStoreOwnerId,
+ body: &ExpressionStore,
current: ExprId,
callback: &mut dyn FnMut(ExprOrPatId, InsideUnsafeBlock),
) {
@@ -137,9 +138,9 @@ pub fn unsafe_operations(
struct UnsafeVisitor<'db> {
db: &'db dyn HirDatabase,
infer: &'db InferenceResult,
- body: &'db Body,
+ body: &'db ExpressionStore,
resolver: Resolver<'db>,
- def: DefWithBodyId,
+ def: ExpressionStoreOwnerId,
inside_unsafe_block: InsideUnsafeBlock,
inside_assignment: bool,
inside_union_destructure: bool,
@@ -156,13 +157,16 @@ impl<'db> UnsafeVisitor<'db> {
fn new(
db: &'db dyn HirDatabase,
infer: &'db InferenceResult,
- body: &'db Body,
- def: DefWithBodyId,
+ body: &'db ExpressionStore,
+ def: ExpressionStoreOwnerId,
unsafe_expr_cb: &'db mut dyn FnMut(UnsafeDiagnostic),
) -> Self {
let resolver = def.resolver(db);
let def_target_features = match def {
- DefWithBodyId::FunctionId(func) => TargetFeatures::from_fn(db, func),
+ ExpressionStoreOwnerId::Body(DefWithBodyId::FunctionId(func))
+ | ExpressionStoreOwnerId::Signature(GenericDefId::FunctionId(func)) => {
+ TargetFeatures::from_fn(db, func)
+ }
_ => TargetFeatures::default(),
};
let krate = resolver.krate();
@@ -431,7 +435,7 @@ impl<'db> UnsafeVisitor<'db> {
let hygiene = self.body.expr_or_pat_path_hygiene(node);
let value_or_partial = self.resolver.resolve_path_in_value_ns(self.db, path, hygiene);
if let Some(ResolveValueResult::ValueNs(ValueNs::StaticId(id))) = value_or_partial {
- let static_data = self.db.static_signature(id);
+ let static_data = StaticSignature::of(self.db, id);
if static_data.flags.contains(StaticFlags::MUTABLE) {
self.on_unsafe_op(node, UnsafetyReason::MutableStatic);
} else if static_data.flags.contains(StaticFlags::EXTERN)