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.rs | 42 |
1 files changed, 21 insertions, 21 deletions
diff --git a/crates/hir-ty/src/diagnostics/unsafe_check.rs b/crates/hir-ty/src/diagnostics/unsafe_check.rs index d2b908839c..73b99db726 100644 --- a/crates/hir-ty/src/diagnostics/unsafe_check.rs +++ b/crates/hir-ty/src/diagnostics/unsafe_check.rs @@ -5,18 +5,18 @@ use std::mem; use either::Either; use hir_def::{ - expr_store::Body, + AdtId, DefWithBodyId, FieldId, FunctionId, VariantId, + expr_store::{Body, path::Path}, hir::{Expr, ExprId, ExprOrPatId, Pat, PatId, Statement, UnaryOp}, - path::Path, resolver::{HasResolver, ResolveValueResult, Resolver, ValueNs}, + signatures::StaticFlags, type_ref::Rawness, - AdtId, DefWithBodyId, FieldId, FunctionId, VariantId, }; use span::Edition; use crate::{ - db::HirDatabase, utils::is_fn_unsafe_to_call, InferenceResult, Interner, TargetFeatures, TyExt, - TyKind, + InferenceResult, Interner, TargetFeatures, TyExt, TyKind, db::HirDatabase, + utils::is_fn_unsafe_to_call, }; #[derive(Debug, Default)] @@ -31,11 +31,10 @@ 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_data(it).is_unsafe(), - DefWithBodyId::StaticId(_) - | DefWithBodyId::ConstId(_) - | DefWithBodyId::VariantId(_) - | DefWithBodyId::InTypeConstId(_) => false, + DefWithBodyId::FunctionId(it) => db.function_signature(it).is_unsafe(), + DefWithBodyId::StaticId(_) | DefWithBodyId::ConstId(_) | DefWithBodyId::VariantId(_) => { + false + } }; let mut res = MissingUnsafeResult { fn_is_unsafe: is_unsafe, ..MissingUnsafeResult::default() }; @@ -128,7 +127,7 @@ pub fn unsafe_operations( } }; let mut visitor = UnsafeVisitor::new(db, infer, body, def, &mut visitor_callback); - _ = visitor.resolver.update_to_inner_scope(db.upcast(), def, current); + _ = visitor.resolver.update_to_inner_scope(db, def, current); visitor.walk_expr(current); } @@ -155,12 +154,12 @@ impl<'a> UnsafeVisitor<'a> { def: DefWithBodyId, unsafe_expr_cb: &'a mut dyn FnMut(UnsafeDiagnostic), ) -> Self { - let resolver = def.resolver(db.upcast()); + let resolver = def.resolver(db); let def_target_features = match def { DefWithBodyId::FunctionId(func) => TargetFeatures::from_attrs(&db.attrs(func.into())), _ => TargetFeatures::default(), }; - let edition = db.crate_graph()[resolver.module().krate()].edition; + let edition = resolver.module().krate().data(db).edition; Self { db, infer, @@ -201,7 +200,7 @@ impl<'a> UnsafeVisitor<'a> { } fn walk_pats_top(&mut self, pats: impl Iterator<Item = PatId>, parent_expr: ExprId) { - let guard = self.resolver.update_to_inner_scope(self.db.upcast(), self.def, parent_expr); + let guard = self.resolver.update_to_inner_scope(self.db, self.def, parent_expr); pats.for_each(|pat| self.walk_pat(pat)); self.resolver.reset_to_guard(guard); } @@ -269,8 +268,7 @@ impl<'a> UnsafeVisitor<'a> { } } Expr::Path(path) => { - let guard = - self.resolver.update_to_inner_scope(self.db.upcast(), self.def, current); + let guard = self.resolver.update_to_inner_scope(self.db, self.def, current); self.mark_unsafe_path(current.into(), path); self.resolver.reset_to_guard(guard); } @@ -350,6 +348,7 @@ impl<'a> UnsafeVisitor<'a> { Expr::Closure { args, .. } => { self.walk_pats_top(args.iter().copied(), current); } + Expr::Const(e) => self.walk_expr(*e), _ => {} } @@ -358,13 +357,14 @@ impl<'a> UnsafeVisitor<'a> { fn mark_unsafe_path(&mut self, node: ExprOrPatId, path: &Path) { let hygiene = self.body.expr_or_pat_path_hygiene(node); - let value_or_partial = - self.resolver.resolve_path_in_value_ns(self.db.upcast(), path, hygiene); + 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_data(id); - if static_data.mutable { + let static_data = self.db.static_signature(id); + if static_data.flags.contains(StaticFlags::MUTABLE) { self.on_unsafe_op(node, UnsafetyReason::MutableStatic); - } else if static_data.is_extern && !static_data.has_safe_kw { + } else if static_data.flags.contains(StaticFlags::EXTERN) + && !static_data.flags.contains(StaticFlags::EXPLICIT_SAFE) + { self.on_unsafe_op(node, UnsafetyReason::ExternStatic); } } |