Skip to content

Commit 586788d

Browse files
committed
Add #[rustc_panics_when_n_is_zero] attribute
1 parent d1ee5e5 commit 586788d

7 files changed

Lines changed: 28 additions & 0 deletions

File tree

compiler/rustc_attr_parsing/src/attributes/rustc_internal.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,23 @@ impl<S: Stage> NoArgsAttributeParser<S> for RustcNeverReturnsNullPtrParser {
8585
]);
8686
const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcNeverReturnsNullPtr;
8787
}
88+
89+
pub(crate) struct RustcPanicsWhenNIsZeroParser;
90+
91+
impl<S: Stage> NoArgsAttributeParser<S> for RustcPanicsWhenNIsZeroParser {
92+
const PATH: &[Symbol] = &[sym::rustc_panics_when_n_is_zero];
93+
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
94+
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
95+
Allow(Target::Fn),
96+
Allow(Target::Method(MethodKind::Inherent)),
97+
Allow(Target::Method(MethodKind::Trait { body: false })),
98+
Allow(Target::Method(MethodKind::Trait { body: true })),
99+
Allow(Target::Method(MethodKind::TraitImpl)),
100+
]);
101+
102+
const CREATE: fn(Span) -> AttributeKind = |_| AttributeKind::RustcPanicsWhenNIsZero;
103+
}
104+
88105
pub(crate) struct RustcNoImplicitAutorefsParser;
89106

90107
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
@@ -311,6 +311,7 @@ attribute_parsers!(
311311
Single<WithoutArgs<RustcNonnullOptimizationGuaranteedParser>>,
312312
Single<WithoutArgs<RustcNounwindParser>>,
313313
Single<WithoutArgs<RustcOffloadKernelParser>>,
314+
Single<WithoutArgs<RustcPanicsWhenNIsZeroParser>>,
314315
Single<WithoutArgs<RustcParenSugarParser>>,
315316
Single<WithoutArgs<RustcPassByValueParser>>,
316317
Single<WithoutArgs<RustcPassIndirectlyInNonRusticAbisParser>>,

compiler/rustc_feature/src/builtin_attrs.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,6 +1274,10 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
12741274
EncodeCrossCrate::Yes,
12751275
"`#[rustc_never_returns_null_ptr]` is used to mark functions returning non-null pointers"
12761276
),
1277+
rustc_attr!(
1278+
rustc_panics_when_n_is_zero, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::Yes,
1279+
"`#[rustc_panics_when_n_is_zero]` is used to mark functions with a const generic argument who makes the function panics when it is zero"
1280+
),
12771281
rustc_attr!(
12781282
rustc_no_implicit_autorefs, AttributeType::Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::Yes,
12791283
"`#[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"

compiler/rustc_hir/src/attrs/data_structures.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,6 +1508,9 @@ pub enum AttributeKind {
15081508
/// Represents `#[rustc_offload_kernel]`
15091509
RustcOffloadKernel,
15101510

1511+
/// Represents `#[rustc_panics_when_n_is_zero]` (used for linting).
1512+
RustcPanicsWhenNIsZero,
1513+
15111514
/// Represents `#[rustc_paren_sugar]`.
15121515
RustcParenSugar(Span),
15131516

compiler/rustc_hir/src/attrs/encode_cross_crate.rs

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

compiler/rustc_passes/src/check_attr.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
358358
| AttributeKind::RustcObjcClass { .. }
359359
| AttributeKind::RustcObjcSelector { .. }
360360
| AttributeKind::RustcOffloadKernel
361+
| AttributeKind::RustcPanicsWhenNIsZero
361362
| AttributeKind::RustcParenSugar(..)
362363
| AttributeKind::RustcPassByValue (..)
363364
| AttributeKind::RustcPassIndirectlyInNonRusticAbis(..)

compiler/rustc_span/src/symbol.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1756,6 +1756,7 @@ symbols! {
17561756
rustc_objc_selector,
17571757
rustc_offload_kernel,
17581758
rustc_on_unimplemented,
1759+
rustc_panics_when_n_is_zero,
17591760
rustc_paren_sugar,
17601761
rustc_partition_codegened,
17611762
rustc_partition_reused,

0 commit comments

Comments
 (0)