Auto merge of #126758 - spastorino:avoid-safe-outside-unsafe-blocks, … · rust-lang/rust@fcae626 (original) (raw)
`@@ -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 StaticItem { 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
``