Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir-ty/src/diagnostics/unsafe_check.rs3
-rw-r--r--crates/ide-diagnostics/src/handlers/missing_unsafe.rs25
2 files changed, 27 insertions, 1 deletions
diff --git a/crates/hir-ty/src/diagnostics/unsafe_check.rs b/crates/hir-ty/src/diagnostics/unsafe_check.rs
index 3f54cdd20c..1582cbba88 100644
--- a/crates/hir-ty/src/diagnostics/unsafe_check.rs
+++ b/crates/hir-ty/src/diagnostics/unsafe_check.rs
@@ -87,7 +87,8 @@ fn walk_unsafe(
let g = resolver.update_to_inner_scope(db.upcast(), def, current);
let value_or_partial = resolver.resolve_path_in_value_ns(db.upcast(), path);
if let Some(ResolveValueResult::ValueNs(ValueNs::StaticId(id), _)) = value_or_partial {
- if db.static_data(id).mutable {
+ let static_data = db.static_data(id);
+ if static_data.mutable || static_data.is_extern {
unsafe_expr_cb(UnsafeExpr { expr: current, inside_unsafe_block });
}
}
diff --git a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
index af8ac6005d..7407faee35 100644
--- a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
+++ b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
@@ -164,6 +164,31 @@ fn main() {
}
#[test]
+ fn missing_unsafe_diagnostic_with_extern_static() {
+ check_diagnostics(
+ r#"
+//- minicore: copy
+
+extern "C" {
+ static EXTERN: i32;
+ static mut EXTERN_MUT: i32;
+}
+
+fn main() {
+ let _x = EXTERN;
+ //^^^^^^💡 error: this operation is unsafe and requires an unsafe function or block
+ let _x = EXTERN_MUT;
+ //^^^^^^^^^^💡 error: this operation is unsafe and requires an unsafe function or block
+ unsafe {
+ let _x = EXTERN;
+ let _x = EXTERN_MUT;
+ }
+}
+"#,
+ );
+ }
+
+ #[test]
fn no_missing_unsafe_diagnostic_with_safe_intrinsic() {
check_diagnostics(
r#"