Don't allow unsafe statics outside of extern blocks

This commit is contained in:
Michael Goulet 2024-07-18 18:02:09 -04:00
parent 5affbb1715
commit 2f5a84ea16
6 changed files with 35 additions and 2 deletions

View File

@ -269,6 +269,9 @@ ast_passes_unsafe_negative_impl = negative impls cannot be unsafe
.negative = negative because of this .negative = negative because of this
.unsafe = unsafe because of this .unsafe = unsafe because of this
ast_passes_unsafe_static =
static items cannot be declared with `unsafe` safety qualifier outside of `extern` block
ast_passes_visibility_not_permitted = ast_passes_visibility_not_permitted =
visibility qualifiers are not permitted here visibility qualifiers are not permitted here
.enum_variant = enum variants and their fields always share the visibility of the enum they are in .enum_variant = enum variants and their fields always share the visibility of the enum they are in

View File

@ -438,6 +438,11 @@ impl<'a> AstValidator<'a> {
} }
} }
/// This ensures that items can only be `unsafe` (or unmarked) outside of extern
/// blocks.
///
/// This additionally ensures that within extern blocks, items can only be
/// `safe`/`unsafe` inside of a `unsafe`-adorned extern block.
fn check_item_safety(&self, span: Span, safety: Safety) { fn check_item_safety(&self, span: Span, safety: Safety) {
match self.extern_mod_safety { match self.extern_mod_safety {
Some(extern_safety) => { Some(extern_safety) => {
@ -1177,6 +1182,9 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
} }
ItemKind::Static(box StaticItem { expr, safety, .. }) => { ItemKind::Static(box StaticItem { expr, safety, .. }) => {
self.check_item_safety(item.span, *safety); self.check_item_safety(item.span, *safety);
if matches!(safety, Safety::Unsafe(_)) {
self.dcx().emit_err(errors::UnsafeStatic { span: item.span });
}
if expr.is_none() { if expr.is_none() {
self.dcx().emit_err(errors::StaticWithoutBody { self.dcx().emit_err(errors::StaticWithoutBody {

View File

@ -224,6 +224,13 @@ pub struct InvalidSafetyOnBareFn {
pub span: Span, pub span: Span,
} }
#[derive(Diagnostic)]
#[diag(ast_passes_unsafe_static)]
pub struct UnsafeStatic {
#[primary_span]
pub span: Span,
}
#[derive(Diagnostic)] #[derive(Diagnostic)]
#[diag(ast_passes_bound_in_context)] #[diag(ast_passes_bound_in_context)]
pub struct BoundInContext<'a> { pub struct BoundInContext<'a> {

View File

@ -28,5 +28,11 @@ error: function pointers cannot be declared with `safe` safety qualifier
LL | type FnPtr = safe fn(i32, i32) -> i32; LL | type FnPtr = safe fn(i32, i32) -> i32;
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 5 previous errors error: static items cannot be declared with `unsafe` safety qualifier outside of `extern` block
--> $DIR/safe-outside-extern.rs:28:1
|
LL | unsafe static LOL: u8 = 0;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 6 previous errors

View File

@ -25,4 +25,7 @@ type FnPtr = safe fn(i32, i32) -> i32;
//~^ ERROR: function pointers cannot be declared with `safe` safety qualifier //~^ ERROR: function pointers cannot be declared with `safe` safety qualifier
//[ungated]~| ERROR: unsafe extern {}` blocks and `safe` keyword are experimental [E0658] //[ungated]~| ERROR: unsafe extern {}` blocks and `safe` keyword are experimental [E0658]
unsafe static LOL: u8 = 0;
//~^ ERROR: static items cannot be declared with `unsafe` safety qualifier outside of `extern` block
fn main() {} fn main() {}

View File

@ -28,6 +28,12 @@ error: function pointers cannot be declared with `safe` safety qualifier
LL | type FnPtr = safe fn(i32, i32) -> i32; LL | type FnPtr = safe fn(i32, i32) -> i32;
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^
error: static items cannot be declared with `unsafe` safety qualifier outside of `extern` block
--> $DIR/safe-outside-extern.rs:28:1
|
LL | unsafe static LOL: u8 = 0;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0658]: `unsafe extern {}` blocks and `safe` keyword are experimental error[E0658]: `unsafe extern {}` blocks and `safe` keyword are experimental
--> $DIR/safe-outside-extern.rs:4:1 --> $DIR/safe-outside-extern.rs:4:1
| |
@ -78,6 +84,6 @@ LL | type FnPtr = safe fn(i32, i32) -> i32;
= help: add `#![feature(unsafe_extern_blocks)]` to the crate attributes to enable = help: add `#![feature(unsafe_extern_blocks)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error: aborting due to 10 previous errors error: aborting due to 11 previous errors
For more information about this error, try `rustc --explain E0658`. For more information about this error, try `rustc --explain E0658`.