Skip to content

Commit b18f6c6

Browse files
committed
Avoid suggesting to add unsafe when the extern block is already unsafe
1 parent a62cbda commit b18f6c6

File tree

4 files changed

+18
-12
lines changed

4 files changed

+18
-12
lines changed

compiler/rustc_ast_passes/messages.ftl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ ast_passes_extern_fn_qualifiers = functions in `extern` blocks cannot have quali
7171
.suggestion = remove this qualifier
7272
7373
ast_passes_extern_invalid_safety = items in unadorned `extern` blocks cannot have safety qualifiers
74+
75+
ast_passes_extern_invalid_safety_with_suggestion = items in unadorned `extern` blocks cannot have safety qualifiers
7476
.suggestion = add unsafe to this `extern` block
7577
7678
ast_passes_extern_item_ascii = items in `extern` blocks cannot use non-ascii identifiers

compiler/rustc_ast_passes/src/ast_validation.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -459,13 +459,15 @@ impl<'a> AstValidator<'a> {
459459
fn check_item_safety(&self, span: Span, safety: Safety) {
460460
match self.extern_mod_safety {
461461
Some(extern_safety) => {
462-
if matches!(safety, Safety::Unsafe(_) | Safety::Safe(_))
463-
&& (extern_safety == Safety::Default || !self.features.unsafe_extern_blocks)
464-
{
465-
self.dcx().emit_err(errors::InvalidSafetyOnExtern {
466-
item_span: span,
467-
block: self.current_extern_span().shrink_to_lo(),
468-
});
462+
if matches!(safety, Safety::Unsafe(_) | Safety::Safe(_)) {
463+
if extern_safety == Safety::Default {
464+
self.dcx().emit_err(errors::InvalidSafetyOnExternWithSuggestion {
465+
item_span: span,
466+
block: self.current_extern_span().shrink_to_lo(),
467+
});
468+
} else if !self.features.unsafe_extern_blocks {
469+
self.dcx().emit_err(errors::InvalidSafetyOnExtern { item_span: span });
470+
}
469471
}
470472
}
471473
None => {

compiler/rustc_ast_passes/src/errors.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,13 @@ pub enum ExternBlockSuggestion {
221221
pub struct InvalidSafetyOnExtern {
222222
#[primary_span]
223223
pub item_span: Span,
224+
}
225+
226+
#[derive(Diagnostic)]
227+
#[diag(ast_passes_extern_invalid_safety_with_suggestion)]
228+
pub struct InvalidSafetyOnExternWithSuggestion {
229+
#[primary_span]
230+
pub item_span: Span,
224231
#[suggestion(code = "unsafe ", applicability = "machine-applicable", style = "verbose")]
225232
pub block: Span,
226233
}

tests/ui/parser/unsafe-foreign-mod-2.stderr

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,6 @@ error: items in unadorned `extern` blocks cannot have safety qualifiers
1919
|
2020
LL | unsafe fn foo();
2121
| ^^^^^^^^^^^^^^^^
22-
|
23-
help: add unsafe to this `extern` block
24-
|
25-
LL | unsafe extern "C" unsafe {
26-
| ++++++
2722

2823
error: aborting due to 3 previous errors
2924

0 commit comments

Comments
 (0)