diff options
| author | Chayim Refael Friedman <chayimfr@gmail.com> | 2025-01-27 18:57:31 +0200 |
|---|---|---|
| committer | Chayim Refael Friedman <chayimfr@gmail.com> | 2025-01-27 18:57:31 +0200 |
| commit | 1ba894350d4f746757672b1a21e92035cbe563a1 (patch) | |
| tree | c151d152909436cb83d5617054ace588f1b9beb2 | |
| parent | d60afecd1127caec601243fdb27de9d67885819f (diff) | |
| download | rust-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.rs | 8 | ||||
| -rw-r--r-- | src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/missing_unsafe.rs | 12 |
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 +} + "#, + ); + } } |
