Stabilize unsafe_attributes

This commit is contained in:
carbotaniuman 2024-08-07 01:36:28 -05:00
parent 2f3dc46465
commit de9b5c3ea2
37 changed files with 64 additions and 134 deletions

View File

@ -887,7 +887,7 @@ fn validate_generic_param_order(dcx: DiagCtxtHandle<'_>, generics: &[GenericPara
impl<'a> Visitor<'a> for AstValidator<'a> { impl<'a> Visitor<'a> for AstValidator<'a> {
fn visit_attribute(&mut self, attr: &Attribute) { fn visit_attribute(&mut self, attr: &Attribute) {
validate_attr::check_attr(&self.features, &self.session.psess, attr); validate_attr::check_attr(&self.session.psess, attr);
} }
fn visit_ty(&mut self, ty: &'a Ty) { fn visit_ty(&mut self, ty: &'a Ty) {

View File

@ -559,7 +559,6 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session, features: &Features) {
gate_all!(mut_ref, "mutable by-reference bindings are experimental"); gate_all!(mut_ref, "mutable by-reference bindings are experimental");
gate_all!(precise_capturing, "precise captures on `impl Trait` are experimental"); gate_all!(precise_capturing, "precise captures on `impl Trait` are experimental");
gate_all!(global_registration, "global registration is experimental"); gate_all!(global_registration, "global registration is experimental");
gate_all!(unsafe_attributes, "`#[unsafe()]` markers for attributes are experimental");
gate_all!(return_type_notation, "return type notation is experimental"); gate_all!(return_type_notation, "return type notation is experimental");
if !visitor.features.never_patterns { if !visitor.features.never_patterns {

View File

@ -47,7 +47,6 @@ impl MultiItemModifier for Expander {
) -> ExpandResult<Vec<Annotatable>, Annotatable> { ) -> ExpandResult<Vec<Annotatable>, Annotatable> {
let template = AttributeTemplate { list: Some("path"), ..Default::default() }; let template = AttributeTemplate { list: Some("path"), ..Default::default() };
validate_attr::check_builtin_meta_item( validate_attr::check_builtin_meta_item(
&ecx.ecfg.features,
&ecx.sess.psess, &ecx.sess.psess,
meta_item, meta_item,
ast::AttrStyle::Outer, ast::AttrStyle::Outer,

View File

@ -38,7 +38,6 @@ impl MultiItemModifier for Expander {
let template = let template =
AttributeTemplate { list: Some("Trait1, Trait2, ..."), ..Default::default() }; AttributeTemplate { list: Some("Trait1, Trait2, ..."), ..Default::default() };
validate_attr::check_builtin_meta_item( validate_attr::check_builtin_meta_item(
features,
&sess.psess, &sess.psess,
meta_item, meta_item,
ast::AttrStyle::Outer, ast::AttrStyle::Outer,

View File

@ -17,7 +17,6 @@ pub(crate) fn check_builtin_macro_attribute(ecx: &ExtCtxt<'_>, meta_item: &MetaI
// All the built-in macro attributes are "words" at the moment. // All the built-in macro attributes are "words" at the moment.
let template = AttributeTemplate { word: true, ..Default::default() }; let template = AttributeTemplate { word: true, ..Default::default() };
validate_attr::check_builtin_meta_item( validate_attr::check_builtin_meta_item(
&ecx.ecfg.features,
&ecx.sess.psess, &ecx.sess.psess,
meta_item, meta_item,
AttrStyle::Outer, AttrStyle::Outer,

View File

@ -265,12 +265,7 @@ impl<'a> StripUnconfigured<'a> {
/// is in the original source file. Gives a compiler error if the syntax of /// is in the original source file. Gives a compiler error if the syntax of
/// the attribute is incorrect. /// the attribute is incorrect.
pub(crate) fn expand_cfg_attr(&self, cfg_attr: &Attribute, recursive: bool) -> Vec<Attribute> { pub(crate) fn expand_cfg_attr(&self, cfg_attr: &Attribute, recursive: bool) -> Vec<Attribute> {
validate_attr::check_attribute_safety( validate_attr::check_attribute_safety(&self.sess.psess, AttributeSafety::Normal, &cfg_attr);
self.features.unwrap_or(&Features::default()),
&self.sess.psess,
AttributeSafety::Normal,
&cfg_attr,
);
let Some((cfg_predicate, expanded_attrs)) = let Some((cfg_predicate, expanded_attrs)) =
rustc_parse::parse_cfg_attr(cfg_attr, &self.sess.psess) rustc_parse::parse_cfg_attr(cfg_attr, &self.sess.psess)
@ -395,11 +390,7 @@ impl<'a> StripUnconfigured<'a> {
} }
}; };
validate_attr::deny_builtin_meta_unsafety( validate_attr::deny_builtin_meta_unsafety(&self.sess.psess, &meta_item);
self.features.unwrap_or(&Features::default()),
&self.sess.psess,
&meta_item,
);
( (
parse_cfg(&meta_item, self.sess).map_or(true, |meta_item| { parse_cfg(&meta_item, self.sess).map_or(true, |meta_item| {

View File

@ -1883,7 +1883,7 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
let mut span: Option<Span> = None; let mut span: Option<Span> = None;
while let Some(attr) = attrs.next() { while let Some(attr) = attrs.next() {
rustc_ast_passes::feature_gate::check_attribute(attr, self.cx.sess, features); rustc_ast_passes::feature_gate::check_attribute(attr, self.cx.sess, features);
validate_attr::check_attr(features, &self.cx.sess.psess, attr); validate_attr::check_attr(&self.cx.sess.psess, attr);
let current_span = if let Some(sp) = span { sp.to(attr.span) } else { attr.span }; let current_span = if let Some(sp) = span { sp.to(attr.span) } else { attr.span };
span = Some(current_span); span = Some(current_span);

View File

@ -388,6 +388,8 @@ declare_features! (
(accepted, universal_impl_trait, "1.26.0", Some(34511)), (accepted, universal_impl_trait, "1.26.0", Some(34511)),
/// Allows arbitrary delimited token streams in non-macro attributes. /// Allows arbitrary delimited token streams in non-macro attributes.
(accepted, unrestricted_attribute_tokens, "1.34.0", Some(55208)), (accepted, unrestricted_attribute_tokens, "1.34.0", Some(55208)),
/// Allows unsafe attributes.
(accepted, unsafe_attributes, "CURRENT_RUSTC_VERSION", Some(123757)),
/// The `unsafe_op_in_unsafe_fn` lint (allowed by default): no longer treat an unsafe function as an unsafe block. /// The `unsafe_op_in_unsafe_fn` lint (allowed by default): no longer treat an unsafe function as an unsafe block.
(accepted, unsafe_block_in_unsafe_fn, "1.52.0", Some(71668)), (accepted, unsafe_block_in_unsafe_fn, "1.52.0", Some(71668)),
/// Allows unsafe on extern declarations and safety qualifiers over internal items. /// Allows unsafe on extern declarations and safety qualifiers over internal items.

View File

@ -627,8 +627,6 @@ declare_features! (
(unstable, type_changing_struct_update, "1.58.0", Some(86555)), (unstable, type_changing_struct_update, "1.58.0", Some(86555)),
/// Allows unnamed fields of struct and union type /// Allows unnamed fields of struct and union type
(incomplete, unnamed_fields, "1.74.0", Some(49804)), (incomplete, unnamed_fields, "1.74.0", Some(49804)),
/// Allows unsafe attributes.
(unstable, unsafe_attributes, "1.80.0", Some(123757)),
/// Allows const generic parameters to be defined with types that /// Allows const generic parameters to be defined with types that
/// are not `Sized`, e.g. `fn foo<const N: [u8]>() {`. /// are not `Sized`, e.g. `fn foo<const N: [u8]>() {`.
(incomplete, unsized_const_params, "CURRENT_RUSTC_VERSION", Some(95174)), (incomplete, unsized_const_params, "CURRENT_RUSTC_VERSION", Some(95174)),

View File

@ -4937,7 +4937,6 @@ declare_lint! {
/// ### Example /// ### Example
/// ///
/// ```rust /// ```rust
/// #![feature(unsafe_attributes)]
/// #![warn(unsafe_attr_outside_unsafe)] /// #![warn(unsafe_attr_outside_unsafe)]
/// ///
/// #[no_mangle] /// #[no_mangle]

View File

@ -4,7 +4,7 @@ use rustc_ast::token::{self, Delimiter};
use rustc_errors::codes::*; use rustc_errors::codes::*;
use rustc_errors::{Diag, PResult}; use rustc_errors::{Diag, PResult};
use rustc_span::symbol::kw; use rustc_span::symbol::kw;
use rustc_span::{sym, BytePos, Span}; use rustc_span::{BytePos, Span};
use thin_vec::ThinVec; use thin_vec::ThinVec;
use tracing::debug; use tracing::debug;
@ -261,7 +261,6 @@ impl<'a> Parser<'a> {
let is_unsafe = this.eat_keyword(kw::Unsafe); let is_unsafe = this.eat_keyword(kw::Unsafe);
let unsafety = if is_unsafe { let unsafety = if is_unsafe {
let unsafe_span = this.prev_token.span; let unsafe_span = this.prev_token.span;
this.psess.gated_spans.gate(sym::unsafe_attributes, unsafe_span);
this.expect(&token::OpenDelim(Delimiter::Parenthesis))?; this.expect(&token::OpenDelim(Delimiter::Parenthesis))?;
ast::Safety::Unsafe(unsafe_span) ast::Safety::Unsafe(unsafe_span)
} else { } else {
@ -400,7 +399,6 @@ impl<'a> Parser<'a> {
}; };
let unsafety = if is_unsafe { let unsafety = if is_unsafe {
let unsafe_span = self.prev_token.span; let unsafe_span = self.prev_token.span;
self.psess.gated_spans.gate(sym::unsafe_attributes, unsafe_span);
self.expect(&token::OpenDelim(Delimiter::Parenthesis))?; self.expect(&token::OpenDelim(Delimiter::Parenthesis))?;
ast::Safety::Unsafe(unsafe_span) ast::Safety::Unsafe(unsafe_span)

View File

@ -7,9 +7,7 @@ use rustc_ast::{
NestedMetaItem, Safety, NestedMetaItem, Safety,
}; };
use rustc_errors::{Applicability, FatalError, PResult}; use rustc_errors::{Applicability, FatalError, PResult};
use rustc_feature::{ use rustc_feature::{AttributeSafety, AttributeTemplate, BuiltinAttribute, BUILTIN_ATTRIBUTE_MAP};
AttributeSafety, AttributeTemplate, BuiltinAttribute, Features, BUILTIN_ATTRIBUTE_MAP,
};
use rustc_session::errors::report_lit_error; use rustc_session::errors::report_lit_error;
use rustc_session::lint::builtin::{ILL_FORMED_ATTRIBUTE_INPUT, UNSAFE_ATTR_OUTSIDE_UNSAFE}; use rustc_session::lint::builtin::{ILL_FORMED_ATTRIBUTE_INPUT, UNSAFE_ATTR_OUTSIDE_UNSAFE};
use rustc_session::lint::BuiltinLintDiag; use rustc_session::lint::BuiltinLintDiag;
@ -18,7 +16,7 @@ use rustc_span::{sym, BytePos, Span, Symbol};
use crate::{errors, parse_in}; use crate::{errors, parse_in};
pub fn check_attr(features: &Features, psess: &ParseSess, attr: &Attribute) { pub fn check_attr(psess: &ParseSess, attr: &Attribute) {
if attr.is_doc_comment() { if attr.is_doc_comment() {
return; return;
} }
@ -28,7 +26,7 @@ pub fn check_attr(features: &Features, psess: &ParseSess, attr: &Attribute) {
// All non-builtin attributes are considered safe // All non-builtin attributes are considered safe
let safety = attr_info.map(|x| x.safety).unwrap_or(AttributeSafety::Normal); let safety = attr_info.map(|x| x.safety).unwrap_or(AttributeSafety::Normal);
check_attribute_safety(features, psess, safety, attr); check_attribute_safety(psess, safety, attr);
// Check input tokens for built-in and key-value attributes. // Check input tokens for built-in and key-value attributes.
match attr_info { match attr_info {
@ -36,9 +34,9 @@ pub fn check_attr(features: &Features, psess: &ParseSess, attr: &Attribute) {
Some(BuiltinAttribute { name, template, .. }) if *name != sym::rustc_dummy => { Some(BuiltinAttribute { name, template, .. }) if *name != sym::rustc_dummy => {
match parse_meta(psess, attr) { match parse_meta(psess, attr) {
// Don't check safety again, we just did that // Don't check safety again, we just did that
Ok(meta) => check_builtin_meta_item( Ok(meta) => {
features, psess, &meta, attr.style, *name, *template, false, check_builtin_meta_item(psess, &meta, attr.style, *name, *template, false)
), }
Err(err) => { Err(err) => {
err.emit(); err.emit();
} }
@ -157,16 +155,7 @@ fn is_attr_template_compatible(template: &AttributeTemplate, meta: &ast::MetaIte
} }
} }
pub fn check_attribute_safety( pub fn check_attribute_safety(psess: &ParseSess, safety: AttributeSafety, attr: &Attribute) {
features: &Features,
psess: &ParseSess,
safety: AttributeSafety,
attr: &Attribute,
) {
if !features.unsafe_attributes {
return;
}
let attr_item = attr.get_normal_item(); let attr_item = attr.get_normal_item();
if safety == AttributeSafety::Unsafe { if safety == AttributeSafety::Unsafe {
@ -215,21 +204,18 @@ pub fn check_attribute_safety(
// Called by `check_builtin_meta_item` and code that manually denies // Called by `check_builtin_meta_item` and code that manually denies
// `unsafe(...)` in `cfg` // `unsafe(...)` in `cfg`
pub fn deny_builtin_meta_unsafety(features: &Features, psess: &ParseSess, meta: &MetaItem) { pub fn deny_builtin_meta_unsafety(psess: &ParseSess, meta: &MetaItem) {
// This only supports denying unsafety right now - making builtin attributes // This only supports denying unsafety right now - making builtin attributes
// support unsafety will requite us to thread the actual `Attribute` through // support unsafety will requite us to thread the actual `Attribute` through
// for the nice diagnostics. // for the nice diagnostics.
if features.unsafe_attributes {
if let Safety::Unsafe(unsafe_span) = meta.unsafety { if let Safety::Unsafe(unsafe_span) = meta.unsafety {
psess psess
.dcx() .dcx()
.emit_err(errors::InvalidAttrUnsafe { span: unsafe_span, name: meta.path.clone() }); .emit_err(errors::InvalidAttrUnsafe { span: unsafe_span, name: meta.path.clone() });
} }
} }
}
pub fn check_builtin_meta_item( pub fn check_builtin_meta_item(
features: &Features,
psess: &ParseSess, psess: &ParseSess,
meta: &MetaItem, meta: &MetaItem,
style: ast::AttrStyle, style: ast::AttrStyle,
@ -246,7 +232,7 @@ pub fn check_builtin_meta_item(
} }
if deny_unsafety { if deny_unsafety {
deny_builtin_meta_unsafety(features, psess, meta); deny_builtin_meta_unsafety(psess, meta);
} }
} }

View File

@ -1,4 +1,3 @@
#![feature(unsafe_attributes)]
// https://github.com/rust-lang/rust/issues/123757 // https://github.com/rust-lang/rust/issues/123757
// //
#![simple_ident] #![simple_ident]

View File

@ -1,5 +1,4 @@
//@ build-pass //@ build-pass
#![feature(unsafe_attributes)]
#[cfg_attr(all(), unsafe(no_mangle))] #[cfg_attr(all(), unsafe(no_mangle))]
fn a() {} fn a() {}

View File

@ -1,5 +1,3 @@
#![feature(unsafe_attributes)]
#[derive(unsafe(Debug))] #[derive(unsafe(Debug))]
//~^ ERROR: expected identifier, found keyword `unsafe` //~^ ERROR: expected identifier, found keyword `unsafe`
//~| ERROR: traits in `#[derive(...)]` don't accept arguments //~| ERROR: traits in `#[derive(...)]` don't accept arguments

View File

@ -1,5 +1,5 @@
error: expected identifier, found keyword `unsafe` error: expected identifier, found keyword `unsafe`
--> $DIR/derive-unsafe-attributes.rs:3:10 --> $DIR/derive-unsafe-attributes.rs:1:10
| |
LL | #[derive(unsafe(Debug))] LL | #[derive(unsafe(Debug))]
| ^^^^^^ expected identifier, found keyword | ^^^^^^ expected identifier, found keyword
@ -10,13 +10,13 @@ LL | #[derive(r#unsafe(Debug))]
| ++ | ++
error: traits in `#[derive(...)]` don't accept arguments error: traits in `#[derive(...)]` don't accept arguments
--> $DIR/derive-unsafe-attributes.rs:3:16 --> $DIR/derive-unsafe-attributes.rs:1:16
| |
LL | #[derive(unsafe(Debug))] LL | #[derive(unsafe(Debug))]
| ^^^^^^^ help: remove the arguments | ^^^^^^^ help: remove the arguments
error: `derive` is not an unsafe attribute error: `derive` is not an unsafe attribute
--> $DIR/derive-unsafe-attributes.rs:12:3 --> $DIR/derive-unsafe-attributes.rs:10:3
| |
LL | #[unsafe(derive(Debug))] LL | #[unsafe(derive(Debug))]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -24,7 +24,7 @@ LL | #[unsafe(derive(Debug))]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: expected identifier, found keyword `unsafe` error: expected identifier, found keyword `unsafe`
--> $DIR/derive-unsafe-attributes.rs:3:10 --> $DIR/derive-unsafe-attributes.rs:1:10
| |
LL | #[derive(unsafe(Debug))] LL | #[derive(unsafe(Debug))]
| ^^^^^^ expected identifier, found keyword | ^^^^^^ expected identifier, found keyword
@ -36,7 +36,7 @@ LL | #[derive(r#unsafe(Debug))]
| ++ | ++
error: expected identifier, found keyword `unsafe` error: expected identifier, found keyword `unsafe`
--> $DIR/derive-unsafe-attributes.rs:3:10 --> $DIR/derive-unsafe-attributes.rs:1:10
| |
LL | #[derive(unsafe(Debug))] LL | #[derive(unsafe(Debug))]
| ^^^^^^ expected identifier, found keyword | ^^^^^^ expected identifier, found keyword
@ -48,13 +48,13 @@ LL | #[derive(r#unsafe(Debug))]
| ++ | ++
error: cannot find derive macro `r#unsafe` in this scope error: cannot find derive macro `r#unsafe` in this scope
--> $DIR/derive-unsafe-attributes.rs:3:10 --> $DIR/derive-unsafe-attributes.rs:1:10
| |
LL | #[derive(unsafe(Debug))] LL | #[derive(unsafe(Debug))]
| ^^^^^^ | ^^^^^^
error: cannot find derive macro `r#unsafe` in this scope error: cannot find derive macro `r#unsafe` in this scope
--> $DIR/derive-unsafe-attributes.rs:3:10 --> $DIR/derive-unsafe-attributes.rs:1:10
| |
LL | #[derive(unsafe(Debug))] LL | #[derive(unsafe(Debug))]
| ^^^^^^ | ^^^^^^

View File

@ -1,5 +1,3 @@
#![feature(unsafe_attributes)]
#[unsafe(unsafe(no_mangle))] #[unsafe(unsafe(no_mangle))]
//~^ ERROR expected identifier, found keyword `unsafe` //~^ ERROR expected identifier, found keyword `unsafe`
//~| ERROR cannot find attribute `r#unsafe` in this scope //~| ERROR cannot find attribute `r#unsafe` in this scope

View File

@ -1,5 +1,5 @@
error: expected identifier, found keyword `unsafe` error: expected identifier, found keyword `unsafe`
--> $DIR/double-unsafe-attributes.rs:3:10 --> $DIR/double-unsafe-attributes.rs:1:10
| |
LL | #[unsafe(unsafe(no_mangle))] LL | #[unsafe(unsafe(no_mangle))]
| ^^^^^^ expected identifier, found keyword | ^^^^^^ expected identifier, found keyword
@ -10,7 +10,7 @@ LL | #[unsafe(r#unsafe(no_mangle))]
| ++ | ++
error: `r#unsafe` is not an unsafe attribute error: `r#unsafe` is not an unsafe attribute
--> $DIR/double-unsafe-attributes.rs:3:3 --> $DIR/double-unsafe-attributes.rs:1:3
| |
LL | #[unsafe(unsafe(no_mangle))] LL | #[unsafe(unsafe(no_mangle))]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -18,7 +18,7 @@ LL | #[unsafe(unsafe(no_mangle))]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: cannot find attribute `r#unsafe` in this scope error: cannot find attribute `r#unsafe` in this scope
--> $DIR/double-unsafe-attributes.rs:3:10 --> $DIR/double-unsafe-attributes.rs:1:10
| |
LL | #[unsafe(unsafe(no_mangle))] LL | #[unsafe(unsafe(no_mangle))]
| ^^^^^^ | ^^^^^^

View File

@ -1,6 +1,5 @@
//@ edition: 2024 //@ edition: 2024
//@ compile-flags: -Zunstable-options //@ compile-flags: -Zunstable-options
#![feature(unsafe_attributes)]
#[unsafe(cfg(any()))] //~ ERROR: is not an unsafe attribute #[unsafe(cfg(any()))] //~ ERROR: is not an unsafe attribute
fn a() {} fn a() {}

View File

@ -1,5 +1,5 @@
error: `cfg` is not an unsafe attribute error: `cfg` is not an unsafe attribute
--> $DIR/extraneous-unsafe-attributes.rs:5:3 --> $DIR/extraneous-unsafe-attributes.rs:4:3
| |
LL | #[unsafe(cfg(any()))] LL | #[unsafe(cfg(any()))]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -7,7 +7,7 @@ LL | #[unsafe(cfg(any()))]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: `cfg_attr` is not an unsafe attribute error: `cfg_attr` is not an unsafe attribute
--> $DIR/extraneous-unsafe-attributes.rs:8:3 --> $DIR/extraneous-unsafe-attributes.rs:7:3
| |
LL | #[unsafe(cfg_attr(any(), allow(dead_code)))] LL | #[unsafe(cfg_attr(any(), allow(dead_code)))]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -15,7 +15,7 @@ LL | #[unsafe(cfg_attr(any(), allow(dead_code)))]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: `test` is not an unsafe attribute error: `test` is not an unsafe attribute
--> $DIR/extraneous-unsafe-attributes.rs:11:3 --> $DIR/extraneous-unsafe-attributes.rs:10:3
| |
LL | #[unsafe(test)] LL | #[unsafe(test)]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -23,7 +23,7 @@ LL | #[unsafe(test)]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: `ignore` is not an unsafe attribute error: `ignore` is not an unsafe attribute
--> $DIR/extraneous-unsafe-attributes.rs:14:3 --> $DIR/extraneous-unsafe-attributes.rs:13:3
| |
LL | #[unsafe(ignore = "test")] LL | #[unsafe(ignore = "test")]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -31,7 +31,7 @@ LL | #[unsafe(ignore = "test")]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: `should_panic` is not an unsafe attribute error: `should_panic` is not an unsafe attribute
--> $DIR/extraneous-unsafe-attributes.rs:17:3 --> $DIR/extraneous-unsafe-attributes.rs:16:3
| |
LL | #[unsafe(should_panic(expected = "test"))] LL | #[unsafe(should_panic(expected = "test"))]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -39,7 +39,7 @@ LL | #[unsafe(should_panic(expected = "test"))]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: `macro_use` is not an unsafe attribute error: `macro_use` is not an unsafe attribute
--> $DIR/extraneous-unsafe-attributes.rs:20:3 --> $DIR/extraneous-unsafe-attributes.rs:19:3
| |
LL | #[unsafe(macro_use)] LL | #[unsafe(macro_use)]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -47,7 +47,7 @@ LL | #[unsafe(macro_use)]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: `macro_export` is not an unsafe attribute error: `macro_export` is not an unsafe attribute
--> $DIR/extraneous-unsafe-attributes.rs:22:7 --> $DIR/extraneous-unsafe-attributes.rs:21:7
| |
LL | #[unsafe(macro_export)] LL | #[unsafe(macro_export)]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -55,7 +55,7 @@ LL | #[unsafe(macro_export)]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: `used` is not an unsafe attribute error: `used` is not an unsafe attribute
--> $DIR/extraneous-unsafe-attributes.rs:28:3 --> $DIR/extraneous-unsafe-attributes.rs:27:3
| |
LL | #[unsafe(used)] LL | #[unsafe(used)]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute

View File

@ -1,5 +1,3 @@
#![feature(unsafe_attributes)]
#[unsafe(proc_macro)] #[unsafe(proc_macro)]
//~^ ERROR: is not an unsafe attribute //~^ ERROR: is not an unsafe attribute
//~| ERROR attribute is only usable with crates of the `proc-macro` crate type //~| ERROR attribute is only usable with crates of the `proc-macro` crate type

View File

@ -1,11 +1,11 @@
error[E0452]: malformed lint attribute input error[E0452]: malformed lint attribute input
--> $DIR/proc-unsafe-attributes.rs:28:16 --> $DIR/proc-unsafe-attributes.rs:26:16
| |
LL | #[unsafe(allow(unsafe(dead_code)))] LL | #[unsafe(allow(unsafe(dead_code)))]
| ^^^^^^^^^^^^^^^^^ bad attribute argument | ^^^^^^^^^^^^^^^^^ bad attribute argument
error[E0452]: malformed lint attribute input error[E0452]: malformed lint attribute input
--> $DIR/proc-unsafe-attributes.rs:28:16 --> $DIR/proc-unsafe-attributes.rs:26:16
| |
LL | #[unsafe(allow(unsafe(dead_code)))] LL | #[unsafe(allow(unsafe(dead_code)))]
| ^^^^^^^^^^^^^^^^^ bad attribute argument | ^^^^^^^^^^^^^^^^^ bad attribute argument
@ -13,7 +13,7 @@ LL | #[unsafe(allow(unsafe(dead_code)))]
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
error: `proc_macro` is not an unsafe attribute error: `proc_macro` is not an unsafe attribute
--> $DIR/proc-unsafe-attributes.rs:3:3 --> $DIR/proc-unsafe-attributes.rs:1:3
| |
LL | #[unsafe(proc_macro)] LL | #[unsafe(proc_macro)]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -21,7 +21,7 @@ LL | #[unsafe(proc_macro)]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: `proc_macro_derive` is not an unsafe attribute error: `proc_macro_derive` is not an unsafe attribute
--> $DIR/proc-unsafe-attributes.rs:9:3 --> $DIR/proc-unsafe-attributes.rs:7:3
| |
LL | #[unsafe(proc_macro_derive(Foo))] LL | #[unsafe(proc_macro_derive(Foo))]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -29,7 +29,7 @@ LL | #[unsafe(proc_macro_derive(Foo))]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: expected identifier, found keyword `unsafe` error: expected identifier, found keyword `unsafe`
--> $DIR/proc-unsafe-attributes.rs:14:21 --> $DIR/proc-unsafe-attributes.rs:12:21
| |
LL | #[proc_macro_derive(unsafe(Foo))] LL | #[proc_macro_derive(unsafe(Foo))]
| ^^^^^^ expected identifier, found keyword | ^^^^^^ expected identifier, found keyword
@ -40,7 +40,7 @@ LL | #[proc_macro_derive(r#unsafe(Foo))]
| ++ | ++
error: `proc_macro_attribute` is not an unsafe attribute error: `proc_macro_attribute` is not an unsafe attribute
--> $DIR/proc-unsafe-attributes.rs:19:3 --> $DIR/proc-unsafe-attributes.rs:17:3
| |
LL | #[unsafe(proc_macro_attribute)] LL | #[unsafe(proc_macro_attribute)]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -48,7 +48,7 @@ LL | #[unsafe(proc_macro_attribute)]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: `allow` is not an unsafe attribute error: `allow` is not an unsafe attribute
--> $DIR/proc-unsafe-attributes.rs:24:3 --> $DIR/proc-unsafe-attributes.rs:22:3
| |
LL | #[unsafe(allow(dead_code))] LL | #[unsafe(allow(dead_code))]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -56,7 +56,7 @@ LL | #[unsafe(allow(dead_code))]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: `allow` is not an unsafe attribute error: `allow` is not an unsafe attribute
--> $DIR/proc-unsafe-attributes.rs:28:3 --> $DIR/proc-unsafe-attributes.rs:26:3
| |
LL | #[unsafe(allow(unsafe(dead_code)))] LL | #[unsafe(allow(unsafe(dead_code)))]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute
@ -64,7 +64,7 @@ LL | #[unsafe(allow(unsafe(dead_code)))]
= note: extraneous unsafe is not allowed in attributes = note: extraneous unsafe is not allowed in attributes
error: expected identifier, found keyword `unsafe` error: expected identifier, found keyword `unsafe`
--> $DIR/proc-unsafe-attributes.rs:28:16 --> $DIR/proc-unsafe-attributes.rs:26:16
| |
LL | #[unsafe(allow(unsafe(dead_code)))] LL | #[unsafe(allow(unsafe(dead_code)))]
| ^^^^^^ expected identifier, found keyword | ^^^^^^ expected identifier, found keyword
@ -75,31 +75,31 @@ LL | #[unsafe(allow(r#unsafe(dead_code)))]
| ++ | ++
error: the `#[proc_macro]` attribute is only usable with crates of the `proc-macro` crate type error: the `#[proc_macro]` attribute is only usable with crates of the `proc-macro` crate type
--> $DIR/proc-unsafe-attributes.rs:3:1 --> $DIR/proc-unsafe-attributes.rs:1:1
| |
LL | #[unsafe(proc_macro)] LL | #[unsafe(proc_macro)]
| ^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^
error: the `#[proc_macro_derive]` attribute is only usable with crates of the `proc-macro` crate type error: the `#[proc_macro_derive]` attribute is only usable with crates of the `proc-macro` crate type
--> $DIR/proc-unsafe-attributes.rs:9:1 --> $DIR/proc-unsafe-attributes.rs:7:1
| |
LL | #[unsafe(proc_macro_derive(Foo))] LL | #[unsafe(proc_macro_derive(Foo))]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: the `#[proc_macro_derive]` attribute is only usable with crates of the `proc-macro` crate type error: the `#[proc_macro_derive]` attribute is only usable with crates of the `proc-macro` crate type
--> $DIR/proc-unsafe-attributes.rs:14:1 --> $DIR/proc-unsafe-attributes.rs:12:1
| |
LL | #[proc_macro_derive(unsafe(Foo))] LL | #[proc_macro_derive(unsafe(Foo))]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: the `#[proc_macro_attribute]` attribute is only usable with crates of the `proc-macro` crate type error: the `#[proc_macro_attribute]` attribute is only usable with crates of the `proc-macro` crate type
--> $DIR/proc-unsafe-attributes.rs:19:1 --> $DIR/proc-unsafe-attributes.rs:17:1
| |
LL | #[unsafe(proc_macro_attribute)] LL | #[unsafe(proc_macro_attribute)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0452]: malformed lint attribute input error[E0452]: malformed lint attribute input
--> $DIR/proc-unsafe-attributes.rs:28:16 --> $DIR/proc-unsafe-attributes.rs:26:16
| |
LL | #[unsafe(allow(unsafe(dead_code)))] LL | #[unsafe(allow(unsafe(dead_code)))]
| ^^^^^^^^^^^^^^^^^ bad attribute argument | ^^^^^^^^^^^^^^^^^ bad attribute argument
@ -107,7 +107,7 @@ LL | #[unsafe(allow(unsafe(dead_code)))]
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
error[E0452]: malformed lint attribute input error[E0452]: malformed lint attribute input
--> $DIR/proc-unsafe-attributes.rs:28:16 --> $DIR/proc-unsafe-attributes.rs:26:16
| |
LL | #[unsafe(allow(unsafe(dead_code)))] LL | #[unsafe(allow(unsafe(dead_code)))]
| ^^^^^^^^^^^^^^^^^ bad attribute argument | ^^^^^^^^^^^^^^^^^ bad attribute argument

View File

@ -1,5 +1,4 @@
//@ build-pass //@ build-pass
#![feature(unsafe_attributes)]
#[unsafe(no_mangle)] #[unsafe(no_mangle)]
fn a() {} fn a() {}

View File

@ -1,5 +1,3 @@
#![feature(unsafe_attributes)]
#[unsafe(repr(C))] //~ ERROR: is not an unsafe attribute #[unsafe(repr(C))] //~ ERROR: is not an unsafe attribute
struct Foo {} struct Foo {}

View File

@ -1,5 +1,5 @@
error: `repr` is not an unsafe attribute error: `repr` is not an unsafe attribute
--> $DIR/unsafe-safe-attribute.rs:3:3 --> $DIR/unsafe-safe-attribute.rs:1:3
| |
LL | #[unsafe(repr(C))] LL | #[unsafe(repr(C))]
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute

View File

@ -1,5 +1,3 @@
#![feature(unsafe_attributes)]
#[unsafe(diagnostic::on_unimplemented( //~ ERROR: is not an unsafe attribute #[unsafe(diagnostic::on_unimplemented( //~ ERROR: is not an unsafe attribute
message = "testing", message = "testing",
))] ))]

View File

@ -1,5 +1,5 @@
error: `diagnostic::on_unimplemented` is not an unsafe attribute error: `diagnostic::on_unimplemented` is not an unsafe attribute
--> $DIR/unsafe-safe-attribute_diagnostic.rs:3:3 --> $DIR/unsafe-safe-attribute_diagnostic.rs:1:3
| |
LL | #[unsafe(diagnostic::on_unimplemented( LL | #[unsafe(diagnostic::on_unimplemented(
| ^^^^^^ this is not an unsafe attribute | ^^^^^^ this is not an unsafe attribute

View File

@ -1,8 +0,0 @@
#[unsafe(no_mangle)] //~ ERROR [E0658]
extern "C" fn foo() {
}
fn main() {
foo();
}

View File

@ -1,13 +0,0 @@
error[E0658]: `#[unsafe()]` markers for attributes are experimental
--> $DIR/feature-gate-unsafe-attributes.rs:1:3
|
LL | #[unsafe(no_mangle)]
| ^^^^^^
|
= note: see issue #123757 <https://github.com/rust-lang/rust/issues/123757> for more information
= help: add `#![feature(unsafe_attributes)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0658`.

View File

@ -1,5 +1,4 @@
#![deny(rust_2024_compatibility)] #![deny(rust_2024_compatibility)]
#![feature(unsafe_attributes)]
#[no_mangle] #[no_mangle]
//~^ ERROR: unsafe attribute used without unsafe //~^ ERROR: unsafe attribute used without unsafe

View File

@ -1,5 +1,5 @@
error: unsafe attribute used without unsafe error: unsafe attribute used without unsafe
--> $DIR/in_2024_compatibility.rs:4:3 --> $DIR/in_2024_compatibility.rs:3:3
| |
LL | #[no_mangle] LL | #[no_mangle]
| ^^^^^^^^^ usage of unsafe attribute | ^^^^^^^^^ usage of unsafe attribute

View File

@ -4,7 +4,6 @@
//@[edition2024] compile-flags: -Zunstable-options //@[edition2024] compile-flags: -Zunstable-options
//@ check-pass //@ check-pass
#![feature(unsafe_attributes)]
#[unsafe(no_mangle)] #[unsafe(no_mangle)]
extern "C" fn foo() {} extern "C" fn foo() {}

View File

@ -1,5 +1,4 @@
//@ run-rustfix //@ run-rustfix
#![feature(unsafe_attributes)]
#![deny(unsafe_attr_outside_unsafe)] #![deny(unsafe_attr_outside_unsafe)]
macro_rules! tt { macro_rules! tt {

View File

@ -1,5 +1,4 @@
//@ run-rustfix //@ run-rustfix
#![feature(unsafe_attributes)]
#![deny(unsafe_attr_outside_unsafe)] #![deny(unsafe_attr_outside_unsafe)]
macro_rules! tt { macro_rules! tt {

View File

@ -1,5 +1,5 @@
error: unsafe attribute used without unsafe error: unsafe attribute used without unsafe
--> $DIR/unsafe-attributes-fix.rs:44:6 --> $DIR/unsafe-attributes-fix.rs:43:6
| |
LL | tt!([no_mangle]); LL | tt!([no_mangle]);
| ^^^^^^^^^ usage of unsafe attribute | ^^^^^^^^^ usage of unsafe attribute
@ -7,7 +7,7 @@ LL | tt!([no_mangle]);
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2024! = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2024!
= note: for more information, see issue #123757 <https://github.com/rust-lang/rust/issues/123757> = note: for more information, see issue #123757 <https://github.com/rust-lang/rust/issues/123757>
note: the lint level is defined here note: the lint level is defined here
--> $DIR/unsafe-attributes-fix.rs:3:9 --> $DIR/unsafe-attributes-fix.rs:2:9
| |
LL | #![deny(unsafe_attr_outside_unsafe)] LL | #![deny(unsafe_attr_outside_unsafe)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -17,7 +17,7 @@ LL | tt!([unsafe(no_mangle)]);
| +++++++ + | +++++++ +
error: unsafe attribute used without unsafe error: unsafe attribute used without unsafe
--> $DIR/unsafe-attributes-fix.rs:14:11 --> $DIR/unsafe-attributes-fix.rs:13:11
| |
LL | #[$e] LL | #[$e]
| ^^ usage of unsafe attribute | ^^ usage of unsafe attribute
@ -34,7 +34,7 @@ LL | #[unsafe($e)]
| +++++++ + | +++++++ +
error: unsafe attribute used without unsafe error: unsafe attribute used without unsafe
--> $DIR/unsafe-attributes-fix.rs:48:7 --> $DIR/unsafe-attributes-fix.rs:47:7
| |
LL | meta!(no_mangle); LL | meta!(no_mangle);
| ^^^^^^^^^ usage of unsafe attribute | ^^^^^^^^^ usage of unsafe attribute
@ -47,7 +47,7 @@ LL | meta!(unsafe(no_mangle));
| +++++++ + | +++++++ +
error: unsafe attribute used without unsafe error: unsafe attribute used without unsafe
--> $DIR/unsafe-attributes-fix.rs:51:8 --> $DIR/unsafe-attributes-fix.rs:50:8
| |
LL | meta2!(export_name = "baw"); LL | meta2!(export_name = "baw");
| ^^^^^^^^^^^ usage of unsafe attribute | ^^^^^^^^^^^ usage of unsafe attribute
@ -60,7 +60,7 @@ LL | meta2!(unsafe(export_name = "baw"));
| +++++++ + | +++++++ +
error: unsafe attribute used without unsafe error: unsafe attribute used without unsafe
--> $DIR/unsafe-attributes-fix.rs:23:11 --> $DIR/unsafe-attributes-fix.rs:22:11
| |
LL | #[$e = $l] LL | #[$e = $l]
| ^^ usage of unsafe attribute | ^^ usage of unsafe attribute
@ -77,7 +77,7 @@ LL | #[unsafe($e = $l)]
| +++++++ + | +++++++ +
error: unsafe attribute used without unsafe error: unsafe attribute used without unsafe
--> $DIR/unsafe-attributes-fix.rs:56:3 --> $DIR/unsafe-attributes-fix.rs:55:3
| |
LL | #[no_mangle] LL | #[no_mangle]
| ^^^^^^^^^ usage of unsafe attribute | ^^^^^^^^^ usage of unsafe attribute

View File

@ -1,5 +1,5 @@
error: unsafe attribute used without unsafe error: unsafe attribute used without unsafe
--> $DIR/unsafe-attributes.rs:9:3 --> $DIR/unsafe-attributes.rs:8:3
| |
LL | #[no_mangle] LL | #[no_mangle]
| ^^^^^^^^^ usage of unsafe attribute | ^^^^^^^^^ usage of unsafe attribute

View File

@ -4,7 +4,6 @@
//@[edition2024] edition:2024 //@[edition2024] edition:2024
//@[edition2024] compile-flags: -Zunstable-options //@[edition2024] compile-flags: -Zunstable-options
#![feature(unsafe_attributes)]
#[no_mangle] //[edition2024]~ ERROR: unsafe attribute used without unsafe #[no_mangle] //[edition2024]~ ERROR: unsafe attribute used without unsafe
extern "C" fn foo() {} extern "C" fn foo() {}