about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChayim Refael Friedman <chayimfr@gmail.com>2025-01-27 18:57:31 +0200
committerChayim Refael Friedman <chayimfr@gmail.com>2025-01-27 18:57:31 +0200
commit1ba894350d4f746757672b1a21e92035cbe563a1 (patch)
treec151d152909436cb83d5617054ace588f1b9beb2
parentd60afecd1127caec601243fdb27de9d67885819f (diff)
downloadrust-1ba894350d4f746757672b1a21e92035cbe563a1.tar.gz
rust-1ba894350d4f746757672b1a21e92035cbe563a1.zip
Report calling unsafe fn pointer as unsafe
-rw-r--r--src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/unsafe_check.rs8
-rw-r--r--src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/missing_unsafe.rs12
2 files changed, 19 insertions, 1 deletions
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/unsafe_check.rs b/src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/unsafe_check.rs
index f6556924297..2aca99c93ba 100644
--- a/src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/unsafe_check.rs
+++ b/src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/unsafe_check.rs
@@ -240,9 +240,15 @@ impl<'a> UnsafeVisitor<'a> {
         let inside_assignment = mem::replace(&mut self.inside_assignment, false);
         match expr {
             &Expr::Call { callee, .. } => {
-                if let Some(func) = self.infer[callee].as_fn_def(self.db) {
+                let callee = &self.infer[callee];
+                if let Some(func) = callee.as_fn_def(self.db) {
                     self.check_call(current, func);
                 }
+                if let TyKind::Function(fn_ptr) = callee.kind(Interner) {
+                    if fn_ptr.sig.safety == chalk_ir::Safety::Unsafe {
+                        self.on_unsafe_op(current.into(), UnsafetyReason::UnsafeFnCall);
+                    }
+                }
             }
             Expr::Path(path) => {
                 let guard =
diff --git a/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/missing_unsafe.rs b/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
index d48464769c8..323a5723d4a 100644
--- a/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
+++ b/src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
@@ -866,4 +866,16 @@ fn baz() {
         "#,
         );
     }
+
+    #[test]
+    fn unsafe_fn_ptr_call() {
+        check_diagnostics(
+            r#"
+fn f(it: unsafe fn()){
+    it();
+ // ^^^^ 💡 error: call to unsafe function is unsafe and requires an unsafe function or block
+}
+        "#,
+        );
+    }
 }