diff --git a/compiler/rustc_attr_parsing/src/attributes/macro_attrs.rs b/compiler/rustc_attr_parsing/src/attributes/macro_attrs.rs index d37915b1b80b2..00d40687fc85e 100644 --- a/compiler/rustc_attr_parsing/src/attributes/macro_attrs.rs +++ b/compiler/rustc_attr_parsing/src/attributes/macro_attrs.rs @@ -206,3 +206,12 @@ impl SingleAttributeParser for CollapseDebugInfoParser { Some(AttributeKind::CollapseDebugInfo(info)) } } + +pub(crate) struct RustcProcMacroDeclsParser; + +impl NoArgsAttributeParser for RustcProcMacroDeclsParser { + const PATH: &[Symbol] = &[sym::rustc_proc_macro_decls]; + const ON_DUPLICATE: OnDuplicate = OnDuplicate::Warn; + const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Static)]); + const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcProcMacroDecls; +} diff --git a/compiler/rustc_attr_parsing/src/context.rs b/compiler/rustc_attr_parsing/src/context.rs index c6f0914bfbdaf..f68b27dd58a6b 100644 --- a/compiler/rustc_attr_parsing/src/context.rs +++ b/compiler/rustc_attr_parsing/src/context.rs @@ -297,6 +297,7 @@ attribute_parsers!( Single>, Single>, Single>, + Single>, Single>, Single>, Single>, diff --git a/compiler/rustc_hir/src/attrs/data_structures.rs b/compiler/rustc_hir/src/attrs/data_structures.rs index e28ecd06b89bc..877f2b0afe495 100644 --- a/compiler/rustc_hir/src/attrs/data_structures.rs +++ b/compiler/rustc_hir/src/attrs/data_structures.rs @@ -1288,6 +1288,9 @@ pub enum AttributeKind { /// Represents `#[rustc_preserve_ub_checks]` RustcPreserveUbChecks, + /// Represents `#[rustc_proc_macro_decls]` + RustcProcMacroDecls, + /// Represents `#[rustc_pub_transparent]` (used by the `repr_transparent_external_private_fields` lint). RustcPubTransparent(Span), diff --git a/compiler/rustc_hir/src/attrs/encode_cross_crate.rs b/compiler/rustc_hir/src/attrs/encode_cross_crate.rs index b4cf244bfb8aa..0d8e70a9f39b5 100644 --- a/compiler/rustc_hir/src/attrs/encode_cross_crate.rs +++ b/compiler/rustc_hir/src/attrs/encode_cross_crate.rs @@ -156,6 +156,7 @@ impl AttributeKind { RustcPassByValue(..) => Yes, RustcPassIndirectlyInNonRusticAbis(..) => No, RustcPreserveUbChecks => No, + RustcProcMacroDecls => No, RustcPubTransparent(..) => Yes, RustcReallocator => No, RustcRegions => No, diff --git a/compiler/rustc_interface/src/proc_macro_decls.rs b/compiler/rustc_interface/src/proc_macro_decls.rs index a2c1f1dbeda6b..bd08faa1ed3a4 100644 --- a/compiler/rustc_interface/src/proc_macro_decls.rs +++ b/compiler/rustc_interface/src/proc_macro_decls.rs @@ -1,15 +1,14 @@ -use rustc_ast::attr; +use rustc_hir::attrs::AttributeKind; use rustc_hir::def_id::LocalDefId; +use rustc_hir::find_attr; use rustc_middle::query::Providers; use rustc_middle::ty::TyCtxt; -use rustc_span::sym; fn proc_macro_decls_static(tcx: TyCtxt<'_>, (): ()) -> Option { let mut decls = None; for id in tcx.hir_free_items() { - let attrs = tcx.hir_attrs(id.hir_id()); - if attr::contains_name(attrs, sym::rustc_proc_macro_decls) { + if find_attr!(tcx.hir_attrs(id.hir_id()), AttributeKind::RustcProcMacroDecls) { decls = Some(id.owner_id.def_id); } } diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs index 08f2597e874d8..9dcf1ae74d002 100644 --- a/compiler/rustc_passes/src/check_attr.rs +++ b/compiler/rustc_passes/src/check_attr.rs @@ -348,6 +348,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> { | AttributeKind::RustcPassByValue (..) | AttributeKind::RustcPassIndirectlyInNonRusticAbis(..) | AttributeKind::RustcPreserveUbChecks + | AttributeKind::RustcProcMacroDecls | AttributeKind::RustcReallocator | AttributeKind::RustcRegions | AttributeKind::RustcReservationImpl(..) @@ -406,7 +407,6 @@ impl<'tcx> CheckAttrVisitor<'tcx> { | sym::rustc_doc_primitive | sym::rustc_test_marker | sym::rustc_layout - | sym::rustc_proc_macro_decls | sym::rustc_autodiff | sym::rustc_capture_analysis | sym::rustc_mir