Skip to content

Commit 4649f9b

Browse files
committed
Add #[rustc_panics_when_zero] attribute
1 parent 8317fef commit 4649f9b

7 files changed

Lines changed: 26 additions & 0 deletions

File tree

compiler/rustc_attr_parsing/src/attributes/rustc_internal.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use rustc_hir::attrs::{
77
DivergingFallbackBehavior, RustcCleanAttribute, RustcCleanQueries, RustcLayoutType,
88
RustcMirKind,
99
};
10+
use rustc_hir::target::GenericParamKind;
1011
use rustc_session::errors;
1112
use rustc_span::Symbol;
1213

@@ -85,6 +86,20 @@ impl<S: Stage> NoArgsAttributeParser<S> for RustcNeverReturnsNullPtrParser {
8586
]);
8687
const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcNeverReturnsNullPtr;
8788
}
89+
90+
pub(crate) struct RustcPanicsWhenZeroParser;
91+
92+
impl<S: Stage> NoArgsAttributeParser<S> for RustcPanicsWhenZeroParser {
93+
const PATH: &[Symbol] = &[sym::rustc_panics_when_zero];
94+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
95+
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
96+
Allow(Target::GenericParam { kind: GenericParamKind::Const, has_default: true }),
97+
Allow(Target::GenericParam { kind: GenericParamKind::Const, has_default: false }),
98+
]);
99+
100+
const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcPanicsWhenZero;
101+
}
102+
88103
pub(crate) struct RustcNoImplicitAutorefsParser;
89104

90105
impl<S: Stage> NoArgsAttributeParser<S> for RustcNoImplicitAutorefsParser {

compiler/rustc_attr_parsing/src/context.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ attribute_parsers!(
315315
Single<WithoutArgs<RustcNonnullOptimizationGuaranteedParser>>,
316316
Single<WithoutArgs<RustcNounwindParser>>,
317317
Single<WithoutArgs<RustcOffloadKernelParser>>,
318+
Single<WithoutArgs<RustcPanicsWhenZeroParser>>,
318319
Single<WithoutArgs<RustcParenSugarParser>>,
319320
Single<WithoutArgs<RustcPassByValueParser>>,
320321
Single<WithoutArgs<RustcPassIndirectlyInNonRusticAbisParser>>,

compiler/rustc_feature/src/builtin_attrs.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,6 +1278,10 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
12781278
rustc_no_implicit_autorefs, AttributeType::Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::Yes,
12791279
"`#[rustc_no_implicit_autorefs]` is used to mark functions for which an autoref to the dereference of a raw pointer should not be used as an argument"
12801280
),
1281+
rustc_attr!(
1282+
rustc_panics_when_zero, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::Yes,
1283+
"`#[rustc_panics_when_zero]` is used to mark a const generic argument who makes the function panics when it is zero"
1284+
),
12811285
rustc_attr!(
12821286
rustc_coherence_is_core, AttributeType::CrateLevel, template!(Word), ErrorFollowing, EncodeCrossCrate::No,
12831287
"`#![rustc_coherence_is_core]` allows inherent methods on builtin types, only intended to be used in `core`"

compiler/rustc_hir/src/attrs/data_structures.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1513,6 +1513,9 @@ pub enum AttributeKind {
15131513
/// Represents `#[rustc_offload_kernel]`
15141514
RustcOffloadKernel,
15151515

1516+
/// Represents `#[rustc_panics_when_n_is_zero]` (used for linting).
1517+
RustcPanicsWhenZero,
1518+
15161519
/// Represents `#[rustc_paren_sugar]`.
15171520
RustcParenSugar(Span),
15181521

compiler/rustc_hir/src/attrs/encode_cross_crate.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ impl AttributeKind {
167167
RustcObjcClass { .. } => No,
168168
RustcObjcSelector { .. } => No,
169169
RustcOffloadKernel => Yes,
170+
RustcPanicsWhenZero => Yes,
170171
RustcParenSugar(..) => No,
171172
RustcPassByValue(..) => Yes,
172173
RustcPassIndirectlyInNonRusticAbis(..) => No,

compiler/rustc_passes/src/check_attr.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
350350
| AttributeKind::RustcObjcClass { .. }
351351
| AttributeKind::RustcObjcSelector { .. }
352352
| AttributeKind::RustcOffloadKernel
353+
| AttributeKind::RustcPanicsWhenZero
353354
| AttributeKind::RustcParenSugar(..)
354355
| AttributeKind::RustcPassByValue (..)
355356
| AttributeKind::RustcPassIndirectlyInNonRusticAbis(..)

compiler/rustc_span/src/symbol.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1765,6 +1765,7 @@ symbols! {
17651765
rustc_objc_selector,
17661766
rustc_offload_kernel,
17671767
rustc_on_unimplemented,
1768+
rustc_panics_when_zero,
17681769
rustc_paren_sugar,
17691770
rustc_partition_codegened,
17701771
rustc_partition_reused,

0 commit comments

Comments
 (0)