Add toggle for parse_meta_item
unsafe parsing
This makes it possible for the `unsafe(...)` syntax to only be valid at the top level, and the `NestedMetaItem`s will automatically reject `unsafe(...)`.
This commit is contained in:
parent
d8bc8761a5
commit
49db8a5a99
@ -115,9 +115,6 @@ builtin_macros_derive_path_args_list = traits in `#[derive(...)]` don't accept a
|
||||
builtin_macros_derive_path_args_value = traits in `#[derive(...)]` don't accept values
|
||||
.suggestion = remove the value
|
||||
|
||||
builtin_macros_derive_unsafe_path = traits in `#[derive(...)]` don't accept `unsafe(...)`
|
||||
.suggestion = remove the `unsafe(...)`
|
||||
|
||||
builtin_macros_env_not_defined = environment variable `{$var}` not defined at compile time
|
||||
.cargo = Cargo sets build script variables at run time. Use `std::env::var({$var_expr})` instead
|
||||
.custom = use `std::env::var({$var_expr})` to read the variable at run time
|
||||
|
@ -6,6 +6,7 @@
|
||||
use rustc_ast::tokenstream::TokenStream;
|
||||
use rustc_errors::PResult;
|
||||
use rustc_expand::base::{DummyResult, ExpandResult, ExtCtxt, MacEager, MacroExpanderResult};
|
||||
use rustc_parse::parser::attr::AllowLeadingUnsafe;
|
||||
use rustc_span::Span;
|
||||
use {rustc_ast as ast, rustc_attr as attr};
|
||||
|
||||
@ -42,7 +43,7 @@ fn parse_cfg<'a>(cx: &ExtCtxt<'a>, span: Span, tts: TokenStream) -> PResult<'a,
|
||||
return Err(cx.dcx().create_err(errors::RequiresCfgPattern { span }));
|
||||
}
|
||||
|
||||
let cfg = p.parse_meta_item()?;
|
||||
let cfg = p.parse_meta_item(AllowLeadingUnsafe::Yes)?;
|
||||
|
||||
let _ = p.eat(&token::Comma);
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
use rustc_ast as ast;
|
||||
use rustc_ast::{GenericParamKind, ItemKind, MetaItemKind, NestedMetaItem, Safety, StmtKind};
|
||||
use rustc_ast::{GenericParamKind, ItemKind, MetaItemKind, NestedMetaItem, StmtKind};
|
||||
use rustc_expand::base::{
|
||||
Annotatable, DeriveResolution, ExpandResult, ExtCtxt, Indeterminate, MultiItemModifier,
|
||||
};
|
||||
@ -62,7 +62,6 @@ fn expand(
|
||||
// Reject `#[derive(Debug = "value", Debug(abc))]`, but recover the
|
||||
// paths.
|
||||
report_path_args(sess, meta);
|
||||
report_unsafe_args(sess, meta);
|
||||
meta.path.clone()
|
||||
})
|
||||
.map(|path| DeriveResolution {
|
||||
@ -162,13 +161,3 @@ fn report_path_args(sess: &Session, meta: &ast::MetaItem) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn report_unsafe_args(sess: &Session, meta: &ast::MetaItem) {
|
||||
match meta.unsafety {
|
||||
Safety::Unsafe(span) => {
|
||||
sess.dcx().emit_err(errors::DeriveUnsafePath { span });
|
||||
}
|
||||
Safety::Default => {}
|
||||
Safety::Safe(_) => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
@ -297,13 +297,6 @@ pub(crate) struct DerivePathArgsValue {
|
||||
pub(crate) span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(builtin_macros_derive_unsafe_path)]
|
||||
pub(crate) struct DeriveUnsafePath {
|
||||
#[primary_span]
|
||||
pub(crate) span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(builtin_macros_no_default_variant)]
|
||||
#[help]
|
||||
|
@ -8,7 +8,9 @@
|
||||
use rustc_ast::{self as ast, AttrStyle, Attribute, HasAttrs, HasTokens, MetaItem, NodeId};
|
||||
use rustc_attr as attr;
|
||||
use rustc_data_structures::flat_map_in_place::FlatMapInPlace;
|
||||
use rustc_feature::{AttributeSafety, Features, ACCEPTED_FEATURES, REMOVED_FEATURES, UNSTABLE_FEATURES};
|
||||
use rustc_feature::{
|
||||
AttributeSafety, Features, ACCEPTED_FEATURES, REMOVED_FEATURES, UNSTABLE_FEATURES,
|
||||
};
|
||||
use rustc_lint_defs::BuiltinLintDiag;
|
||||
use rustc_parse::validate_attr;
|
||||
use rustc_session::parse::feature_err;
|
||||
|
@ -15,6 +15,7 @@
|
||||
use rustc_middle::ty::CurrentGcx;
|
||||
use rustc_middle::util::Providers;
|
||||
use rustc_parse::new_parser_from_source_str;
|
||||
use rustc_parse::parser::attr::AllowLeadingUnsafe;
|
||||
use rustc_query_impl::QueryCtxt;
|
||||
use rustc_query_system::query::print_query_stack;
|
||||
use rustc_session::config::{self, Cfg, CheckCfg, ExpectedValues, Input, OutFileName};
|
||||
@ -67,7 +68,7 @@ macro_rules! error {
|
||||
}
|
||||
|
||||
match new_parser_from_source_str(&psess, filename, s.to_string()) {
|
||||
Ok(mut parser) => match parser.parse_meta_item() {
|
||||
Ok(mut parser) => match parser.parse_meta_item(AllowLeadingUnsafe::No) {
|
||||
Ok(meta_item) if parser.token == token::Eof => {
|
||||
if meta_item.path.segments.len() != 1 {
|
||||
error!("argument key must be an identifier");
|
||||
@ -173,7 +174,7 @@ macro_rules! error {
|
||||
}
|
||||
};
|
||||
|
||||
let meta_item = match parser.parse_meta_item() {
|
||||
let meta_item = match parser.parse_meta_item(AllowLeadingUnsafe::Yes) {
|
||||
Ok(meta_item) if parser.token == token::Eof => meta_item,
|
||||
Ok(..) => expected_error(),
|
||||
Err(err) => {
|
||||
|
@ -365,6 +365,7 @@ parse_inner_doc_comment_not_permitted = expected outer doc comment
|
||||
.sugg_change_inner_to_outer = to annotate the {$item}, change the doc comment from inner to outer style
|
||||
|
||||
parse_invalid_attr_unsafe = `{$name}` is not an unsafe attribute
|
||||
.label = this is not an unsafe attribute
|
||||
.suggestion = remove the `unsafe(...)`
|
||||
.note = extraneous unsafe is not allowed in attributes
|
||||
|
||||
|
@ -3188,6 +3188,7 @@ pub(crate) struct DotDotRangeAttribute {
|
||||
#[note]
|
||||
pub struct InvalidAttrUnsafe {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub span: Span,
|
||||
pub name: Path,
|
||||
}
|
||||
|
@ -31,6 +31,12 @@ enum OuterAttributeType {
|
||||
Attribute,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq)]
|
||||
pub enum AllowLeadingUnsafe {
|
||||
Yes,
|
||||
No,
|
||||
}
|
||||
|
||||
impl<'a> Parser<'a> {
|
||||
/// Parses attributes that appear before an item.
|
||||
pub(super) fn parse_outer_attributes(&mut self) -> PResult<'a, AttrWrapper> {
|
||||
@ -332,7 +338,7 @@ pub(crate) fn parse_unsuffixed_meta_item_lit(&mut self) -> PResult<'a, ast::Meta
|
||||
|
||||
/// Parses `cfg_attr(pred, attr_item_list)` where `attr_item_list` is comma-delimited.
|
||||
pub fn parse_cfg_attr(&mut self) -> PResult<'a, (ast::MetaItem, Vec<(ast::AttrItem, Span)>)> {
|
||||
let cfg_predicate = self.parse_meta_item()?;
|
||||
let cfg_predicate = self.parse_meta_item(AllowLeadingUnsafe::No)?;
|
||||
self.expect(&token::Comma)?;
|
||||
|
||||
// Presumably, the majority of the time there will only be one attr.
|
||||
@ -368,7 +374,10 @@ pub(crate) fn parse_meta_seq_top(&mut self) -> PResult<'a, ThinVec<ast::NestedMe
|
||||
/// MetaItem = SimplePath ( '=' UNSUFFIXED_LIT | '(' MetaSeq? ')' )? ;
|
||||
/// MetaSeq = MetaItemInner (',' MetaItemInner)* ','? ;
|
||||
/// ```
|
||||
pub fn parse_meta_item(&mut self) -> PResult<'a, ast::MetaItem> {
|
||||
pub fn parse_meta_item(
|
||||
&mut self,
|
||||
unsafe_allowed: AllowLeadingUnsafe,
|
||||
) -> PResult<'a, ast::MetaItem> {
|
||||
// We can't use `maybe_whole` here because it would bump in the `None`
|
||||
// case, which we don't want.
|
||||
if let token::Interpolated(nt) = &self.token.kind
|
||||
@ -384,7 +393,11 @@ pub fn parse_meta_item(&mut self) -> PResult<'a, ast::MetaItem> {
|
||||
}
|
||||
|
||||
let lo = self.token.span;
|
||||
let is_unsafe = self.eat_keyword(kw::Unsafe);
|
||||
let is_unsafe = if unsafe_allowed == AllowLeadingUnsafe::Yes {
|
||||
self.eat_keyword(kw::Unsafe)
|
||||
} else {
|
||||
false
|
||||
};
|
||||
let unsafety = if is_unsafe {
|
||||
let unsafe_span = self.prev_token.span;
|
||||
self.psess.gated_spans.gate(sym::unsafe_attributes, unsafe_span);
|
||||
@ -427,7 +440,7 @@ fn parse_meta_item_inner(&mut self) -> PResult<'a, ast::NestedMetaItem> {
|
||||
Err(err) => err.cancel(), // we provide a better error below
|
||||
}
|
||||
|
||||
match self.parse_meta_item() {
|
||||
match self.parse_meta_item(AllowLeadingUnsafe::No) {
|
||||
Ok(mi) => return Ok(ast::NestedMetaItem::MetaItem(mi)),
|
||||
Err(err) => err.cancel(), // we provide a better error below
|
||||
}
|
||||
|
@ -163,7 +163,10 @@ pub fn check_attribute_safety(
|
||||
safety: AttributeSafety,
|
||||
attr: &Attribute,
|
||||
) {
|
||||
if features.unsafe_attributes {
|
||||
if !features.unsafe_attributes {
|
||||
return;
|
||||
}
|
||||
|
||||
let attr_item = attr.get_normal_item();
|
||||
|
||||
if safety == AttributeSafety::Unsafe {
|
||||
@ -177,9 +180,7 @@ pub fn check_attribute_safety(
|
||||
let diag_span = if attr_item.span().can_be_used_for_suggestions() {
|
||||
attr_item.span()
|
||||
} else {
|
||||
attr.span
|
||||
.with_lo(attr.span.lo() + BytePos(2))
|
||||
.with_hi(attr.span.hi() - BytePos(1))
|
||||
attr.span.with_lo(attr.span.lo() + BytePos(2)).with_hi(attr.span.hi() - BytePos(1))
|
||||
};
|
||||
|
||||
if attr.span.at_least_rust_2024() {
|
||||
@ -210,7 +211,6 @@ pub fn check_attribute_safety(
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Called by `check_builtin_meta_item` and code that manually denies
|
||||
|
@ -1,6 +1,12 @@
|
||||
#![feature(unsafe_attributes)]
|
||||
|
||||
#[derive(unsafe(Debug))] //~ ERROR: traits in `#[derive(...)]` don't accept `unsafe(...)`
|
||||
#[derive(unsafe(Debug))]
|
||||
//~^ ERROR: expected identifier, found keyword `unsafe`
|
||||
//~| ERROR: traits in `#[derive(...)]` don't accept arguments
|
||||
//~| ERROR: expected identifier, found keyword `unsafe`
|
||||
//~| ERROR: expected identifier, found keyword `unsafe`
|
||||
//~| ERROR: cannot find derive macro `r#unsafe` in this scope
|
||||
//~| ERROR: cannot find derive macro `r#unsafe` in this scope
|
||||
struct Foo;
|
||||
|
||||
#[unsafe(derive(Debug))] //~ ERROR: is not an unsafe attribute
|
||||
|
@ -1,16 +1,65 @@
|
||||
error: traits in `#[derive(...)]` don't accept `unsafe(...)`
|
||||
error: expected identifier, found keyword `unsafe`
|
||||
--> $DIR/derive-unsafe-attributes.rs:3:10
|
||||
|
|
||||
LL | #[derive(unsafe(Debug))]
|
||||
| ^^^^^^ expected identifier, found keyword
|
||||
|
|
||||
help: escape `unsafe` to use it as an identifier
|
||||
|
|
||||
LL | #[derive(r#unsafe(Debug))]
|
||||
| ++
|
||||
|
||||
error: traits in `#[derive(...)]` don't accept arguments
|
||||
--> $DIR/derive-unsafe-attributes.rs:3:16
|
||||
|
|
||||
LL | #[derive(unsafe(Debug))]
|
||||
| ^^^^^^^ help: remove the arguments
|
||||
|
||||
error: `derive` is not an unsafe attribute
|
||||
--> $DIR/derive-unsafe-attributes.rs:12:3
|
||||
|
|
||||
LL | #[unsafe(derive(Debug))]
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
error: expected identifier, found keyword `unsafe`
|
||||
--> $DIR/derive-unsafe-attributes.rs:3:10
|
||||
|
|
||||
LL | #[derive(unsafe(Debug))]
|
||||
| ^^^^^^ expected identifier, found keyword
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
help: escape `unsafe` to use it as an identifier
|
||||
|
|
||||
LL | #[derive(r#unsafe(Debug))]
|
||||
| ++
|
||||
|
||||
error: expected identifier, found keyword `unsafe`
|
||||
--> $DIR/derive-unsafe-attributes.rs:3:10
|
||||
|
|
||||
LL | #[derive(unsafe(Debug))]
|
||||
| ^^^^^^ expected identifier, found keyword
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
help: escape `unsafe` to use it as an identifier
|
||||
|
|
||||
LL | #[derive(r#unsafe(Debug))]
|
||||
| ++
|
||||
|
||||
error: cannot find derive macro `r#unsafe` in this scope
|
||||
--> $DIR/derive-unsafe-attributes.rs:3:10
|
||||
|
|
||||
LL | #[derive(unsafe(Debug))]
|
||||
| ^^^^^^
|
||||
|
||||
error: `derive` is not an unsafe attribute
|
||||
--> $DIR/derive-unsafe-attributes.rs:6:3
|
||||
error: cannot find derive macro `r#unsafe` in this scope
|
||||
--> $DIR/derive-unsafe-attributes.rs:3:10
|
||||
|
|
||||
LL | #[unsafe(derive(Debug))]
|
||||
LL | #[derive(unsafe(Debug))]
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
|
@ -13,7 +13,7 @@ error: `r#unsafe` is not an unsafe attribute
|
||||
--> $DIR/double-unsafe-attributes.rs:3:3
|
||||
|
|
||||
LL | #[unsafe(unsafe(no_mangle))]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
|
@ -2,7 +2,7 @@ error: `cfg` is not an unsafe attribute
|
||||
--> $DIR/extraneous-unsafe-attributes.rs:5:3
|
||||
|
|
||||
LL | #[unsafe(cfg(any()))]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
@ -10,7 +10,7 @@ error: `cfg_attr` is not an unsafe attribute
|
||||
--> $DIR/extraneous-unsafe-attributes.rs:8:3
|
||||
|
|
||||
LL | #[unsafe(cfg_attr(any(), allow(dead_code)))]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
@ -18,7 +18,7 @@ error: `test` is not an unsafe attribute
|
||||
--> $DIR/extraneous-unsafe-attributes.rs:11:3
|
||||
|
|
||||
LL | #[unsafe(test)]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
@ -26,7 +26,7 @@ error: `ignore` is not an unsafe attribute
|
||||
--> $DIR/extraneous-unsafe-attributes.rs:14:3
|
||||
|
|
||||
LL | #[unsafe(ignore = "test")]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
@ -34,7 +34,7 @@ error: `should_panic` is not an unsafe attribute
|
||||
--> $DIR/extraneous-unsafe-attributes.rs:17:3
|
||||
|
|
||||
LL | #[unsafe(should_panic(expected = "test"))]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
@ -42,7 +42,7 @@ error: `macro_use` is not an unsafe attribute
|
||||
--> $DIR/extraneous-unsafe-attributes.rs:20:3
|
||||
|
|
||||
LL | #[unsafe(macro_use)]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
@ -50,7 +50,7 @@ error: `macro_export` is not an unsafe attribute
|
||||
--> $DIR/extraneous-unsafe-attributes.rs:22:7
|
||||
|
|
||||
LL | #[unsafe(macro_export)]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
@ -58,7 +58,7 @@ error: `used` is not an unsafe attribute
|
||||
--> $DIR/extraneous-unsafe-attributes.rs:28:3
|
||||
|
|
||||
LL | #[unsafe(used)]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
|
@ -13,6 +13,7 @@ pub fn b() {}
|
||||
|
||||
#[proc_macro_derive(unsafe(Foo))]
|
||||
//~^ ERROR attribute is only usable with crates of the `proc-macro` crate type
|
||||
//~| ERROR: expected identifier, found keyword `unsafe`
|
||||
pub fn c() {}
|
||||
|
||||
#[unsafe(proc_macro_attribute)]
|
||||
@ -24,4 +25,13 @@ pub fn d() {}
|
||||
//~^ ERROR: is not an unsafe attribute
|
||||
pub fn e() {}
|
||||
|
||||
#[unsafe(allow(unsafe(dead_code)))]
|
||||
//~^ ERROR: is not an unsafe attribute
|
||||
//~| ERROR: malformed lint attribute input
|
||||
//~| ERROR: malformed lint attribute input
|
||||
//~| ERROR: expected identifier, found keyword `unsafe`
|
||||
//~| ERROR: malformed lint attribute input
|
||||
//~| ERROR: malformed lint attribute input
|
||||
pub fn f() {}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,8 +1,22 @@
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/proc-unsafe-attributes.rs:28:16
|
||||
|
|
||||
LL | #[unsafe(allow(unsafe(dead_code)))]
|
||||
| ^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/proc-unsafe-attributes.rs:28:16
|
||||
|
|
||||
LL | #[unsafe(allow(unsafe(dead_code)))]
|
||||
| ^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
error: `proc_macro` is not an unsafe attribute
|
||||
--> $DIR/proc-unsafe-attributes.rs:3:3
|
||||
|
|
||||
LL | #[unsafe(proc_macro)]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
@ -10,26 +24,56 @@ error: `proc_macro_derive` is not an unsafe attribute
|
||||
--> $DIR/proc-unsafe-attributes.rs:9:3
|
||||
|
|
||||
LL | #[unsafe(proc_macro_derive(Foo))]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
error: expected identifier, found keyword `unsafe`
|
||||
--> $DIR/proc-unsafe-attributes.rs:14:21
|
||||
|
|
||||
LL | #[proc_macro_derive(unsafe(Foo))]
|
||||
| ^^^^^^ expected identifier, found keyword
|
||||
|
|
||||
help: escape `unsafe` to use it as an identifier
|
||||
|
|
||||
LL | #[proc_macro_derive(r#unsafe(Foo))]
|
||||
| ++
|
||||
|
||||
error: `proc_macro_attribute` is not an unsafe attribute
|
||||
--> $DIR/proc-unsafe-attributes.rs:18:3
|
||||
--> $DIR/proc-unsafe-attributes.rs:19:3
|
||||
|
|
||||
LL | #[unsafe(proc_macro_attribute)]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
error: `allow` is not an unsafe attribute
|
||||
--> $DIR/proc-unsafe-attributes.rs:23:3
|
||||
--> $DIR/proc-unsafe-attributes.rs:24:3
|
||||
|
|
||||
LL | #[unsafe(allow(dead_code))]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
error: `allow` is not an unsafe attribute
|
||||
--> $DIR/proc-unsafe-attributes.rs:28:3
|
||||
|
|
||||
LL | #[unsafe(allow(unsafe(dead_code)))]
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
error: expected identifier, found keyword `unsafe`
|
||||
--> $DIR/proc-unsafe-attributes.rs:28:16
|
||||
|
|
||||
LL | #[unsafe(allow(unsafe(dead_code)))]
|
||||
| ^^^^^^ expected identifier, found keyword
|
||||
|
|
||||
help: escape `unsafe` to use it as an identifier
|
||||
|
|
||||
LL | #[unsafe(allow(r#unsafe(dead_code)))]
|
||||
| ++
|
||||
|
||||
error: the `#[proc_macro]` attribute is only usable with crates of the `proc-macro` crate type
|
||||
--> $DIR/proc-unsafe-attributes.rs:3:1
|
||||
|
|
||||
@ -49,10 +93,27 @@ LL | #[proc_macro_derive(unsafe(Foo))]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: the `#[proc_macro_attribute]` attribute is only usable with crates of the `proc-macro` crate type
|
||||
--> $DIR/proc-unsafe-attributes.rs:18:1
|
||||
--> $DIR/proc-unsafe-attributes.rs:19:1
|
||||
|
|
||||
LL | #[unsafe(proc_macro_attribute)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/proc-unsafe-attributes.rs:28:16
|
||||
|
|
||||
LL | #[unsafe(allow(unsafe(dead_code)))]
|
||||
| ^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/proc-unsafe-attributes.rs:28:16
|
||||
|
|
||||
LL | #[unsafe(allow(unsafe(dead_code)))]
|
||||
| ^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
error: aborting due to 15 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0452`.
|
||||
|
@ -4,4 +4,10 @@
|
||||
#[unsafe(no_mangle)]
|
||||
fn a() {}
|
||||
|
||||
#[unsafe(export_name = "foo")]
|
||||
fn b() {}
|
||||
|
||||
#[cfg_attr(any(), unsafe(no_mangle))]
|
||||
static VAR2: u32 = 1;
|
||||
|
||||
fn main() {}
|
||||
|
@ -2,7 +2,7 @@ error: `repr` is not an unsafe attribute
|
||||
--> $DIR/unsafe-safe-attribute.rs:3:3
|
||||
|
|
||||
LL | #[unsafe(repr(C))]
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
|
@ -2,7 +2,7 @@ error: `diagnostic::on_unimplemented` is not an unsafe attribute
|
||||
--> $DIR/unsafe-safe-attribute_diagnostic.rs:3:3
|
||||
|
|
||||
LL | #[unsafe(diagnostic::on_unimplemented(
|
||||
| ^^^^^^
|
||||
| ^^^^^^ this is not an unsafe attribute
|
||||
|
|
||||
= note: extraneous unsafe is not allowed in attributes
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user