@@ -440,16 +440,14 @@ impl<'a> AstValidator<'a> {
440440 }
441441
442442 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+ } ) ;
453451 }
454452 }
455453
@@ -1044,13 +1042,17 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
10441042 errors:: VisibilityNotPermittedNote :: IndividualForeignItems ,
10451043 ) ;
10461044
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" } ) ;
10541056 }
10551057
10561058 if abi. is_none ( ) {
0 commit comments