File tree 4 files changed +18
-12
lines changed
compiler/rustc_ast_passes 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
71
71
.suggestion = remove this qualifier
72
72
73
73
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
74
76
.suggestion = add unsafe to this `extern` block
75
77
76
78
ast_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> {
459
459
fn check_item_safety ( & self , span : Span , safety : Safety ) {
460
460
match self . extern_mod_safety {
461
461
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
+ }
469
471
}
470
472
}
471
473
None => {
Original file line number Diff line number Diff line change @@ -221,6 +221,13 @@ pub enum ExternBlockSuggestion {
221
221
pub struct InvalidSafetyOnExtern {
222
222
#[ primary_span]
223
223
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 ,
224
231
#[ suggestion( code = "unsafe " , applicability = "machine-applicable" , style = "verbose" ) ]
225
232
pub block : Span ,
226
233
}
Original file line number Diff line number Diff line change @@ -19,11 +19,6 @@ error: items in unadorned `extern` blocks cannot have safety qualifiers
19
19
|
20
20
LL | unsafe fn foo();
21
21
| ^^^^^^^^^^^^^^^^
22
- |
23
- help: add unsafe to this `extern` block
24
- |
25
- LL | unsafe extern "C" unsafe {
26
- | ++++++
27
22
28
23
error: aborting due to 3 previous errors
29
24
You can’t perform that action at this time.
0 commit comments