Port #[allow_internal_unsafe] to the new attribute system (attempt 2)
This commit is contained in:
parent
577166503a
commit
6603fe1caa
11 changed files with 85 additions and 28 deletions
|
|
@ -113,3 +113,11 @@ impl<S: Stage> AttributeParser<S> for MacroUseParser {
|
|||
Some(AttributeKind::MacroUse { span: self.first_span?, arguments: self.state })
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) struct AllowInternalUnsafeParser;
|
||||
|
||||
impl<S: Stage> NoArgsAttributeParser<S> for AllowInternalUnsafeParser {
|
||||
const PATH: &[Symbol] = &[sym::allow_internal_unsafe];
|
||||
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Ignore;
|
||||
const CREATE: fn(Span) -> AttributeKind = |span| AttributeKind::AllowInternalUnsafe(span);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,9 @@ use crate::attributes::lint_helpers::{
|
|||
AsPtrParser, AutomaticallyDerivedParser, PassByValueParser, PubTransparentParser,
|
||||
};
|
||||
use crate::attributes::loop_match::{ConstContinueParser, LoopMatchParser};
|
||||
use crate::attributes::macro_attrs::{MacroEscapeParser, MacroUseParser};
|
||||
use crate::attributes::macro_attrs::{
|
||||
AllowInternalUnsafeParser, MacroEscapeParser, MacroUseParser,
|
||||
};
|
||||
use crate::attributes::must_use::MustUseParser;
|
||||
use crate::attributes::no_implicit_prelude::NoImplicitPreludeParser;
|
||||
use crate::attributes::non_exhaustive::NonExhaustiveParser;
|
||||
|
|
@ -178,6 +180,7 @@ attribute_parsers!(
|
|||
Single<SkipDuringMethodDispatchParser>,
|
||||
Single<TransparencyParser>,
|
||||
Single<WithoutArgs<AllowIncoherentImplParser>>,
|
||||
Single<WithoutArgs<AllowInternalUnsafeParser>>,
|
||||
Single<WithoutArgs<AsPtrParser>>,
|
||||
Single<WithoutArgs<AutomaticallyDerivedParser>>,
|
||||
Single<WithoutArgs<CoherenceIsCoreParser>>,
|
||||
|
|
|
|||
|
|
@ -904,10 +904,7 @@ impl SyntaxExtension {
|
|||
find_attr!(attrs, AttributeKind::AllowInternalUnstable(i, _) => i)
|
||||
.map(|i| i.as_slice())
|
||||
.unwrap_or_default();
|
||||
// FIXME(jdonszelman): allow_internal_unsafe isn't yet new-style
|
||||
// let allow_internal_unsafe = find_attr!(attrs, AttributeKind::AllowInternalUnsafe);
|
||||
let allow_internal_unsafe =
|
||||
ast::attr::find_by_name(attrs, sym::allow_internal_unsafe).is_some();
|
||||
let allow_internal_unsafe = find_attr!(attrs, AttributeKind::AllowInternalUnsafe(_));
|
||||
|
||||
let local_inner_macros = ast::attr::find_by_name(attrs, sym::macro_export)
|
||||
.and_then(|macro_export| macro_export.meta_item_list())
|
||||
|
|
|
|||
|
|
@ -249,6 +249,9 @@ pub enum AttributeKind {
|
|||
/// Represents `#[rustc_allow_incoherent_impl]`.
|
||||
AllowIncoherentImpl(Span),
|
||||
|
||||
/// Represents `#[allow_internal_unsafe]`.
|
||||
AllowInternalUnsafe(Span),
|
||||
|
||||
/// Represents `#[allow_internal_unstable]`.
|
||||
AllowInternalUnstable(ThinVec<(Symbol, Span)>, Span),
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ impl AttributeKind {
|
|||
Align { .. } => No,
|
||||
AllowConstFnUnstable(..) => No,
|
||||
AllowIncoherentImpl(..) => No,
|
||||
AllowInternalUnsafe(..) => Yes,
|
||||
AllowInternalUnstable(..) => Yes,
|
||||
AsPtr(..) => Yes,
|
||||
AutomaticallyDerived(..) => Yes,
|
||||
|
|
|
|||
|
|
@ -1310,6 +1310,7 @@ impl AttributeExt for Attribute {
|
|||
Attribute::Parsed(AttributeKind::Ignore { span, .. }) => *span,
|
||||
Attribute::Parsed(AttributeKind::ShouldPanic { span, .. }) => *span,
|
||||
Attribute::Parsed(AttributeKind::AutomaticallyDerived(span)) => *span,
|
||||
Attribute::Parsed(AttributeKind::AllowInternalUnsafe(span)) => *span,
|
||||
a => panic!("can't get the span of an arbitrary parsed attribute: {a:?}"),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ use rustc_ast::tokenstream::{TokenStream, TokenTree};
|
|||
use rustc_ast::visit::{FnCtxt, FnKind};
|
||||
use rustc_ast::{self as ast, *};
|
||||
use rustc_ast_pretty::pprust::expr_to_string;
|
||||
use rustc_attr_parsing::AttributeParser;
|
||||
use rustc_errors::{Applicability, LintDiagnostic};
|
||||
use rustc_feature::GateIssue;
|
||||
use rustc_hir as hir;
|
||||
|
|
@ -248,12 +249,6 @@ impl UnsafeCode {
|
|||
}
|
||||
|
||||
impl EarlyLintPass for UnsafeCode {
|
||||
fn check_attribute(&mut self, cx: &EarlyContext<'_>, attr: &ast::Attribute) {
|
||||
if attr.has_name(sym::allow_internal_unsafe) {
|
||||
self.report_unsafe(cx, attr.span, BuiltinUnsafe::AllowInternalUnsafe);
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &ast::Expr) {
|
||||
if let ast::ExprKind::Block(ref blk, _) = e.kind {
|
||||
|
|
@ -312,6 +307,19 @@ impl EarlyLintPass for UnsafeCode {
|
|||
}
|
||||
}
|
||||
|
||||
ast::ItemKind::MacroDef(..) => {
|
||||
if let Some(attr) = AttributeParser::parse_limited(
|
||||
cx.builder.sess(),
|
||||
&it.attrs,
|
||||
sym::allow_internal_unsafe,
|
||||
it.span,
|
||||
DUMMY_NODE_ID,
|
||||
Some(cx.builder.features()),
|
||||
) {
|
||||
self.report_unsafe(cx, attr.span(), BuiltinUnsafe::AllowInternalUnsafe);
|
||||
}
|
||||
}
|
||||
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ passes_allow_incoherent_impl =
|
|||
`rustc_allow_incoherent_impl` attribute should be applied to impl items
|
||||
.label = the only currently supported targets are inherent methods
|
||||
|
||||
passes_allow_internal_unstable =
|
||||
passes_macro_only_attribute =
|
||||
attribute should be applied to a macro
|
||||
.label = not a macro
|
||||
|
||||
|
|
|
|||
|
|
@ -207,6 +207,9 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
Attribute::Parsed(AttributeKind::ConstContinue(attr_span)) => {
|
||||
self.check_const_continue(hir_id, *attr_span, target)
|
||||
}
|
||||
Attribute::Parsed(AttributeKind::AllowInternalUnsafe(attr_span)) => {
|
||||
self.check_allow_internal_unsafe(hir_id, *attr_span, span, target, attrs)
|
||||
}
|
||||
Attribute::Parsed(AttributeKind::AllowInternalUnstable(_, first_span)) => {
|
||||
self.check_allow_internal_unstable(hir_id, *first_span, span, target, attrs)
|
||||
}
|
||||
|
|
@ -413,7 +416,6 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
// internal
|
||||
| sym::prelude_import
|
||||
| sym::panic_handler
|
||||
| sym::allow_internal_unsafe
|
||||
| sym::lang
|
||||
| sym::needs_allocator
|
||||
| sym::default_lib_allocator
|
||||
|
|
@ -2212,7 +2214,6 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
|
||||
/// Outputs an error for `#[allow_internal_unstable]` which can only be applied to macros.
|
||||
/// (Allows proc_macro functions)
|
||||
// FIXME(jdonszelmann): if possible, move to attr parsing
|
||||
fn check_allow_internal_unstable(
|
||||
&self,
|
||||
hir_id: HirId,
|
||||
|
|
@ -2220,6 +2221,42 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
span: Span,
|
||||
target: Target,
|
||||
attrs: &[Attribute],
|
||||
) {
|
||||
self.check_macro_only_attr(
|
||||
hir_id,
|
||||
attr_span,
|
||||
span,
|
||||
target,
|
||||
attrs,
|
||||
"allow_internal_unstable",
|
||||
)
|
||||
}
|
||||
|
||||
/// Outputs an error for `#[allow_internal_unsafe]` which can only be applied to macros.
|
||||
/// (Allows proc_macro functions)
|
||||
fn check_allow_internal_unsafe(
|
||||
&self,
|
||||
hir_id: HirId,
|
||||
attr_span: Span,
|
||||
span: Span,
|
||||
target: Target,
|
||||
attrs: &[Attribute],
|
||||
) {
|
||||
self.check_macro_only_attr(hir_id, attr_span, span, target, attrs, "allow_internal_unsafe")
|
||||
}
|
||||
|
||||
/// Outputs an error for attributes that can only be applied to macros, such as
|
||||
/// `#[allow_internal_unsafe]` and `#[allow_internal_unstable]`.
|
||||
/// (Allows proc_macro functions)
|
||||
// FIXME(jdonszelmann): if possible, move to attr parsing
|
||||
fn check_macro_only_attr(
|
||||
&self,
|
||||
hir_id: HirId,
|
||||
attr_span: Span,
|
||||
span: Span,
|
||||
target: Target,
|
||||
attrs: &[Attribute],
|
||||
attr_name: &str,
|
||||
) {
|
||||
match target {
|
||||
Target::Fn => {
|
||||
|
|
@ -2238,18 +2275,14 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
// erroneously allowed it and some crates used it accidentally, to be compatible
|
||||
// with crates depending on them, we can't throw an error here.
|
||||
Target::Field | Target::Arm => {
|
||||
self.inline_attr_str_error_without_macro_def(
|
||||
hir_id,
|
||||
attr_span,
|
||||
"allow_internal_unstable",
|
||||
);
|
||||
self.inline_attr_str_error_without_macro_def(hir_id, attr_span, attr_name);
|
||||
return;
|
||||
}
|
||||
// otherwise continue out of the match
|
||||
_ => {}
|
||||
}
|
||||
|
||||
self.tcx.dcx().emit_err(errors::AllowInternalUnstable { attr_span, span });
|
||||
self.tcx.dcx().emit_err(errors::MacroOnlyAttribute { attr_span, span });
|
||||
}
|
||||
|
||||
/// Checks if the items on the `#[debugger_visualizer]` attribute are valid.
|
||||
|
|
|
|||
|
|
@ -643,8 +643,8 @@ pub(crate) struct UsedStatic {
|
|||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(passes_allow_internal_unstable)]
|
||||
pub(crate) struct AllowInternalUnstable {
|
||||
#[diag(passes_macro_only_attribute)]
|
||||
pub(crate) struct MacroOnlyAttribute {
|
||||
#[primary_span]
|
||||
pub attr_span: Span,
|
||||
#[label]
|
||||
|
|
|
|||
|
|
@ -145,12 +145,6 @@ LL - #[macro_export = 18]
|
|||
LL + #[macro_export]
|
||||
|
|
||||
|
||||
error: malformed `allow_internal_unsafe` attribute input
|
||||
--> $DIR/malformed-attrs.rs:213:1
|
||||
|
|
||||
LL | #[allow_internal_unsafe = 1]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: must be of the form: `#[allow_internal_unsafe]`
|
||||
|
||||
error: the `#[proc_macro]` attribute is only usable with crates of the `proc-macro` crate type
|
||||
--> $DIR/malformed-attrs.rs:96:1
|
||||
|
|
||||
|
|
@ -561,6 +555,15 @@ error: valid forms for the attribute are `#[macro_use(name1, name2, ...)]` and `
|
|||
LL | #[macro_use = 1]
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0565]: malformed `allow_internal_unsafe` attribute input
|
||||
--> $DIR/malformed-attrs.rs:213:1
|
||||
|
|
||||
LL | #[allow_internal_unsafe = 1]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^---^
|
||||
| | |
|
||||
| | didn't expect any arguments here
|
||||
| help: must be of the form: `#[allow_internal_unsafe]`
|
||||
|
||||
error[E0565]: malformed `type_const` attribute input
|
||||
--> $DIR/malformed-attrs.rs:140:5
|
||||
|
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue