mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Don't allow unsafe statics outside of extern blocks
This commit is contained in:
parent
5affbb1715
commit
2f5a84ea16
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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> {
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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() {}
|
||||||
|
@ -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`.
|
||||||
|
Loading…
Reference in New Issue
Block a user