Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-diagnostics/src/handlers/missing_unsafe.rs')
-rw-r--r--crates/ide-diagnostics/src/handlers/missing_unsafe.rs31
1 files changed, 30 insertions, 1 deletions
diff --git a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
index 9a9bab091d..5b43f4b2af 100644
--- a/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
+++ b/crates/ide-diagnostics/src/handlers/missing_unsafe.rs
@@ -11,9 +11,14 @@ use crate::{fix, Diagnostic, DiagnosticCode, DiagnosticsContext};
//
// This diagnostic is triggered if an operation marked as `unsafe` is used outside of an `unsafe` function or block.
pub(crate) fn missing_unsafe(ctx: &DiagnosticsContext<'_>, d: &hir::MissingUnsafe) -> Diagnostic {
+ let code = if d.only_lint {
+ DiagnosticCode::RustcLint("unsafe_op_in_unsafe_fn")
+ } else {
+ DiagnosticCode::RustcHardError("E0133")
+ };
Diagnostic::new_with_syntax_node_ptr(
ctx,
- DiagnosticCode::RustcHardError("E0133"),
+ code,
"this operation is unsafe and requires an unsafe function or block",
d.expr.map(|it| it.into()),
)
@@ -566,4 +571,28 @@ fn main() {
"#,
)
}
+
+ #[test]
+ fn unsafe_op_in_unsafe_fn_allowed_by_default() {
+ check_diagnostics(
+ r#"
+unsafe fn foo(p: *mut i32) {
+ *p = 123;
+}
+ "#,
+ )
+ }
+
+ #[test]
+ fn unsafe_op_in_unsafe_fn() {
+ check_diagnostics(
+ r#"
+#![warn(unsafe_op_in_unsafe_fn)]
+unsafe fn foo(p: *mut i32) {
+ *p = 123;
+ //^^💡 warn: this operation is unsafe and requires an unsafe function or block
+}
+ "#,
+ )
+ }
}