Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/diagnostics/decl_check.rs')
-rw-r--r--crates/hir-ty/src/diagnostics/decl_check.rs21
1 files changed, 15 insertions, 6 deletions
diff --git a/crates/hir-ty/src/diagnostics/decl_check.rs b/crates/hir-ty/src/diagnostics/decl_check.rs
index 0249f3ba25..82517e6991 100644
--- a/crates/hir-ty/src/diagnostics/decl_check.rs
+++ b/crates/hir-ty/src/diagnostics/decl_check.rs
@@ -24,6 +24,7 @@ use hir_expand::{
name::{AsName, Name},
HirFileId, HirFileIdExt,
};
+use intern::sym;
use stdx::{always, never};
use syntax::{
ast::{self, HasName},
@@ -197,12 +198,20 @@ impl<'a> DeclValidator<'a> {
// Skipped if function is an associated item of a trait implementation.
if !self.is_trait_impl_container(container) {
let data = self.db.function_data(func);
- self.create_incorrect_case_diagnostic_for_item_name(
- func,
- &data.name,
- CaseType::LowerSnakeCase,
- IdentType::Function,
- );
+
+ // Don't run the lint on extern "[not Rust]" fn items with the
+ // #[no_mangle] attribute.
+ let no_mangle = data.attrs.by_key(&sym::no_mangle).exists();
+ if no_mangle && data.abi.as_ref().is_some_and(|abi| *abi != sym::Rust) {
+ cov_mark::hit!(extern_func_no_mangle_ignored);
+ } else {
+ self.create_incorrect_case_diagnostic_for_item_name(
+ func,
+ &data.name,
+ CaseType::LowerSnakeCase,
+ IdentType::Function,
+ );
+ }
} else {
cov_mark::hit!(trait_impl_assoc_func_name_incorrect_case_ignored);
}