Skip to content

Commit 4950b2b

Browse files
Migrate unsafe checker to the new solver
1 parent 2a9034f commit 4950b2b

File tree

2 files changed

+16
-33
lines changed

2 files changed

+16
-33
lines changed

crates/hir-ty/src/chalk_ext.rs

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
11
//! Various extensions traits for Chalk types.
22
3-
use hir_def::{FunctionId, ItemContainerId, Lookup, TraitId};
3+
use hir_def::{ItemContainerId, Lookup, TraitId};
44

55
use crate::{
6-
Binders, CallableDefId, CallableSig, DynTy, Interner, ProjectionTy, Substitution, ToChalk,
7-
TraitRef, Ty, TyKind, db::HirDatabase, from_assoc_type_id, from_chalk_trait_id,
8-
generics::generics, to_chalk_trait_id, utils::ClosureSubst,
6+
Binders, CallableSig, DynTy, Interner, ProjectionTy, Substitution, TraitRef, Ty, TyKind,
7+
db::HirDatabase, from_assoc_type_id, from_chalk_trait_id, generics::generics,
8+
to_chalk_trait_id, utils::ClosureSubst,
99
};
1010

1111
pub(crate) trait TyExt {
1212
fn is_unit(&self) -> bool;
1313
fn is_unknown(&self) -> bool;
1414

1515
fn as_tuple(&self) -> Option<&Substitution>;
16-
fn as_fn_def(&self, db: &dyn HirDatabase) -> Option<FunctionId>;
1716

18-
fn callable_def(&self, db: &dyn HirDatabase) -> Option<CallableDefId>;
1917
fn callable_sig(&self, db: &dyn HirDatabase) -> Option<CallableSig>;
2018
}
2119

@@ -35,20 +33,6 @@ impl TyExt for Ty {
3533
}
3634
}
3735

38-
fn as_fn_def(&self, db: &dyn HirDatabase) -> Option<FunctionId> {
39-
match self.callable_def(db) {
40-
Some(CallableDefId::FunctionId(func)) => Some(func),
41-
Some(CallableDefId::StructId(_) | CallableDefId::EnumVariantId(_)) | None => None,
42-
}
43-
}
44-
45-
fn callable_def(&self, db: &dyn HirDatabase) -> Option<CallableDefId> {
46-
match self.kind(Interner) {
47-
&TyKind::FnDef(def, ..) => Some(ToChalk::from_chalk(db, def)),
48-
_ => None,
49-
}
50-
}
51-
5236
fn callable_sig(&self, db: &dyn HirDatabase) -> Option<CallableSig> {
5337
match self.kind(Interner) {
5438
TyKind::Function(fn_ptr) => Some(CallableSig::from_fn_ptr(fn_ptr)),

crates/hir-ty/src/diagnostics/unsafe_check.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,21 @@ use std::mem;
55

66
use either::Either;
77
use hir_def::{
8-
AdtId, DefWithBodyId, FieldId, FunctionId, VariantId,
8+
AdtId, CallableDefId, DefWithBodyId, FieldId, FunctionId, VariantId,
99
expr_store::{Body, path::Path},
1010
hir::{AsmOperand, Expr, ExprId, ExprOrPatId, InlineAsmKind, Pat, PatId, Statement, UnaryOp},
1111
resolver::{HasResolver, ResolveValueResult, Resolver, ValueNs},
1212
signatures::StaticFlags,
1313
type_ref::Rawness,
1414
};
15+
use rustc_type_ir::inherent::IntoKind;
1516
use span::Edition;
1617

17-
use crate::next_solver::DbInterner;
18-
use crate::next_solver::mapping::NextSolverToChalk;
19-
use crate::utils::TargetFeatureIsSafeInTarget;
2018
use crate::{
21-
InferenceResult, Interner, TargetFeatures, TyExt, TyKind,
19+
InferenceResult, TargetFeatures,
2220
db::HirDatabase,
23-
utils::{is_fn_unsafe_to_call, target_feature_is_safe_in_target},
21+
next_solver::{CallableIdWrapper, TyKind, abi::Safety},
22+
utils::{TargetFeatureIsSafeInTarget, is_fn_unsafe_to_call, target_feature_is_safe_in_target},
2423
};
2524

2625
#[derive(Debug, Default)]
@@ -151,7 +150,6 @@ struct UnsafeVisitor<'db> {
151150
/// On some targets (WASM), calling safe functions with `#[target_feature]` is always safe, even when
152151
/// the target feature is not enabled. This flag encodes that.
153152
target_feature_is_safe: TargetFeatureIsSafeInTarget,
154-
interner: DbInterner<'db>,
155153
}
156154

157155
impl<'db> UnsafeVisitor<'db> {
@@ -186,7 +184,6 @@ impl<'db> UnsafeVisitor<'db> {
186184
def_target_features,
187185
edition,
188186
target_feature_is_safe,
189-
interner: DbInterner::new_with(db, None, None),
190187
}
191188
}
192189

@@ -289,12 +286,14 @@ impl<'db> UnsafeVisitor<'db> {
289286
let inside_assignment = mem::replace(&mut self.inside_assignment, false);
290287
match expr {
291288
&Expr::Call { callee, .. } => {
292-
let callee = self.infer[callee].to_chalk(self.interner);
293-
if let Some(func) = callee.as_fn_def(self.db) {
289+
let callee = self.infer[callee];
290+
if let TyKind::FnDef(CallableIdWrapper(CallableDefId::FunctionId(func)), _) =
291+
callee.kind()
292+
{
294293
self.check_call(current, func);
295294
}
296-
if let TyKind::Function(fn_ptr) = callee.kind(Interner)
297-
&& fn_ptr.sig.safety == chalk_ir::Safety::Unsafe
295+
if let TyKind::FnPtr(_, hdr) = callee.kind()
296+
&& hdr.safety == Safety::Unsafe
298297
{
299298
self.on_unsafe_op(current.into(), UnsafetyReason::UnsafeFnCall);
300299
}
@@ -342,7 +341,7 @@ impl<'db> UnsafeVisitor<'db> {
342341
}
343342
}
344343
Expr::UnaryOp { expr, op: UnaryOp::Deref } => {
345-
if let TyKind::Raw(..) = &self.infer[*expr].to_chalk(self.interner).kind(Interner) {
344+
if let TyKind::RawPtr(..) = self.infer[*expr].kind() {
346345
self.on_unsafe_op(current.into(), UnsafetyReason::RawPtrDeref);
347346
}
348347
}

0 commit comments

Comments
 (0)