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

``