@@ -456,15 +456,29 @@ impl<'a> AstValidator<'a> {
456
456
}
457
457
}
458
458
459
- fn check_foreign_item_safety ( & self , item_span : Span , safety : Safety ) {
460
- if matches ! ( safety, Safety :: Unsafe ( _) | Safety :: Safe ( _) )
461
- && ( self . extern_mod_safety == Some ( Safety :: Default )
462
- || !self . features . unsafe_extern_blocks )
463
- {
464
- self . dcx ( ) . emit_err ( errors:: InvalidSafetyOnExtern {
465
- item_span,
466
- block : self . current_extern_span ( ) ,
467
- } ) ;
459
+ fn check_item_safety ( & self , span : Span , safety : Safety ) {
460
+ match self . extern_mod_safety {
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 ( ) ,
468
+ } ) ;
469
+ }
470
+ }
471
+ None => {
472
+ if matches ! ( safety, Safety :: Safe ( _) ) {
473
+ self . dcx ( ) . emit_err ( errors:: InvalidSafetyOnItem { span } ) ;
474
+ }
475
+ }
476
+ }
477
+ }
478
+
479
+ fn check_bare_fn_safety ( & self , span : Span , safety : Safety ) {
480
+ if matches ! ( safety, Safety :: Safe ( _) ) {
481
+ self . dcx ( ) . emit_err ( errors:: InvalidSafetyOnBareFn { span } ) ;
468
482
}
469
483
}
470
484
@@ -746,6 +760,7 @@ impl<'a> AstValidator<'a> {
746
760
fn visit_ty_common ( & mut self , ty : & ' a Ty ) {
747
761
match & ty. kind {
748
762
TyKind :: BareFn ( bfty) => {
763
+ self . check_bare_fn_safety ( bfty. decl_span , bfty. safety ) ;
749
764
self . check_fn_decl ( & bfty. decl , SelfSemantic :: No ) ;
750
765
Self :: check_decl_no_pat ( & bfty. decl , |span, _, _| {
751
766
self . dcx ( ) . emit_err ( errors:: PatternFnPointer { span } ) ;
@@ -1174,11 +1189,15 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1174
1189
} ) ;
1175
1190
}
1176
1191
}
1177
- ItemKind :: Static ( box StaticItem { expr : None , .. } ) => {
1178
- self . dcx ( ) . emit_err ( errors:: StaticWithoutBody {
1179
- span : item. span ,
1180
- replace_span : self . ending_semi_or_hi ( item. span ) ,
1181
- } ) ;
1192
+ ItemKind :: Static ( box StaticItem { expr, safety, .. } ) => {
1193
+ self . check_item_safety ( item. span , * safety) ;
1194
+
1195
+ if expr. is_none ( ) {
1196
+ self . dcx ( ) . emit_err ( errors:: StaticWithoutBody {
1197
+ span : item. span ,
1198
+ replace_span : self . ending_semi_or_hi ( item. span ) ,
1199
+ } ) ;
1200
+ }
1182
1201
}
1183
1202
ItemKind :: TyAlias (
1184
1203
ty_alias @ box TyAlias { defaultness, bounds, where_clauses, ty, .. } ,
@@ -1212,7 +1231,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1212
1231
fn visit_foreign_item ( & mut self , fi : & ' a ForeignItem ) {
1213
1232
match & fi. kind {
1214
1233
ForeignItemKind :: Fn ( box Fn { defaultness, sig, body, .. } ) => {
1215
- self . check_foreign_item_safety ( fi. span , sig. header . safety ) ;
1216
1234
self . check_defaultness ( fi. span , * defaultness) ;
1217
1235
self . check_foreign_fn_bodyless ( fi. ident , body. as_deref ( ) ) ;
1218
1236
self . check_foreign_fn_headerless ( sig. header ) ;
@@ -1233,7 +1251,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1233
1251
self . check_foreign_item_ascii_only ( fi. ident ) ;
1234
1252
}
1235
1253
ForeignItemKind :: Static ( box StaticForeignItem { expr, safety, .. } ) => {
1236
- self . check_foreign_item_safety ( fi. span , * safety) ;
1254
+ self . check_item_safety ( fi. span , * safety) ;
1237
1255
self . check_foreign_kind_bodyless ( fi. ident , "static" , expr. as_ref ( ) . map ( |b| b. span ) ) ;
1238
1256
self . check_foreign_item_ascii_only ( fi. ident ) ;
1239
1257
}
@@ -1453,6 +1471,10 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1453
1471
} ;
1454
1472
self . check_fn_decl ( fk. decl ( ) , self_semantic) ;
1455
1473
1474
+ if let Some ( & FnHeader { safety, .. } ) = fk. header ( ) {
1475
+ self . check_item_safety ( span, safety) ;
1476
+ }
1477
+
1456
1478
self . check_c_variadic_type ( fk) ;
1457
1479
1458
1480
// Functions cannot both be `const async` or `const gen`
0 commit comments