@@ -440,16 +440,14 @@ impl<'a> AstValidator<'a> {
440
440
}
441
441
442
442
fn check_foreign_item_safety ( & self , item_span : Span , safety : Safety ) {
443
- match safety {
444
- Safety :: Unsafe ( _) | Safety :: Safe ( _)
445
- if self . extern_mod_safety == Some ( Safety :: Default ) =>
446
- {
447
- self . dcx ( ) . emit_err ( errors:: InvalidSafetyOnExtern {
448
- item_span,
449
- block : self . current_extern_span ( ) ,
450
- } ) ;
451
- }
452
- _ => { }
443
+ if matches ! ( safety, Safety :: Unsafe ( _) | Safety :: Safe ( _) )
444
+ && ( self . extern_mod_safety == Some ( Safety :: Default )
445
+ || !self . features . unsafe_extern_blocks )
446
+ {
447
+ self . dcx ( ) . emit_err ( errors:: InvalidSafetyOnExtern {
448
+ item_span,
449
+ block : self . current_extern_span ( ) ,
450
+ } ) ;
453
451
}
454
452
}
455
453
@@ -1044,13 +1042,17 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1044
1042
errors:: VisibilityNotPermittedNote :: IndividualForeignItems ,
1045
1043
) ;
1046
1044
1047
- if & Safety :: Default == safety {
1048
- this. lint_buffer . buffer_lint (
1049
- MISSING_UNSAFE_ON_EXTERN ,
1050
- item. id ,
1051
- item. span ,
1052
- BuiltinLintDiag :: MissingUnsafeOnExtern ,
1053
- ) ;
1045
+ if this. features . unsafe_extern_blocks {
1046
+ if & Safety :: Default == safety {
1047
+ this. lint_buffer . buffer_lint (
1048
+ MISSING_UNSAFE_ON_EXTERN ,
1049
+ item. id ,
1050
+ item. span ,
1051
+ BuiltinLintDiag :: MissingUnsafeOnExtern ,
1052
+ ) ;
1053
+ }
1054
+ } else if let & Safety :: Unsafe ( span) = safety {
1055
+ this. dcx ( ) . emit_err ( errors:: UnsafeItem { span, kind : "extern block" } ) ;
1054
1056
}
1055
1057
1056
1058
if abi. is_none ( ) {
0 commit comments