Skip to content

Commit 3ffeee3

Browse files
committed
Auto merge of rust-lang#18136 - valadaptive:no-mangle-lints, r=Veykril
Don't lint names of #[no_mangle] extern fns [Rust doesn't run the `non_snake_case_name` lint on `extern fn`s with the `#[no_mangle]` attribute](rust-lang#44966). The conditions are: - The function must be `extern` and have a `#[no_mangle]` attribute. - The function's ABI must not be explicitly set to "Rust". This PR replicates that logic here.
2 parents e700b48 + fcf38be commit 3ffeee3

File tree

2 files changed

+73
-6
lines changed

2 files changed

+73
-6
lines changed

src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/decl_check.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use hir_expand::{
2424
name::{AsName, Name},
2525
HirFileId, HirFileIdExt,
2626
};
27+
use intern::sym;
2728
use stdx::{always, never};
2829
use syntax::{
2930
ast::{self, HasName},
@@ -197,12 +198,20 @@ impl<'a> DeclValidator<'a> {
197198
// Skipped if function is an associated item of a trait implementation.
198199
if !self.is_trait_impl_container(container) {
199200
let data = self.db.function_data(func);
200-
self.create_incorrect_case_diagnostic_for_item_name(
201-
func,
202-
&data.name,
203-
CaseType::LowerSnakeCase,
204-
IdentType::Function,
205-
);
201+
202+
// Don't run the lint on extern "[not Rust]" fn items with the
203+
// #[no_mangle] attribute.
204+
let no_mangle = data.attrs.by_key(&sym::no_mangle).exists();
205+
if no_mangle && data.abi.as_ref().is_some_and(|abi| *abi != sym::Rust) {
206+
cov_mark::hit!(extern_func_no_mangle_ignored);
207+
} else {
208+
self.create_incorrect_case_diagnostic_for_item_name(
209+
func,
210+
&data.name,
211+
CaseType::LowerSnakeCase,
212+
IdentType::Function,
213+
);
214+
}
206215
} else {
207216
cov_mark::hit!(trait_impl_assoc_func_name_incorrect_case_ignored);
208217
}

src/tools/rust-analyzer/crates/ide-diagnostics/src/handlers/incorrect_case.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,64 @@ fn f((_O): u8) {}
418418
)
419419
}
420420

421+
#[test]
422+
fn ignores_no_mangle_items() {
423+
cov_mark::check!(extern_func_no_mangle_ignored);
424+
check_diagnostics(
425+
r#"
426+
#[no_mangle]
427+
extern "C" fn NonSnakeCaseName(some_var: u8) -> u8;
428+
"#,
429+
);
430+
}
431+
432+
#[test]
433+
fn ignores_no_mangle_items_with_no_abi() {
434+
cov_mark::check!(extern_func_no_mangle_ignored);
435+
check_diagnostics(
436+
r#"
437+
#[no_mangle]
438+
extern fn NonSnakeCaseName(some_var: u8) -> u8;
439+
"#,
440+
);
441+
}
442+
443+
#[test]
444+
fn no_mangle_items_with_rust_abi() {
445+
check_diagnostics(
446+
r#"
447+
#[no_mangle]
448+
extern "Rust" fn NonSnakeCaseName(some_var: u8) -> u8;
449+
// ^^^^^^^^^^^^^^^^ 💡 warn: Function `NonSnakeCaseName` should have snake_case name, e.g. `non_snake_case_name`
450+
"#,
451+
);
452+
}
453+
454+
#[test]
455+
fn no_mangle_items_non_extern() {
456+
check_diagnostics(
457+
r#"
458+
#[no_mangle]
459+
fn NonSnakeCaseName(some_var: u8) -> u8;
460+
// ^^^^^^^^^^^^^^^^ 💡 warn: Function `NonSnakeCaseName` should have snake_case name, e.g. `non_snake_case_name`
461+
"#,
462+
);
463+
}
464+
465+
#[test]
466+
fn extern_fn_name() {
467+
check_diagnostics(
468+
r#"
469+
extern "C" fn NonSnakeCaseName(some_var: u8) -> u8;
470+
// ^^^^^^^^^^^^^^^^ 💡 warn: Function `NonSnakeCaseName` should have snake_case name, e.g. `non_snake_case_name`
471+
extern "Rust" fn NonSnakeCaseName(some_var: u8) -> u8;
472+
// ^^^^^^^^^^^^^^^^ 💡 warn: Function `NonSnakeCaseName` should have snake_case name, e.g. `non_snake_case_name`
473+
extern fn NonSnakeCaseName(some_var: u8) -> u8;
474+
// ^^^^^^^^^^^^^^^^ 💡 warn: Function `NonSnakeCaseName` should have snake_case name, e.g. `non_snake_case_name`
475+
"#,
476+
);
477+
}
478+
421479
#[test]
422480
fn ignores_extern_items() {
423481
cov_mark::check!(extern_func_incorrect_case_ignored);

0 commit comments

Comments
 (0)