From 1143cb2bb2c10609fe0a562b8aba817e843db74c Mon Sep 17 00:00:00 2001 From: Oscar Bray Date: Sun, 18 Jan 2026 21:08:17 +0000 Subject: [PATCH] Port two panic attrs to the attr parser. Ports #![panic_runtime] and #![needs_panic_runtime] --- .../src/attributes/crate_level.rs | 18 ++++++++++++++++++ compiler/rustc_attr_parsing/src/context.rs | 8 +++++--- .../rustc_hir/src/attrs/data_structures.rs | 6 ++++++ .../rustc_hir/src/attrs/encode_cross_crate.rs | 2 ++ compiler/rustc_metadata/src/rmeta/encoder.rs | 4 ++-- compiler/rustc_middle/src/ty/context.rs | 10 +++------- compiler/rustc_passes/src/check_attr.rs | 4 ++-- 7 files changed, 38 insertions(+), 14 deletions(-) diff --git a/compiler/rustc_attr_parsing/src/attributes/crate_level.rs b/compiler/rustc_attr_parsing/src/attributes/crate_level.rs index ab99186777f9..95c3e6bdd708 100644 --- a/compiler/rustc_attr_parsing/src/attributes/crate_level.rs +++ b/compiler/rustc_attr_parsing/src/attributes/crate_level.rs @@ -184,3 +184,21 @@ impl SingleAttributeParser for WindowsSubsystemParser { Some(AttributeKind::WindowsSubsystem(kind, cx.attr_span)) } } + +pub(crate) struct PanicRuntimeParser; + +impl NoArgsAttributeParser for PanicRuntimeParser { + const PATH: &[Symbol] = &[sym::panic_runtime]; + const ON_DUPLICATE: OnDuplicate = OnDuplicate::Warn; + const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Crate)]); + const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::PanicRuntime; +} + +pub(crate) struct NeedsPanicRuntimeParser; + +impl NoArgsAttributeParser for NeedsPanicRuntimeParser { + const PATH: &[Symbol] = &[sym::needs_panic_runtime]; + const ON_DUPLICATE: OnDuplicate = OnDuplicate::Warn; + const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Crate)]); + const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::NeedsPanicRuntime; +} diff --git a/compiler/rustc_attr_parsing/src/context.rs b/compiler/rustc_attr_parsing/src/context.rs index f1eb03915144..0bb0f5c5e22b 100644 --- a/compiler/rustc_attr_parsing/src/context.rs +++ b/compiler/rustc_attr_parsing/src/context.rs @@ -28,9 +28,9 @@ use crate::attributes::codegen_attrs::{ }; use crate::attributes::confusables::ConfusablesParser; use crate::attributes::crate_level::{ - CrateNameParser, MoveSizeLimitParser, NoCoreParser, NoMainParser, NoStdParser, - PatternComplexityLimitParser, RecursionLimitParser, RustcCoherenceIsCoreParser, - TypeLengthLimitParser, WindowsSubsystemParser, + CrateNameParser, MoveSizeLimitParser, NeedsPanicRuntimeParser, NoCoreParser, NoMainParser, + NoStdParser, PanicRuntimeParser, PatternComplexityLimitParser, RecursionLimitParser, + RustcCoherenceIsCoreParser, TypeLengthLimitParser, WindowsSubsystemParser, }; use crate::attributes::debugger::DebuggerViualizerParser; use crate::attributes::deprecation::DeprecationParser; @@ -268,6 +268,7 @@ attribute_parsers!( Single>, Single>, Single>, + Single>, Single>, Single>, Single>, @@ -275,6 +276,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 7fab94ce2afe..9eec151521b4 100644 --- a/compiler/rustc_hir/src/attrs/data_structures.rs +++ b/compiler/rustc_hir/src/attrs/data_structures.rs @@ -846,6 +846,9 @@ pub enum AttributeKind { /// Represents `#[needs_allocator]` NeedsAllocator, + /// Represents `#[needs_panic_runtime]` + NeedsPanicRuntime, + /// Represents `#[no_core]` NoCore(Span), @@ -876,6 +879,9 @@ pub enum AttributeKind { /// Represents `#[optimize(size|speed)]` Optimize(OptimizeAttr, Span), + /// Represents `#[panic_runtime]` + PanicRuntime, + /// Represents `#[rustc_paren_sugar]`. ParenSugar(Span), diff --git a/compiler/rustc_hir/src/attrs/encode_cross_crate.rs b/compiler/rustc_hir/src/attrs/encode_cross_crate.rs index d5487315630c..36556c6e8262 100644 --- a/compiler/rustc_hir/src/attrs/encode_cross_crate.rs +++ b/compiler/rustc_hir/src/attrs/encode_cross_crate.rs @@ -77,6 +77,7 @@ impl AttributeKind { MustUse { .. } => Yes, Naked(..) => No, NeedsAllocator => No, + NeedsPanicRuntime => No, NoCore(..) => No, NoImplicitPrelude(..) => No, NoLink => No, @@ -87,6 +88,7 @@ impl AttributeKind { ObjcClass { .. } => No, ObjcSelector { .. } => No, Optimize(..) => No, + PanicRuntime => No, ParenSugar(..) => No, PassByValue(..) => Yes, PatchableFunctionEntry { .. } => Yes, diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index 73c1f02e94ec..c82e37e83a3c 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -743,9 +743,9 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { debugger_visualizers, compiler_builtins: find_attr!(attrs, AttributeKind::CompilerBuiltins), needs_allocator: find_attr!(attrs, AttributeKind::NeedsAllocator), - needs_panic_runtime: ast::attr::contains_name(attrs, sym::needs_panic_runtime), + needs_panic_runtime: find_attr!(attrs, AttributeKind::NeedsPanicRuntime), no_builtins: ast::attr::contains_name(attrs, sym::no_builtins), - panic_runtime: ast::attr::contains_name(attrs, sym::panic_runtime), + panic_runtime: find_attr!(attrs, AttributeKind::PanicRuntime), profiler_runtime: ast::attr::contains_name(attrs, sym::profiler_runtime), symbol_mangling_version: tcx.sess.opts.get_symbol_mangling_version(), diff --git a/compiler/rustc_middle/src/ty/context.rs b/compiler/rustc_middle/src/ty/context.rs index 272881d1cbbe..6e68cb661e06 100644 --- a/compiler/rustc_middle/src/ty/context.rs +++ b/compiler/rustc_middle/src/ty/context.rs @@ -38,7 +38,7 @@ use rustc_hir::definitions::{DefPathData, Definitions, DisambiguatorState}; use rustc_hir::intravisit::VisitorExt; use rustc_hir::lang_items::LangItem; use rustc_hir::limit::Limit; -use rustc_hir::{self as hir, Attribute, HirId, Node, TraitCandidate, find_attr}; +use rustc_hir::{self as hir, HirId, Node, TraitCandidate, find_attr}; use rustc_index::IndexVec; use rustc_query_system::cache::WithDepNode; use rustc_query_system::dep_graph::DepNodeIndex; @@ -49,7 +49,7 @@ use rustc_session::config::CrateType; use rustc_session::cstore::{CrateStoreDyn, Untracked}; use rustc_session::lint::Lint; use rustc_span::def_id::{CRATE_DEF_ID, DefPathHash, StableCrateId}; -use rustc_span::{DUMMY_SP, Ident, Span, Symbol, kw, sym}; +use rustc_span::{DUMMY_SP, Ident, Span, Symbol, kw}; use rustc_type_ir::TyKind::*; use rustc_type_ir::lang_items::{SolverAdtLangItem, SolverLangItem, SolverTraitLangItem}; pub use rustc_type_ir::lift::Lift; @@ -3560,7 +3560,7 @@ impl<'tcx> TyCtxt<'tcx> { pub fn provide(providers: &mut Providers) { providers.is_panic_runtime = - |tcx, LocalCrate| contains_name(tcx.hir_krate_attrs(), sym::panic_runtime); + |tcx, LocalCrate| find_attr!(tcx.hir_krate_attrs(), AttributeKind::PanicRuntime); providers.is_compiler_builtins = |tcx, LocalCrate| find_attr!(tcx.hir_krate_attrs(), AttributeKind::CompilerBuiltins); providers.has_panic_handler = |tcx, LocalCrate| { @@ -3569,7 +3569,3 @@ pub fn provide(providers: &mut Providers) { }; providers.source_span = |tcx, def_id| tcx.untracked.source_span.get(def_id).unwrap_or(DUMMY_SP); } - -pub fn contains_name(attrs: &[Attribute], name: Symbol) -> bool { - attrs.iter().any(|x| x.has_name(name)) -} diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs index 659da307ab69..71c4c2b39bce 100644 --- a/compiler/rustc_passes/src/check_attr.rs +++ b/compiler/rustc_passes/src/check_attr.rs @@ -300,6 +300,8 @@ impl<'tcx> CheckAttrVisitor<'tcx> { | AttributeKind::NoStd { .. } | AttributeKind::NoMain | AttributeKind::CompilerBuiltins + | AttributeKind::PanicRuntime + | AttributeKind::NeedsPanicRuntime | AttributeKind::ObjcClass { .. } | AttributeKind::ObjcSelector { .. } | AttributeKind::RustcCoherenceIsCore(..) @@ -401,8 +403,6 @@ impl<'tcx> CheckAttrVisitor<'tcx> { | sym::no_builtins | sym::crate_type | sym::profiler_runtime - | sym::needs_panic_runtime - | sym::panic_runtime | sym::rustc_preserve_ub_checks, .. ] => {}