File tree Expand file tree Collapse file tree 4 files changed +18
-12
lines changed
compiler/rustc_ast_passes Expand file tree Collapse file tree 4 files changed +18
-12
lines changed Original file line number Diff line number Diff line change @@ -71,6 +71,8 @@ ast_passes_extern_fn_qualifiers = functions in `extern` blocks cannot have quali
7171 .suggestion = remove this qualifier
7272
7373ast_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
7678ast_passes_extern_item_ascii = items in `extern` blocks cannot use non-ascii identifiers
Original file line number Diff line number Diff 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 => {
Original file line number Diff line number Diff line change @@ -221,6 +221,13 @@ pub enum ExternBlockSuggestion {
221221pub 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}
Original file line number Diff line number Diff line change @@ -19,11 +19,6 @@ error: items in unadorned `extern` blocks cannot have safety qualifiers
1919 |
2020LL | unsafe fn foo();
2121 | ^^^^^^^^^^^^^^^^
22- |
23- help: add unsafe to this `extern` block
24- |
25- LL | unsafe extern "C" unsafe {
26- | ++++++
2722
2823error: aborting due to 3 previous errors
2924
You can’t perform that action at this time.
0 commit comments