mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-30 03:27:44 +00:00
Merge pull request #19051 from ChayimFriedman2/fn-ptr-unsafe
fix: Report calling unsafe fn pointer as unsafe
This commit is contained in:
commit
7c387ed3a7
2 changed files with 19 additions and 1 deletions
|
|
@ -240,9 +240,15 @@ impl<'a> UnsafeVisitor<'a> {
|
||||||
let inside_assignment = mem::replace(&mut self.inside_assignment, false);
|
let inside_assignment = mem::replace(&mut self.inside_assignment, false);
|
||||||
match expr {
|
match expr {
|
||||||
&Expr::Call { callee, .. } => {
|
&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);
|
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) => {
|
Expr::Path(path) => {
|
||||||
let guard =
|
let guard =
|
||||||
|
|
|
||||||
|
|
@ -862,6 +862,18 @@ fn bar() {
|
||||||
fn baz() {
|
fn baz() {
|
||||||
foo();
|
foo();
|
||||||
// ^^^^^ 💡 error: call to unsafe function is unsafe and requires an unsafe function or block
|
// ^^^^^ 💡 error: call to unsafe function is unsafe and requires an unsafe function or block
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[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
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue