2019-08-22 16:32:31 +00:00
|
|
|
//! Built-in attributes and `cfg` flag gating.
|
|
|
|
|
2021-09-05 23:30:37 +00:00
|
|
|
use AttributeDuplicates::*;
|
2019-08-22 16:32:31 +00:00
|
|
|
use AttributeGate::*;
|
2019-12-24 22:44:51 +00:00
|
|
|
use AttributeType::*;
|
2019-08-22 16:32:31 +00:00
|
|
|
|
2019-11-30 01:34:18 +00:00
|
|
|
use crate::{Features, Stability};
|
|
|
|
|
2019-12-24 22:44:51 +00:00
|
|
|
use rustc_data_structures::fx::FxHashMap;
|
2019-12-31 17:15:40 +00:00
|
|
|
use rustc_span::symbol::{sym, Symbol};
|
2019-08-22 16:32:31 +00:00
|
|
|
|
2022-06-16 15:39:39 +00:00
|
|
|
use std::sync::LazyLock;
|
2020-09-01 20:42:21 +00:00
|
|
|
|
2019-08-22 16:37:28 +00:00
|
|
|
type GateFn = fn(&Features) -> bool;
|
|
|
|
|
2019-08-22 16:32:31 +00:00
|
|
|
macro_rules! cfg_fn {
|
2019-08-22 16:37:28 +00:00
|
|
|
($field: ident) => {
|
2019-12-24 22:44:51 +00:00
|
|
|
(|features| features.$field) as GateFn
|
|
|
|
};
|
2019-08-22 16:32:31 +00:00
|
|
|
}
|
|
|
|
|
2019-11-30 00:57:53 +00:00
|
|
|
pub type GatedCfg = (Symbol, Symbol, GateFn);
|
|
|
|
|
2019-08-22 16:37:28 +00:00
|
|
|
/// `cfg(...)`'s that are feature gated.
|
2019-11-30 00:57:53 +00:00
|
|
|
const GATED_CFGS: &[GatedCfg] = &[
|
2019-08-22 16:32:31 +00:00
|
|
|
// (name in cfg, feature, function to check if the feature is enabled)
|
2023-05-02 13:53:11 +00:00
|
|
|
(sym::overflow_checks, sym::cfg_overflow_checks, cfg_fn!(cfg_overflow_checks)),
|
2024-04-03 12:54:03 +00:00
|
|
|
(sym::ub_checks, sym::cfg_ub_checks, cfg_fn!(cfg_ub_checks)),
|
2019-08-22 16:32:31 +00:00
|
|
|
(sym::target_thread_local, sym::cfg_target_thread_local, cfg_fn!(cfg_target_thread_local)),
|
2020-09-20 10:09:22 +00:00
|
|
|
(
|
|
|
|
sym::target_has_atomic_equal_alignment,
|
2022-02-09 18:14:35 +00:00
|
|
|
sym::cfg_target_has_atomic_equal_alignment,
|
|
|
|
cfg_fn!(cfg_target_has_atomic_equal_alignment),
|
2020-09-20 10:09:22 +00:00
|
|
|
),
|
2022-02-16 02:40:07 +00:00
|
|
|
(sym::target_has_atomic_load_store, sym::cfg_target_has_atomic, cfg_fn!(cfg_target_has_atomic)),
|
2019-10-22 00:00:00 +00:00
|
|
|
(sym::sanitize, sym::cfg_sanitize, cfg_fn!(cfg_sanitize)),
|
2020-04-19 08:47:55 +00:00
|
|
|
(sym::version, sym::cfg_version, cfg_fn!(cfg_version)),
|
2023-07-22 15:16:18 +00:00
|
|
|
(sym::relocation_model, sym::cfg_relocation_model, cfg_fn!(cfg_relocation_model)),
|
2023-12-22 23:37:35 +00:00
|
|
|
(sym::sanitizer_cfi_generalize_pointers, sym::cfg_sanitizer_cfi, cfg_fn!(cfg_sanitizer_cfi)),
|
|
|
|
(sym::sanitizer_cfi_normalize_integers, sym::cfg_sanitizer_cfi, cfg_fn!(cfg_sanitizer_cfi)),
|
2019-08-22 16:32:31 +00:00
|
|
|
];
|
|
|
|
|
2019-11-30 00:57:53 +00:00
|
|
|
/// Find a gated cfg determined by the `pred`icate which is given the cfg's name.
|
|
|
|
pub fn find_gated_cfg(pred: impl Fn(Symbol) -> bool) -> Option<&'static GatedCfg> {
|
|
|
|
GATED_CFGS.iter().find(|(cfg_sym, ..)| pred(*cfg_sym))
|
2019-08-22 16:32:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// If you change this, please modify `src/doc/unstable-book` as well. You must
|
|
|
|
// move that documentation into the relevant place in the other docs, and
|
|
|
|
// remove the chapter on the flag.
|
|
|
|
|
|
|
|
#[derive(Copy, Clone, PartialEq, Debug)]
|
|
|
|
pub enum AttributeType {
|
|
|
|
/// Normal, builtin attribute that is consumed
|
|
|
|
/// by the compiler before the unused_attribute check
|
|
|
|
Normal,
|
|
|
|
|
|
|
|
/// Builtin attribute that is only allowed at the crate level
|
|
|
|
CrateLevel,
|
|
|
|
}
|
|
|
|
|
2024-04-21 04:54:50 +00:00
|
|
|
#[derive(Copy, Clone, PartialEq, Debug)]
|
|
|
|
pub enum AttributeSafety {
|
|
|
|
/// Normal attribute that does not need `#[unsafe(...)]`
|
|
|
|
Normal,
|
|
|
|
|
|
|
|
/// Unsafe attribute that requires safety obligations
|
|
|
|
/// to be discharged
|
|
|
|
Unsafe,
|
|
|
|
}
|
|
|
|
|
2019-09-14 18:29:59 +00:00
|
|
|
#[derive(Clone, Copy)]
|
2019-08-22 16:32:31 +00:00
|
|
|
pub enum AttributeGate {
|
|
|
|
/// Is gated by a given feature gate, reason
|
|
|
|
/// and function to check if enabled
|
|
|
|
Gated(Stability, Symbol, &'static str, fn(&Features) -> bool),
|
|
|
|
|
|
|
|
/// Ungated attribute, can be used on all release channels
|
|
|
|
Ungated,
|
|
|
|
}
|
|
|
|
|
|
|
|
// fn() is not Debug
|
|
|
|
impl std::fmt::Debug for AttributeGate {
|
|
|
|
fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
|
|
match *self {
|
2019-12-24 22:44:51 +00:00
|
|
|
Self::Gated(ref stab, name, expl, _) => {
|
2022-12-19 09:31:55 +00:00
|
|
|
write!(fmt, "Gated({stab:?}, {name}, {expl})")
|
2019-12-24 22:44:51 +00:00
|
|
|
}
|
|
|
|
Self::Ungated => write!(fmt, "Ungated"),
|
2019-08-22 16:32:31 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl AttributeGate {
|
|
|
|
fn is_deprecated(&self) -> bool {
|
2020-10-27 01:02:48 +00:00
|
|
|
matches!(*self, Self::Gated(Stability::Deprecated(_, _), ..))
|
2019-08-22 16:32:31 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-11-29 23:56:46 +00:00
|
|
|
/// A template that the attribute input must match.
|
|
|
|
/// Only top-level shape (`#[attr]` vs `#[attr(...)]` vs `#[attr = ...]`) is considered now.
|
2019-12-30 18:38:43 +00:00
|
|
|
#[derive(Clone, Copy, Default)]
|
2019-11-29 23:56:46 +00:00
|
|
|
pub struct AttributeTemplate {
|
2021-09-05 23:30:37 +00:00
|
|
|
/// If `true`, the attribute is allowed to be a bare word like `#[test]`.
|
2019-11-29 23:56:46 +00:00
|
|
|
pub word: bool,
|
2021-09-05 23:30:37 +00:00
|
|
|
/// If `Some`, the attribute is allowed to take a list of items like `#[allow(..)]`.
|
2019-11-29 23:56:46 +00:00
|
|
|
pub list: Option<&'static str>,
|
2021-09-05 23:30:37 +00:00
|
|
|
/// If `Some`, the attribute is allowed to be a name/value pair where the
|
|
|
|
/// value is a string, like `#[must_use = "reason"]`.
|
2019-11-29 23:56:46 +00:00
|
|
|
pub name_value_str: Option<&'static str>,
|
|
|
|
}
|
|
|
|
|
2021-09-05 23:30:37 +00:00
|
|
|
/// How to handle multiple duplicate attributes on the same item.
|
|
|
|
#[derive(Clone, Copy, Default)]
|
|
|
|
pub enum AttributeDuplicates {
|
|
|
|
/// Duplicates of this attribute are allowed.
|
|
|
|
///
|
|
|
|
/// This should only be used with attributes where duplicates have semantic
|
|
|
|
/// meaning, or some kind of "additive" behavior. For example, `#[warn(..)]`
|
|
|
|
/// can be specified multiple times, and it combines all the entries. Or use
|
|
|
|
/// this if there is validation done elsewhere.
|
|
|
|
#[default]
|
|
|
|
DuplicatesOk,
|
|
|
|
/// Duplicates after the first attribute will be an unused_attribute warning.
|
|
|
|
///
|
|
|
|
/// This is usually used for "word" attributes, where they are used as a
|
|
|
|
/// boolean marker, like `#[used]`. It is not necessarily wrong that there
|
|
|
|
/// are duplicates, but the others should probably be removed.
|
|
|
|
WarnFollowing,
|
|
|
|
/// Same as `WarnFollowing`, but only issues warnings for word-style attributes.
|
|
|
|
///
|
|
|
|
/// This is only for special cases, for example multiple `#[macro_use]` can
|
|
|
|
/// be warned, but multiple `#[macro_use(...)]` should not because the list
|
|
|
|
/// form has different meaning from the word form.
|
|
|
|
WarnFollowingWordOnly,
|
|
|
|
/// Duplicates after the first attribute will be an error.
|
|
|
|
///
|
|
|
|
/// This should be used where duplicates would be ignored, but carry extra
|
|
|
|
/// meaning that could cause confusion. For example, `#[stable(since="1.0")]
|
|
|
|
/// #[stable(since="2.0")]`, which version should be used for `stable`?
|
|
|
|
ErrorFollowing,
|
|
|
|
/// Duplicates preceding the last instance of the attribute will be an error.
|
|
|
|
///
|
|
|
|
/// This is the same as `ErrorFollowing`, except the last attribute is the
|
|
|
|
/// one that is "used". This is typically used in cases like codegen
|
|
|
|
/// attributes which usually only honor the last attribute.
|
|
|
|
ErrorPreceding,
|
|
|
|
/// Duplicates after the first attribute will be an unused_attribute warning
|
|
|
|
/// with a note that this will be an error in the future.
|
|
|
|
///
|
|
|
|
/// This should be used for attributes that should be `ErrorFollowing`, but
|
|
|
|
/// because older versions of rustc silently accepted (and ignored) the
|
|
|
|
/// attributes, this is used to transition.
|
|
|
|
FutureWarnFollowing,
|
|
|
|
/// Duplicates preceding the last instance of the attribute will be a
|
|
|
|
/// warning, with a note that this will be an error in the future.
|
|
|
|
///
|
|
|
|
/// This is the same as `FutureWarnFollowing`, except the last attribute is
|
|
|
|
/// the one that is "used". Ideally these can eventually migrate to
|
|
|
|
/// `ErrorPreceding`.
|
|
|
|
FutureWarnPreceding,
|
|
|
|
}
|
|
|
|
|
2019-08-22 16:32:31 +00:00
|
|
|
/// A convenience macro for constructing attribute templates.
|
|
|
|
/// E.g., `template!(Word, List: "description")` means that the attribute
|
|
|
|
/// supports forms `#[attr]` and `#[attr(description)]`.
|
|
|
|
macro_rules! template {
|
|
|
|
(Word) => { template!(@ true, None, None) };
|
|
|
|
(List: $descr: expr) => { template!(@ false, Some($descr), None) };
|
|
|
|
(NameValueStr: $descr: expr) => { template!(@ false, None, Some($descr)) };
|
|
|
|
(Word, List: $descr: expr) => { template!(@ true, Some($descr), None) };
|
|
|
|
(Word, NameValueStr: $descr: expr) => { template!(@ true, None, Some($descr)) };
|
|
|
|
(List: $descr1: expr, NameValueStr: $descr2: expr) => {
|
|
|
|
template!(@ false, Some($descr1), Some($descr2))
|
|
|
|
};
|
|
|
|
(Word, List: $descr1: expr, NameValueStr: $descr2: expr) => {
|
|
|
|
template!(@ true, Some($descr1), Some($descr2))
|
|
|
|
};
|
|
|
|
(@ $word: expr, $list: expr, $name_value_str: expr) => { AttributeTemplate {
|
|
|
|
word: $word, list: $list, name_value_str: $name_value_str
|
|
|
|
} };
|
|
|
|
}
|
|
|
|
|
2019-08-22 18:40:50 +00:00
|
|
|
macro_rules! ungated {
|
2024-04-25 16:12:02 +00:00
|
|
|
(unsafe $attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr $(,)?) => {
|
2021-09-05 23:30:37 +00:00
|
|
|
BuiltinAttribute {
|
|
|
|
name: sym::$attr,
|
2024-03-18 16:05:18 +00:00
|
|
|
encode_cross_crate: $encode_cross_crate,
|
2021-09-05 23:30:37 +00:00
|
|
|
type_: $typ,
|
2024-04-25 16:12:02 +00:00
|
|
|
safety: AttributeSafety::Unsafe,
|
2024-04-21 04:54:50 +00:00
|
|
|
template: $tpl,
|
|
|
|
gate: Ungated,
|
|
|
|
duplicates: $duplicates,
|
|
|
|
}
|
|
|
|
};
|
2024-04-25 16:12:02 +00:00
|
|
|
($attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr $(,)?) => {
|
2024-04-21 04:54:50 +00:00
|
|
|
BuiltinAttribute {
|
|
|
|
name: sym::$attr,
|
|
|
|
encode_cross_crate: $encode_cross_crate,
|
|
|
|
type_: $typ,
|
2024-04-25 16:12:02 +00:00
|
|
|
safety: AttributeSafety::Normal,
|
2021-09-05 23:30:37 +00:00
|
|
|
template: $tpl,
|
|
|
|
gate: Ungated,
|
|
|
|
duplicates: $duplicates,
|
|
|
|
}
|
2019-08-22 18:40:50 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
macro_rules! gated {
|
2024-04-25 16:12:02 +00:00
|
|
|
(unsafe $attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $gate:ident, $msg:expr $(,)?) => {
|
2021-11-12 12:15:14 +00:00
|
|
|
BuiltinAttribute {
|
|
|
|
name: sym::$attr,
|
2024-03-18 16:05:18 +00:00
|
|
|
encode_cross_crate: $encode_cross_crate,
|
2021-11-12 12:15:14 +00:00
|
|
|
type_: $typ,
|
2024-04-25 16:12:02 +00:00
|
|
|
safety: AttributeSafety::Unsafe,
|
2021-11-12 12:15:14 +00:00
|
|
|
template: $tpl,
|
2021-09-05 23:30:37 +00:00
|
|
|
duplicates: $duplicates,
|
2021-11-12 12:15:14 +00:00
|
|
|
gate: Gated(Stability::Unstable, sym::$gate, $msg, cfg_fn!($gate)),
|
|
|
|
}
|
2019-08-22 18:40:50 +00:00
|
|
|
};
|
2024-04-25 16:12:02 +00:00
|
|
|
(unsafe $attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $msg:expr $(,)?) => {
|
2021-11-12 12:15:14 +00:00
|
|
|
BuiltinAttribute {
|
|
|
|
name: sym::$attr,
|
2024-03-18 16:05:18 +00:00
|
|
|
encode_cross_crate: $encode_cross_crate,
|
2021-11-12 12:15:14 +00:00
|
|
|
type_: $typ,
|
2024-04-25 16:12:02 +00:00
|
|
|
safety: AttributeSafety::Unsafe,
|
2024-04-21 04:54:50 +00:00
|
|
|
template: $tpl,
|
|
|
|
duplicates: $duplicates,
|
|
|
|
gate: Gated(Stability::Unstable, sym::$attr, $msg, cfg_fn!($attr)),
|
|
|
|
}
|
|
|
|
};
|
2024-04-25 16:12:02 +00:00
|
|
|
($attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $gate:ident, $msg:expr $(,)?) => {
|
2024-04-21 04:54:50 +00:00
|
|
|
BuiltinAttribute {
|
|
|
|
name: sym::$attr,
|
|
|
|
encode_cross_crate: $encode_cross_crate,
|
|
|
|
type_: $typ,
|
2024-04-25 16:12:02 +00:00
|
|
|
safety: AttributeSafety::Normal,
|
2024-04-21 04:54:50 +00:00
|
|
|
template: $tpl,
|
|
|
|
duplicates: $duplicates,
|
|
|
|
gate: Gated(Stability::Unstable, sym::$gate, $msg, cfg_fn!($gate)),
|
|
|
|
}
|
|
|
|
};
|
2024-04-25 16:12:02 +00:00
|
|
|
($attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $msg:expr $(,)?) => {
|
2024-04-21 04:54:50 +00:00
|
|
|
BuiltinAttribute {
|
|
|
|
name: sym::$attr,
|
|
|
|
encode_cross_crate: $encode_cross_crate,
|
|
|
|
type_: $typ,
|
2024-04-25 16:12:02 +00:00
|
|
|
safety: AttributeSafety::Normal,
|
2021-11-12 12:15:14 +00:00
|
|
|
template: $tpl,
|
2021-09-05 23:30:37 +00:00
|
|
|
duplicates: $duplicates,
|
2021-11-12 12:15:14 +00:00
|
|
|
gate: Gated(Stability::Unstable, sym::$attr, $msg, cfg_fn!($attr)),
|
|
|
|
}
|
2019-08-22 18:40:50 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2019-08-22 17:37:04 +00:00
|
|
|
macro_rules! rustc_attr {
|
2024-03-18 16:05:18 +00:00
|
|
|
(TEST, $attr:ident, $typ:expr, $tpl:expr, $duplicate:expr, $encode_cross_crate:expr $(,)?) => {
|
2019-08-22 17:37:04 +00:00
|
|
|
rustc_attr!(
|
2019-12-24 22:44:51 +00:00
|
|
|
$attr,
|
|
|
|
$typ,
|
|
|
|
$tpl,
|
2021-09-05 23:30:37 +00:00
|
|
|
$duplicate,
|
2024-03-18 16:05:18 +00:00
|
|
|
$encode_cross_crate,
|
2019-12-24 22:44:51 +00:00
|
|
|
concat!(
|
|
|
|
"the `#[",
|
|
|
|
stringify!($attr),
|
|
|
|
"]` attribute is just used for rustc unit tests \
|
2019-08-22 17:37:04 +00:00
|
|
|
and will never be stable",
|
|
|
|
),
|
|
|
|
)
|
|
|
|
};
|
2024-03-18 16:05:18 +00:00
|
|
|
($attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $msg:expr $(,)?) => {
|
2021-11-12 12:15:14 +00:00
|
|
|
BuiltinAttribute {
|
|
|
|
name: sym::$attr,
|
2024-03-18 16:05:18 +00:00
|
|
|
encode_cross_crate: $encode_cross_crate,
|
2021-11-12 12:15:14 +00:00
|
|
|
type_: $typ,
|
2024-04-21 04:54:50 +00:00
|
|
|
safety: AttributeSafety::Normal,
|
2021-11-12 12:15:14 +00:00
|
|
|
template: $tpl,
|
2021-09-05 23:30:37 +00:00
|
|
|
duplicates: $duplicates,
|
2021-11-12 12:15:14 +00:00
|
|
|
gate: Gated(Stability::Unstable, sym::rustc_attrs, $msg, cfg_fn!(rustc_attrs)),
|
|
|
|
}
|
2019-08-22 17:37:04 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
macro_rules! experimental {
|
|
|
|
($attr:ident) => {
|
|
|
|
concat!("the `#[", stringify!($attr), "]` attribute is an experimental feature")
|
2019-12-24 22:44:51 +00:00
|
|
|
};
|
2019-08-22 21:30:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const IMPL_DETAIL: &str = "internal implementation detail";
|
2019-10-25 05:19:07 +00:00
|
|
|
const INTERNAL_UNSTABLE: &str = "this is an internal attribute that will never be stable";
|
2019-08-22 21:30:59 +00:00
|
|
|
|
2024-03-18 16:05:18 +00:00
|
|
|
#[derive(PartialEq)]
|
|
|
|
pub enum EncodeCrossCrate {
|
|
|
|
Yes,
|
|
|
|
No,
|
|
|
|
}
|
|
|
|
|
2021-11-12 12:15:14 +00:00
|
|
|
pub struct BuiltinAttribute {
|
|
|
|
pub name: Symbol,
|
2024-03-18 16:05:18 +00:00
|
|
|
/// Whether this attribute is encode cross crate.
|
2022-04-01 13:04:47 +00:00
|
|
|
///
|
2024-03-18 16:05:18 +00:00
|
|
|
/// If so, it is encoded in the crate metadata.
|
|
|
|
/// Otherwise, it can only be used in the local crate.
|
|
|
|
pub encode_cross_crate: EncodeCrossCrate,
|
2021-11-12 12:15:14 +00:00
|
|
|
pub type_: AttributeType,
|
2024-04-21 04:54:50 +00:00
|
|
|
pub safety: AttributeSafety,
|
2021-11-12 12:15:14 +00:00
|
|
|
pub template: AttributeTemplate,
|
2021-09-05 23:30:37 +00:00
|
|
|
pub duplicates: AttributeDuplicates,
|
2021-11-12 12:15:14 +00:00
|
|
|
pub gate: AttributeGate,
|
|
|
|
}
|
2019-08-22 16:32:31 +00:00
|
|
|
|
2019-09-06 02:56:45 +00:00
|
|
|
/// Attributes that have a special meaning to rustc or rustdoc.
|
2019-12-24 22:44:51 +00:00
|
|
|
#[rustfmt::skip]
|
2019-08-22 16:32:31 +00:00
|
|
|
pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
2019-08-22 21:30:59 +00:00
|
|
|
// ==========================================================================
|
|
|
|
// Stable attributes:
|
|
|
|
// ==========================================================================
|
|
|
|
|
2020-03-06 11:13:55 +00:00
|
|
|
// Conditional compilation:
|
2024-03-18 16:05:18 +00:00
|
|
|
ungated!(cfg, Normal, template!(List: "predicate"), DuplicatesOk, EncodeCrossCrate::Yes),
|
|
|
|
ungated!(cfg_attr, Normal, template!(List: "predicate, attr1, attr2, ..."), DuplicatesOk, EncodeCrossCrate::Yes),
|
2019-08-22 16:32:31 +00:00
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
// Testing:
|
2024-02-23 09:23:01 +00:00
|
|
|
ungated!(
|
|
|
|
ignore, Normal, template!(Word, NameValueStr: "reason"), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
2024-02-23 09:23:01 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
ungated!(
|
|
|
|
should_panic, Normal,
|
2022-08-15 07:57:55 +00:00
|
|
|
template!(Word, List: r#"expected = "reason""#, NameValueStr: "reason"), FutureWarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
2019-08-22 21:30:59 +00:00
|
|
|
),
|
|
|
|
// FIXME(Centril): This can be used on stable but shouldn't.
|
2024-02-23 09:23:01 +00:00
|
|
|
ungated!(
|
|
|
|
reexport_test_harness_main, CrateLevel, template!(NameValueStr: "name"), ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
2024-02-23 09:23:01 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
|
|
|
|
// Macros:
|
2024-03-18 16:05:18 +00:00
|
|
|
ungated!(automatically_derived, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes),
|
2024-02-23 09:23:01 +00:00
|
|
|
ungated!(
|
|
|
|
macro_use, Normal, template!(Word, List: "name1, name2, ..."), WarnFollowingWordOnly,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
2024-02-23 09:23:01 +00:00
|
|
|
),
|
2024-03-18 16:05:18 +00:00
|
|
|
ungated!(macro_escape, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No), // Deprecated synonym for `macro_use`.
|
|
|
|
ungated!(
|
|
|
|
macro_export, Normal, template!(Word, List: "local_inner_macros"),
|
|
|
|
WarnFollowing, EncodeCrossCrate::Yes
|
|
|
|
),
|
|
|
|
ungated!(proc_macro, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::No),
|
2019-08-22 21:30:59 +00:00
|
|
|
ungated!(
|
2024-02-23 09:23:01 +00:00
|
|
|
proc_macro_derive, Normal, template!(List: "TraitName, /*opt*/ attributes(name1, name2, ...)"),
|
2024-03-18 16:05:18 +00:00
|
|
|
ErrorFollowing, EncodeCrossCrate::No,
|
2019-08-22 21:30:59 +00:00
|
|
|
),
|
2024-03-18 16:05:18 +00:00
|
|
|
ungated!(proc_macro_attribute, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::No),
|
2019-08-22 21:30:59 +00:00
|
|
|
|
|
|
|
// Lints:
|
2021-09-05 23:30:37 +00:00
|
|
|
ungated!(
|
2022-09-13 13:23:54 +00:00
|
|
|
warn, Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#),
|
2024-03-18 16:05:18 +00:00
|
|
|
DuplicatesOk, EncodeCrossCrate::No,
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
|
|
|
ungated!(
|
2022-09-13 13:23:54 +00:00
|
|
|
allow, Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#),
|
2024-03-18 16:05:18 +00:00
|
|
|
DuplicatesOk, EncodeCrossCrate::No,
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
2021-08-06 21:18:16 +00:00
|
|
|
gated!(
|
|
|
|
expect, Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#), DuplicatesOk,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, lint_reasons, experimental!(expect)
|
2021-08-06 21:18:16 +00:00
|
|
|
),
|
2021-09-05 23:30:37 +00:00
|
|
|
ungated!(
|
2022-09-13 13:23:54 +00:00
|
|
|
forbid, Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#),
|
2024-03-18 16:05:18 +00:00
|
|
|
DuplicatesOk, EncodeCrossCrate::No
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
|
|
|
ungated!(
|
2022-09-13 13:23:54 +00:00
|
|
|
deny, Normal, template!(List: r#"lint1, lint2, ..., /*opt*/ reason = "...""#),
|
2024-03-18 16:05:18 +00:00
|
|
|
DuplicatesOk, EncodeCrossCrate::No
|
|
|
|
),
|
|
|
|
ungated!(
|
|
|
|
must_use, Normal, template!(Word, NameValueStr: "reason"),
|
|
|
|
FutureWarnFollowing, EncodeCrossCrate::Yes
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
2021-09-05 02:36:51 +00:00
|
|
|
gated!(
|
2021-09-05 23:30:37 +00:00
|
|
|
must_not_suspend, Normal, template!(Word, NameValueStr: "reason"), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes, experimental!(must_not_suspend)
|
2021-09-05 02:36:51 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
ungated!(
|
|
|
|
deprecated, Normal,
|
|
|
|
template!(
|
|
|
|
Word,
|
|
|
|
List: r#"/*opt*/ since = "version", /*opt*/ note = "reason""#,
|
|
|
|
NameValueStr: "reason"
|
|
|
|
),
|
2024-03-18 16:05:18 +00:00
|
|
|
ErrorFollowing, EncodeCrossCrate::Yes
|
2019-08-22 21:30:59 +00:00
|
|
|
),
|
2019-08-22 18:40:50 +00:00
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
// Crate properties:
|
2024-02-23 09:23:01 +00:00
|
|
|
ungated!(
|
|
|
|
crate_name, CrateLevel, template!(NameValueStr: "name"), FutureWarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
2024-02-23 09:23:01 +00:00
|
|
|
),
|
|
|
|
ungated!(
|
|
|
|
crate_type, CrateLevel, template!(NameValueStr: "bin|lib|..."), DuplicatesOk,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
2024-02-23 09:23:01 +00:00
|
|
|
),
|
2021-09-05 23:30:37 +00:00
|
|
|
// crate_id is deprecated
|
2024-02-23 09:23:01 +00:00
|
|
|
ungated!(
|
|
|
|
crate_id, CrateLevel, template!(NameValueStr: "ignored"), FutureWarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
2024-02-23 09:23:01 +00:00
|
|
|
),
|
2019-08-22 18:40:50 +00:00
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
// ABI, linking, symbols, and FFI
|
|
|
|
ungated!(
|
2021-07-29 17:00:41 +00:00
|
|
|
link, Normal,
|
2022-07-12 20:52:35 +00:00
|
|
|
template!(List: r#"name = "...", /*opt*/ kind = "dylib|static|...", /*opt*/ wasm_import_module = "...", /*opt*/ import_name_type = "decorated|noprefix|undecorated""#),
|
2021-09-05 23:30:37 +00:00
|
|
|
DuplicatesOk,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
|
|
|
),
|
|
|
|
ungated!(
|
|
|
|
link_name, Normal, template!(NameValueStr: "name"),
|
|
|
|
FutureWarnPreceding, EncodeCrossCrate::Yes
|
2019-08-22 21:30:59 +00:00
|
|
|
),
|
2024-03-18 16:05:18 +00:00
|
|
|
ungated!(no_link, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No),
|
|
|
|
ungated!(repr, Normal, template!(List: "C"), DuplicatesOk, EncodeCrossCrate::No),
|
2024-04-21 04:54:50 +00:00
|
|
|
ungated!(unsafe export_name, Normal, template!(NameValueStr: "name"), FutureWarnPreceding, EncodeCrossCrate::No),
|
|
|
|
ungated!(unsafe link_section, Normal, template!(NameValueStr: "name"), FutureWarnPreceding, EncodeCrossCrate::No),
|
|
|
|
ungated!(unsafe no_mangle, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No),
|
2024-03-18 16:05:18 +00:00
|
|
|
ungated!(used, Normal, template!(Word, List: "compiler|linker"), WarnFollowing, EncodeCrossCrate::No),
|
|
|
|
ungated!(link_ordinal, Normal, template!(List: "ordinal"), ErrorPreceding, EncodeCrossCrate::Yes),
|
2019-08-22 21:30:59 +00:00
|
|
|
|
|
|
|
// Limits:
|
2024-02-23 09:23:01 +00:00
|
|
|
ungated!(
|
|
|
|
recursion_limit, CrateLevel, template!(NameValueStr: "N"), FutureWarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No
|
2024-02-23 09:23:01 +00:00
|
|
|
),
|
|
|
|
ungated!(
|
|
|
|
type_length_limit, CrateLevel, template!(NameValueStr: "N"), FutureWarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No
|
2024-02-23 09:23:01 +00:00
|
|
|
),
|
2021-03-26 16:28:52 +00:00
|
|
|
gated!(
|
2021-09-05 23:30:37 +00:00
|
|
|
move_size_limit, CrateLevel, template!(NameValueStr: "N"), ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, large_assignments, experimental!(move_size_limit)
|
2021-03-26 16:28:52 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
|
|
|
|
// Entry point:
|
2024-03-18 16:05:18 +00:00
|
|
|
ungated!(start, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No),
|
|
|
|
ungated!(no_start, CrateLevel, template!(Word), WarnFollowing, EncodeCrossCrate::No),
|
|
|
|
ungated!(no_main, CrateLevel, template!(Word), WarnFollowing, EncodeCrossCrate::No),
|
2019-08-22 21:30:59 +00:00
|
|
|
|
|
|
|
// Modules, prelude, and resolution:
|
2024-03-18 16:05:18 +00:00
|
|
|
ungated!(path, Normal, template!(NameValueStr: "file"), FutureWarnFollowing, EncodeCrossCrate::No),
|
|
|
|
ungated!(no_std, CrateLevel, template!(Word), WarnFollowing, EncodeCrossCrate::No),
|
|
|
|
ungated!(no_implicit_prelude, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No),
|
|
|
|
ungated!(non_exhaustive, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes),
|
2019-08-22 21:30:59 +00:00
|
|
|
|
|
|
|
// Runtime
|
2021-09-05 23:30:37 +00:00
|
|
|
ungated!(
|
2022-01-09 21:08:30 +00:00
|
|
|
windows_subsystem, CrateLevel,
|
2024-02-27 02:45:19 +00:00
|
|
|
template!(NameValueStr: "windows|console"), FutureWarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
2024-03-18 16:05:18 +00:00
|
|
|
ungated!(panic_handler, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes), // RFC 2070
|
2019-08-22 21:30:59 +00:00
|
|
|
|
|
|
|
// Code generation:
|
2024-03-18 16:05:18 +00:00
|
|
|
ungated!(inline, Normal, template!(Word, List: "always|never"), FutureWarnFollowing, EncodeCrossCrate::No),
|
|
|
|
ungated!(cold, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No),
|
|
|
|
ungated!(no_builtins, CrateLevel, template!(Word), WarnFollowing, EncodeCrossCrate::Yes),
|
2022-09-13 13:23:54 +00:00
|
|
|
ungated!(
|
|
|
|
target_feature, Normal, template!(List: r#"enable = "name""#),
|
2024-03-18 16:05:18 +00:00
|
|
|
DuplicatesOk, EncodeCrossCrate::No,
|
2022-09-13 13:23:54 +00:00
|
|
|
),
|
2024-03-18 16:05:18 +00:00
|
|
|
ungated!(track_caller, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes),
|
|
|
|
ungated!(instruction_set, Normal, template!(List: "set"), ErrorPreceding, EncodeCrossCrate::No),
|
2020-01-12 00:00:00 +00:00
|
|
|
gated!(
|
2021-07-29 17:00:41 +00:00
|
|
|
no_sanitize, Normal,
|
2022-11-22 05:29:00 +00:00
|
|
|
template!(List: "address, kcfi, memory, thread"), DuplicatesOk,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, experimental!(no_sanitize)
|
2024-02-27 02:45:19 +00:00
|
|
|
),
|
|
|
|
gated!(
|
|
|
|
coverage, Normal, template!(Word, List: "on|off"),
|
2024-03-18 16:05:18 +00:00
|
|
|
WarnFollowing, EncodeCrossCrate::No,
|
2024-02-27 02:45:19 +00:00
|
|
|
coverage_attribute, experimental!(coverage)
|
2020-01-12 00:00:00 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
|
2021-09-05 23:30:37 +00:00
|
|
|
ungated!(
|
2024-03-18 16:05:18 +00:00
|
|
|
doc, Normal, template!(List: "hidden|inline|...", NameValueStr: "string"), DuplicatesOk,
|
|
|
|
EncodeCrossCrate::Yes
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
|
2023-03-02 02:56:29 +00:00
|
|
|
// Debugging
|
|
|
|
ungated!(
|
2023-03-02 18:41:08 +00:00
|
|
|
debugger_visualizer, Normal,
|
2024-02-27 02:45:19 +00:00
|
|
|
template!(List: r#"natvis_file = "...", gdb_script_file = "...""#),
|
2024-03-18 16:05:18 +00:00
|
|
|
DuplicatesOk, EncodeCrossCrate::No
|
2023-03-02 02:56:29 +00:00
|
|
|
),
|
2024-02-09 12:39:25 +00:00
|
|
|
ungated!(collapse_debuginfo, Normal, template!(List: "no|external|yes"), ErrorFollowing,
|
|
|
|
EncodeCrossCrate::Yes
|
|
|
|
),
|
2023-03-02 02:56:29 +00:00
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
// ==========================================================================
|
|
|
|
// Unstable attributes:
|
|
|
|
// ==========================================================================
|
|
|
|
|
|
|
|
// Linking:
|
2023-02-14 09:56:24 +00:00
|
|
|
gated!(
|
2024-03-18 16:05:18 +00:00
|
|
|
naked, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No,
|
2023-02-14 09:56:24 +00:00
|
|
|
naked_functions, experimental!(naked)
|
|
|
|
),
|
2019-09-18 14:40:08 +00:00
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
// Testing:
|
2019-08-22 18:40:50 +00:00
|
|
|
gated!(
|
2024-03-18 16:05:18 +00:00
|
|
|
test_runner, CrateLevel, template!(List: "path"), ErrorFollowing,
|
|
|
|
EncodeCrossCrate::Yes, custom_test_frameworks,
|
2019-08-22 21:30:59 +00:00
|
|
|
"custom test frameworks are an unstable feature",
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
2019-08-22 16:32:31 +00:00
|
|
|
// RFC #1268
|
2019-08-22 18:40:50 +00:00
|
|
|
gated!(
|
2024-03-18 16:05:18 +00:00
|
|
|
marker, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No,
|
2023-02-14 09:56:24 +00:00
|
|
|
marker_trait_attr, experimental!(marker)
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
|
|
|
gated!(
|
2024-03-18 16:05:18 +00:00
|
|
|
thread_local, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No,
|
2019-08-22 21:30:59 +00:00
|
|
|
"`#[thread_local]` is an experimental feature, and does not currently handle destructors",
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
2024-02-27 02:45:19 +00:00
|
|
|
gated!(
|
|
|
|
no_core, CrateLevel, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, experimental!(no_core)
|
2024-02-27 02:45:19 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
// RFC 2412
|
2019-08-22 18:40:50 +00:00
|
|
|
gated!(
|
2024-02-27 02:45:19 +00:00
|
|
|
optimize, Normal, template!(List: "size|speed"), ErrorPreceding,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, optimize_attribute, experimental!(optimize)
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
|
|
|
|
2024-02-27 02:45:19 +00:00
|
|
|
gated!(
|
2024-05-27 16:46:19 +00:00
|
|
|
unsafe ffi_pure, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, experimental!(ffi_pure)
|
2024-02-27 02:45:19 +00:00
|
|
|
),
|
|
|
|
gated!(
|
2024-05-27 16:46:19 +00:00
|
|
|
unsafe ffi_const, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, experimental!(ffi_const)
|
2024-02-27 02:45:19 +00:00
|
|
|
),
|
2019-11-03 17:28:20 +00:00
|
|
|
gated!(
|
2021-09-05 23:30:37 +00:00
|
|
|
register_tool, CrateLevel, template!(List: "tool1, tool2, ..."), DuplicatesOk,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, experimental!(register_tool),
|
2019-11-03 17:28:20 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
|
2021-09-05 23:30:37 +00:00
|
|
|
gated!(
|
|
|
|
cmse_nonsecure_entry, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, experimental!(cmse_nonsecure_entry)
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
2021-07-04 15:50:34 +00:00
|
|
|
// RFC 2632
|
|
|
|
gated!(
|
2024-03-18 16:05:18 +00:00
|
|
|
const_trait, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes, const_trait_impl,
|
2022-08-28 04:53:36 +00:00
|
|
|
"`const_trait` is a temporary placeholder for marking a trait that is suitable for `const` \
|
2022-03-16 09:49:54 +00:00
|
|
|
`impls` and all default bodies as `const`, which may be removed or renamed in the \
|
|
|
|
future."
|
2021-07-04 15:50:34 +00:00
|
|
|
),
|
2022-03-15 22:28:53 +00:00
|
|
|
// lang-team MCP 147
|
|
|
|
gated!(
|
|
|
|
deprecated_safe, Normal, template!(List: r#"since = "version", note = "...""#), ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes, experimental!(deprecated_safe),
|
2022-03-15 22:28:53 +00:00
|
|
|
),
|
2022-07-21 15:19:22 +00:00
|
|
|
|
2022-12-13 06:42:44 +00:00
|
|
|
// `#[cfi_encoding = ""]`
|
|
|
|
gated!(
|
|
|
|
cfi_encoding, Normal, template!(NameValueStr: "encoding"), ErrorPreceding,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes, experimental!(cfi_encoding)
|
2022-12-13 06:42:44 +00:00
|
|
|
),
|
|
|
|
|
2024-04-11 12:48:32 +00:00
|
|
|
// `#[coroutine]` attribute to be applied to closures to make them coroutines instead
|
|
|
|
gated!(
|
|
|
|
coroutine, Normal, template!(Word), ErrorFollowing,
|
|
|
|
EncodeCrossCrate::No, coroutines, experimental!(coroutines)
|
|
|
|
),
|
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
// ==========================================================================
|
|
|
|
// Internal attributes: Stability, deprecation, and unsafe:
|
|
|
|
// ==========================================================================
|
|
|
|
|
2022-09-13 13:23:54 +00:00
|
|
|
ungated!(
|
|
|
|
feature, CrateLevel,
|
2024-03-18 16:05:18 +00:00
|
|
|
template!(List: "name1, name2, ..."), DuplicatesOk, EncodeCrossCrate::No,
|
2022-09-13 13:23:54 +00:00
|
|
|
),
|
2021-09-05 23:30:37 +00:00
|
|
|
// DuplicatesOk since it has its own validation
|
|
|
|
ungated!(
|
2022-09-13 13:23:54 +00:00
|
|
|
stable, Normal,
|
2024-03-18 16:05:18 +00:00
|
|
|
template!(List: r#"feature = "name", since = "version""#), DuplicatesOk, EncodeCrossCrate::No,
|
2019-08-22 21:30:59 +00:00
|
|
|
),
|
|
|
|
ungated!(
|
2021-07-29 17:00:41 +00:00
|
|
|
unstable, Normal,
|
2021-09-05 23:30:37 +00:00
|
|
|
template!(List: r#"feature = "name", reason = "...", issue = "N""#), DuplicatesOk,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes
|
|
|
|
),
|
|
|
|
ungated!(
|
|
|
|
rustc_const_unstable, Normal, template!(List: r#"feature = "name""#),
|
|
|
|
DuplicatesOk, EncodeCrossCrate::Yes
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
2022-09-13 13:23:54 +00:00
|
|
|
ungated!(
|
|
|
|
rustc_const_stable, Normal,
|
2024-03-18 16:05:18 +00:00
|
|
|
template!(List: r#"feature = "name""#), DuplicatesOk, EncodeCrossCrate::No,
|
2022-09-13 13:23:54 +00:00
|
|
|
),
|
2022-04-27 14:14:19 +00:00
|
|
|
ungated!(
|
|
|
|
rustc_default_body_unstable, Normal,
|
2024-02-27 02:45:19 +00:00
|
|
|
template!(List: r#"feature = "name", reason = "...", issue = "N""#),
|
2024-03-18 16:05:18 +00:00
|
|
|
DuplicatesOk, EncodeCrossCrate::No
|
2022-04-27 14:14:19 +00:00
|
|
|
),
|
2019-08-22 18:40:50 +00:00
|
|
|
gated!(
|
2024-03-18 16:05:18 +00:00
|
|
|
allow_internal_unstable, Normal, template!(Word, List: "feat1, feat2, ..."),
|
|
|
|
DuplicatesOk, EncodeCrossCrate::Yes,
|
2019-11-30 01:03:32 +00:00
|
|
|
"allow_internal_unstable side-steps feature gating and stability checks",
|
|
|
|
),
|
2020-10-21 10:36:07 +00:00
|
|
|
gated!(
|
2021-09-05 23:30:37 +00:00
|
|
|
rustc_allow_const_fn_unstable, Normal,
|
2024-03-18 16:05:18 +00:00
|
|
|
template!(Word, List: "feat1, feat2, ..."), DuplicatesOk, EncodeCrossCrate::No,
|
2020-10-21 10:36:07 +00:00
|
|
|
"rustc_allow_const_fn_unstable side-steps feature gating and stability checks"
|
|
|
|
),
|
2019-11-30 01:03:32 +00:00
|
|
|
gated!(
|
2021-09-05 23:30:37 +00:00
|
|
|
allow_internal_unsafe, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, "allow_internal_unsafe side-steps the unsafe_code lint",
|
2024-02-28 14:45:43 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
rustc_allowed_through_unstable_modules, Normal, template!(Word),
|
2024-03-18 16:05:18 +00:00
|
|
|
WarnFollowing, EncodeCrossCrate::No,
|
2024-02-28 14:45:43 +00:00
|
|
|
"rustc_allowed_through_unstable_modules special cases accidental stabilizations of stable items \
|
|
|
|
through unstable paths"
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
2024-05-13 07:05:34 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_deprecated_safe_2024, Normal, template!(Word), WarnFollowing,
|
|
|
|
EncodeCrossCrate::Yes,
|
|
|
|
"rustc_deprecated_safe_2024 is supposed to be used in libstd only",
|
|
|
|
),
|
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
|
|
|
|
// ==========================================================================
|
|
|
|
// Internal attributes: Type system related:
|
|
|
|
// ==========================================================================
|
2019-08-22 17:37:04 +00:00
|
|
|
|
2024-03-18 16:05:18 +00:00
|
|
|
gated!(fundamental, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes, experimental!(fundamental)),
|
2019-08-22 18:40:50 +00:00
|
|
|
gated!(
|
2024-02-28 14:45:43 +00:00
|
|
|
may_dangle, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, dropck_eyepatch,
|
2019-08-22 21:30:59 +00:00
|
|
|
"`may_dangle` has unstable semantics and may be removed in the future",
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
|
2024-03-15 12:27:54 +00:00
|
|
|
rustc_attr!(
|
2024-03-21 19:47:46 +00:00
|
|
|
rustc_never_type_options,
|
|
|
|
Normal,
|
|
|
|
template!(List: r#"/*opt*/ fallback = "unit|niko|never|no""#),
|
|
|
|
ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
2024-03-21 19:47:46 +00:00
|
|
|
"`rustc_never_type_options` is used to experiment with never type fallback and work on \
|
2024-03-15 12:27:54 +00:00
|
|
|
never type stabilization, and will never be stable"
|
|
|
|
),
|
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
// ==========================================================================
|
|
|
|
// Internal attributes: Runtime related:
|
|
|
|
// ==========================================================================
|
|
|
|
|
2024-02-28 14:45:43 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_allocator, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, IMPL_DETAIL
|
2024-02-28 14:45:43 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
rustc_nounwind, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, IMPL_DETAIL
|
2024-02-28 14:45:43 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
rustc_reallocator, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, IMPL_DETAIL
|
2024-02-28 14:45:43 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
rustc_deallocator, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, IMPL_DETAIL
|
2024-02-28 14:45:43 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
rustc_allocator_zeroed, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, IMPL_DETAIL
|
2024-02-28 14:45:43 +00:00
|
|
|
),
|
|
|
|
gated!(
|
|
|
|
default_lib_allocator, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, allocator_internals, experimental!(default_lib_allocator),
|
2024-02-28 14:45:43 +00:00
|
|
|
),
|
2019-08-22 18:40:50 +00:00
|
|
|
gated!(
|
2024-02-28 14:45:43 +00:00
|
|
|
needs_allocator, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, allocator_internals, experimental!(needs_allocator),
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
|
|
|
gated!(
|
2024-02-28 14:45:43 +00:00
|
|
|
panic_runtime, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, experimental!(panic_runtime)
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
|
|
|
gated!(
|
2021-09-05 23:30:37 +00:00
|
|
|
needs_panic_runtime, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, experimental!(needs_panic_runtime)
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
|
|
|
gated!(
|
|
|
|
compiler_builtins, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
2019-08-22 18:40:50 +00:00
|
|
|
"the `#[compiler_builtins]` attribute is used to identify the `compiler_builtins` crate \
|
|
|
|
which contains compiler-rt intrinsics and will never be stable",
|
|
|
|
),
|
|
|
|
gated!(
|
2021-09-05 23:30:37 +00:00
|
|
|
profiler_runtime, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
2019-08-22 18:40:50 +00:00
|
|
|
"the `#[profiler_runtime]` attribute is used to identify the `profiler_builtins` crate \
|
|
|
|
which contains the profiler runtime and will never be stable",
|
|
|
|
),
|
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
// ==========================================================================
|
|
|
|
// Internal attributes, Linkage:
|
|
|
|
// ==========================================================================
|
|
|
|
|
2019-08-22 18:40:50 +00:00
|
|
|
gated!(
|
2024-03-18 16:05:18 +00:00
|
|
|
linkage, Normal, template!(NameValueStr: "external|internal|..."),
|
|
|
|
ErrorPreceding, EncodeCrossCrate::No,
|
2019-08-22 21:30:59 +00:00
|
|
|
"the `linkage` attribute is experimental and not portable across platforms",
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
2021-09-05 23:30:37 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_std_internal_symbol, Normal, template!(Word), WarnFollowing,
|
|
|
|
EncodeCrossCrate::No, INTERNAL_UNSTABLE
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
2019-08-22 18:40:50 +00:00
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
// ==========================================================================
|
|
|
|
// Internal attributes, Macro related:
|
|
|
|
// ==========================================================================
|
|
|
|
|
2021-07-10 14:16:53 +00:00
|
|
|
rustc_attr!(
|
2021-07-29 17:00:41 +00:00
|
|
|
rustc_builtin_macro, Normal,
|
2021-09-05 23:30:37 +00:00
|
|
|
template!(Word, List: "name, /*opt*/ attributes(name1, name2, ...)"), ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes, IMPL_DETAIL
|
2021-07-10 14:16:53 +00:00
|
|
|
),
|
2024-02-28 14:45:43 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_proc_macro_decls, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, INTERNAL_UNSTABLE
|
2024-02-28 14:45:43 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
rustc_attr!(
|
2021-07-29 17:00:41 +00:00
|
|
|
rustc_macro_transparency, Normal,
|
2021-09-05 23:30:37 +00:00
|
|
|
template!(NameValueStr: "transparent|semitransparent|opaque"), ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes, "used internally for testing macro hygiene",
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
// ==========================================================================
|
|
|
|
// Internal attributes, Diagnostics related:
|
|
|
|
// ==========================================================================
|
|
|
|
|
2019-10-25 05:19:07 +00:00
|
|
|
rustc_attr!(
|
2021-07-29 17:00:41 +00:00
|
|
|
rustc_on_unimplemented, Normal,
|
2019-08-22 21:30:59 +00:00
|
|
|
template!(
|
|
|
|
List: r#"/*opt*/ message = "...", /*opt*/ label = "...", /*opt*/ note = "...""#,
|
|
|
|
NameValueStr: "message"
|
|
|
|
),
|
2024-03-18 16:05:18 +00:00
|
|
|
ErrorFollowing, EncodeCrossCrate::Yes,
|
2019-10-25 05:19:07 +00:00
|
|
|
INTERNAL_UNSTABLE
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
2023-07-16 10:18:38 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_confusables, Normal,
|
|
|
|
template!(List: r#""name1", "name2", ..."#),
|
2024-03-18 16:05:18 +00:00
|
|
|
ErrorFollowing, EncodeCrossCrate::Yes,
|
2023-07-16 10:18:38 +00:00
|
|
|
INTERNAL_UNSTABLE,
|
|
|
|
),
|
2020-07-07 15:12:44 +00:00
|
|
|
// Enumerates "identity-like" conversion methods to suggest on type mismatch.
|
2021-09-05 23:30:37 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_conversion_suggestion, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
2021-05-21 17:35:49 +00:00
|
|
|
// Prevents field reads in the marked trait or method to be considered
|
|
|
|
// during dead code analysis.
|
2021-09-05 23:30:37 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_trivial_field_reads, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
2022-01-05 12:02:16 +00:00
|
|
|
// Used by the `rustc::potential_query_instability` lint to warn methods which
|
|
|
|
// might not be stable during incremental compilation.
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_lint_query_instability, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
|
|
|
),
|
2024-02-20 03:12:50 +00:00
|
|
|
// Used by the `rustc::diagnostic_outside_of_impl` lints to assist in changes to diagnostic
|
|
|
|
// APIs. Any function with this attribute will be checked by that lint.
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_lint_diagnostics, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
|
|
|
),
|
2022-07-25 12:02:39 +00:00
|
|
|
// Used by the `rustc::bad_opt_access` lint to identify `DebuggingOptions` and `CodegenOptions`
|
|
|
|
// types (as well as any others in future).
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_lint_opt_ty, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
|
|
|
),
|
2022-07-25 12:02:39 +00:00
|
|
|
// Used by the `rustc::bad_opt_access` lint on fields
|
|
|
|
// types (as well as any others in future).
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_lint_opt_deny_field_access, Normal, template!(List: "message"),
|
|
|
|
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
|
|
|
|
// ==========================================================================
|
|
|
|
// Internal attributes, Const related:
|
|
|
|
// ==========================================================================
|
|
|
|
|
2024-03-05 07:46:49 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_promotable, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, IMPL_DETAIL),
|
2021-09-05 23:30:37 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_legacy_const_generics, Normal, template!(List: "N"), ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
2021-10-12 05:06:37 +00:00
|
|
|
// Do not const-check this function's body. It will always get replaced during CTFE.
|
2021-09-05 23:30:37 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_do_not_const_check, Normal, template!(Word), WarnFollowing,
|
|
|
|
EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
2023-09-03 04:31:56 +00:00
|
|
|
// Ensure the argument to this function is &&str during const-check.
|
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_const_panic_str, Normal, template!(Word), WarnFollowing,
|
|
|
|
EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
2023-09-03 04:31:56 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
|
|
|
|
// ==========================================================================
|
|
|
|
// Internal attributes, Layout related:
|
|
|
|
// ==========================================================================
|
2019-08-22 16:32:31 +00:00
|
|
|
|
2019-08-22 17:37:04 +00:00
|
|
|
rustc_attr!(
|
2021-09-05 23:30:37 +00:00
|
|
|
rustc_layout_scalar_valid_range_start, Normal, template!(List: "value"), ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes,
|
2019-08-22 21:30:59 +00:00
|
|
|
"the `#[rustc_layout_scalar_valid_range_start]` attribute is just used to enable \
|
Generalize `get_nullable_type` to allow types where null is all-ones.
Generalize get_nullable_type to accept types that have an all-ones bit
pattern as their sentry "null" value.
This will allow [`OwnedFd`], [`BorrowedFd`], [`OwnedSocket`], and
[`BorrowedSocket`] to be marked with
`#[rustc_nonnull_optimization_guaranteed]`, which will allow
`Option<OwnedFd>`, `Option<BorrowedFd>`, `Option<OwnedSocket>`, and
`Option<BorrowedSocket>` to be used in FFI declarations, as described
in the [I/O safety RFC].
For example, it will allow a function like `open` on Unix and `WSASocketW`
on Windows to be declared using `Option<OwnedFd>` and `Option<OwnedSocket>`
return types, respectively.
The actual change to add `#[rustc_nonnull_optimization_guaranteed]`
to the abovementioned types will be a separate PR, as it'll depend on
having this patch in the stage0 compiler.
Also, update the diagnostics to mention that "niche optimizations" are
used in libstd as well as libcore, as `rustc_layout_scalar_valid_range_start`
and `rustc_layout_scalar_valid_range_end` are already in use in libstd.
[`OwnedFd`]: https://github.com/rust-lang/rust/blob/c9dc44be24c58ff13ce46416c4b97ab5c1bd8429/library/std/src/os/fd/owned.rs#L49
[`BorrowedFd`]: https://github.com/rust-lang/rust/blob/c9dc44be24c58ff13ce46416c4b97ab5c1bd8429/library/std/src/os/fd/owned.rs#L29
[`OwnedSocket`]: https://github.com/rust-lang/rust/blob/c9dc44be24c58ff13ce46416c4b97ab5c1bd8429/library/std/src/os/windows/io/socket.rs#L51
[`BorrowedSocket`]: https://github.com/rust-lang/rust/blob/c9dc44be24c58ff13ce46416c4b97ab5c1bd8429/library/std/src/os/windows/io/socket.rs#L29
[I/O safety RFC]: https://github.com/rust-lang/rfcs/blob/master/text/3128-io-safety.md#ownedfd-and-borrowedfdfd-1
2022-03-03 22:41:10 +00:00
|
|
|
niche optimizations in libcore and libstd and will never be stable",
|
2019-08-22 17:37:04 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
2021-09-05 23:30:37 +00:00
|
|
|
rustc_layout_scalar_valid_range_end, Normal, template!(List: "value"), ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes,
|
2019-08-22 21:30:59 +00:00
|
|
|
"the `#[rustc_layout_scalar_valid_range_end]` attribute is just used to enable \
|
Generalize `get_nullable_type` to allow types where null is all-ones.
Generalize get_nullable_type to accept types that have an all-ones bit
pattern as their sentry "null" value.
This will allow [`OwnedFd`], [`BorrowedFd`], [`OwnedSocket`], and
[`BorrowedSocket`] to be marked with
`#[rustc_nonnull_optimization_guaranteed]`, which will allow
`Option<OwnedFd>`, `Option<BorrowedFd>`, `Option<OwnedSocket>`, and
`Option<BorrowedSocket>` to be used in FFI declarations, as described
in the [I/O safety RFC].
For example, it will allow a function like `open` on Unix and `WSASocketW`
on Windows to be declared using `Option<OwnedFd>` and `Option<OwnedSocket>`
return types, respectively.
The actual change to add `#[rustc_nonnull_optimization_guaranteed]`
to the abovementioned types will be a separate PR, as it'll depend on
having this patch in the stage0 compiler.
Also, update the diagnostics to mention that "niche optimizations" are
used in libstd as well as libcore, as `rustc_layout_scalar_valid_range_start`
and `rustc_layout_scalar_valid_range_end` are already in use in libstd.
[`OwnedFd`]: https://github.com/rust-lang/rust/blob/c9dc44be24c58ff13ce46416c4b97ab5c1bd8429/library/std/src/os/fd/owned.rs#L49
[`BorrowedFd`]: https://github.com/rust-lang/rust/blob/c9dc44be24c58ff13ce46416c4b97ab5c1bd8429/library/std/src/os/fd/owned.rs#L29
[`OwnedSocket`]: https://github.com/rust-lang/rust/blob/c9dc44be24c58ff13ce46416c4b97ab5c1bd8429/library/std/src/os/windows/io/socket.rs#L51
[`BorrowedSocket`]: https://github.com/rust-lang/rust/blob/c9dc44be24c58ff13ce46416c4b97ab5c1bd8429/library/std/src/os/windows/io/socket.rs#L29
[I/O safety RFC]: https://github.com/rust-lang/rfcs/blob/master/text/3128-io-safety.md#ownedfd-and-borrowedfdfd-1
2022-03-03 22:41:10 +00:00
|
|
|
niche optimizations in libcore and libstd and will never be stable",
|
2019-08-22 17:37:04 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
2021-09-05 23:30:37 +00:00
|
|
|
rustc_nonnull_optimization_guaranteed, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes,
|
2019-08-22 21:30:59 +00:00
|
|
|
"the `#[rustc_nonnull_optimization_guaranteed]` attribute is just used to enable \
|
Generalize `get_nullable_type` to allow types where null is all-ones.
Generalize get_nullable_type to accept types that have an all-ones bit
pattern as their sentry "null" value.
This will allow [`OwnedFd`], [`BorrowedFd`], [`OwnedSocket`], and
[`BorrowedSocket`] to be marked with
`#[rustc_nonnull_optimization_guaranteed]`, which will allow
`Option<OwnedFd>`, `Option<BorrowedFd>`, `Option<OwnedSocket>`, and
`Option<BorrowedSocket>` to be used in FFI declarations, as described
in the [I/O safety RFC].
For example, it will allow a function like `open` on Unix and `WSASocketW`
on Windows to be declared using `Option<OwnedFd>` and `Option<OwnedSocket>`
return types, respectively.
The actual change to add `#[rustc_nonnull_optimization_guaranteed]`
to the abovementioned types will be a separate PR, as it'll depend on
having this patch in the stage0 compiler.
Also, update the diagnostics to mention that "niche optimizations" are
used in libstd as well as libcore, as `rustc_layout_scalar_valid_range_start`
and `rustc_layout_scalar_valid_range_end` are already in use in libstd.
[`OwnedFd`]: https://github.com/rust-lang/rust/blob/c9dc44be24c58ff13ce46416c4b97ab5c1bd8429/library/std/src/os/fd/owned.rs#L49
[`BorrowedFd`]: https://github.com/rust-lang/rust/blob/c9dc44be24c58ff13ce46416c4b97ab5c1bd8429/library/std/src/os/fd/owned.rs#L29
[`OwnedSocket`]: https://github.com/rust-lang/rust/blob/c9dc44be24c58ff13ce46416c4b97ab5c1bd8429/library/std/src/os/windows/io/socket.rs#L51
[`BorrowedSocket`]: https://github.com/rust-lang/rust/blob/c9dc44be24c58ff13ce46416c4b97ab5c1bd8429/library/std/src/os/windows/io/socket.rs#L29
[I/O safety RFC]: https://github.com/rust-lang/rfcs/blob/master/text/3128-io-safety.md#ownedfd-and-borrowedfdfd-1
2022-03-03 22:41:10 +00:00
|
|
|
niche optimizations in libcore and libstd and will never be stable",
|
2019-08-22 17:37:04 +00:00
|
|
|
),
|
2019-08-22 16:32:31 +00:00
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
// ==========================================================================
|
|
|
|
// Internal attributes, Misc:
|
|
|
|
// ==========================================================================
|
2019-08-22 18:40:50 +00:00
|
|
|
gated!(
|
2024-03-18 16:05:18 +00:00
|
|
|
lang, Normal, template!(NameValueStr: "name"), DuplicatesOk, EncodeCrossCrate::No, lang_items,
|
2024-04-17 10:30:45 +00:00
|
|
|
"lang items are subject to change",
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
2022-01-07 11:38:16 +00:00
|
|
|
rustc_attr!(
|
2023-02-14 09:17:19 +00:00
|
|
|
rustc_pass_by_value, Normal, template!(Word), ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes,
|
2022-01-07 11:38:16 +00:00
|
|
|
"#[rustc_pass_by_value] is used to mark types that must be passed by value instead of reference."
|
|
|
|
),
|
2023-08-05 02:54:23 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_never_returns_null_ptr, Normal, template!(Word), ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes,
|
2023-08-05 02:54:23 +00:00
|
|
|
"#[rustc_never_returns_null_ptr] is used to mark functions returning non-null pointers."
|
|
|
|
),
|
2022-03-15 15:30:30 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_coherence_is_core, AttributeType::CrateLevel, template!(Word), ErrorFollowing, EncodeCrossCrate::No,
|
2022-03-15 15:30:30 +00:00
|
|
|
"#![rustc_coherence_is_core] allows inherent methods on builtin types, only intended to be used in `core`."
|
|
|
|
),
|
2023-02-14 09:17:19 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_coinductive, AttributeType::Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No,
|
2023-02-14 09:17:19 +00:00
|
|
|
"#![rustc_coinductive] changes a trait to be coinductive, allowing cycles in the trait solver."
|
|
|
|
),
|
2022-03-15 15:30:30 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_allow_incoherent_impl, AttributeType::Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::No,
|
2022-03-15 15:30:30 +00:00
|
|
|
"#[rustc_allow_incoherent_impl] has to be added to all impl items of an incoherent inherent impl."
|
|
|
|
),
|
2024-03-10 08:29:39 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_preserve_ub_checks, AttributeType::CrateLevel, template!(Word), ErrorFollowing, EncodeCrossCrate::No,
|
|
|
|
"`#![rustc_preserve_ub_checks]` prevents the designated crate from evaluating whether UB checks are enabled when optimizing MIR",
|
|
|
|
),
|
2022-11-12 23:37:52 +00:00
|
|
|
rustc_attr!(
|
2023-06-16 23:45:01 +00:00
|
|
|
rustc_deny_explicit_impl,
|
|
|
|
AttributeType::Normal,
|
|
|
|
template!(List: "implement_via_object = (true|false)"),
|
|
|
|
ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
2022-11-12 23:37:52 +00:00
|
|
|
"#[rustc_deny_explicit_impl] enforces that a trait can have no user-provided impls"
|
|
|
|
),
|
2022-04-28 14:26:30 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_has_incoherent_inherent_impls, AttributeType::Normal, template!(Word),
|
|
|
|
ErrorFollowing, EncodeCrossCrate::Yes,
|
2022-04-28 14:26:30 +00:00
|
|
|
"#[rustc_has_incoherent_inherent_impls] allows the addition of incoherent inherent impls for \
|
|
|
|
the given type by annotating all impl items with #[rustc_allow_incoherent_impl]."
|
|
|
|
),
|
2022-05-22 21:10:27 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_box, AttributeType::Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::No,
|
2022-05-22 21:10:27 +00:00
|
|
|
"#[rustc_box] allows creating boxes \
|
|
|
|
and it is only intended to be used in `alloc`."
|
|
|
|
),
|
|
|
|
|
2021-11-12 12:15:14 +00:00
|
|
|
BuiltinAttribute {
|
|
|
|
name: sym::rustc_diagnostic_item,
|
2022-04-01 13:04:47 +00:00
|
|
|
// FIXME: This can be `true` once we always use `tcx.is_diagnostic_item`.
|
2024-03-18 16:05:18 +00:00
|
|
|
encode_cross_crate: EncodeCrossCrate::Yes,
|
2021-11-12 12:15:14 +00:00
|
|
|
type_: Normal,
|
2024-04-21 04:54:50 +00:00
|
|
|
safety: AttributeSafety::Normal,
|
2021-11-12 12:15:14 +00:00
|
|
|
template: template!(NameValueStr: "name"),
|
2021-09-05 23:30:37 +00:00
|
|
|
duplicates: ErrorFollowing,
|
2021-11-12 12:15:14 +00:00
|
|
|
gate: Gated(
|
2019-05-19 18:16:04 +00:00
|
|
|
Stability::Unstable,
|
|
|
|
sym::rustc_attrs,
|
|
|
|
"diagnostic items compiler internal support for linting",
|
|
|
|
cfg_fn!(rustc_attrs),
|
|
|
|
),
|
2021-11-12 12:15:14 +00:00
|
|
|
},
|
2019-08-22 18:40:50 +00:00
|
|
|
gated!(
|
2019-08-22 21:30:59 +00:00
|
|
|
// Used in resolve:
|
2021-09-05 23:30:37 +00:00
|
|
|
prelude_import, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, "`#[prelude_import]` is for use by rustc only",
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
|
|
|
gated!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_paren_sugar, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No,
|
2024-03-05 07:46:49 +00:00
|
|
|
unboxed_closures, "unboxed_closures are still evolving",
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_inherit_overflow_checks, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No,
|
2019-08-22 21:30:59 +00:00
|
|
|
"the `#[rustc_inherit_overflow_checks]` attribute is just used to control \
|
|
|
|
overflow checking behavior of several libcore functions that are inlined \
|
|
|
|
across crates and will never be stable",
|
|
|
|
),
|
2021-09-05 23:30:37 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_reservation_impl, Normal,
|
2024-03-18 16:05:18 +00:00
|
|
|
template!(NameValueStr: "reservation message"), ErrorFollowing, EncodeCrossCrate::Yes,
|
2021-09-05 23:30:37 +00:00
|
|
|
"the `#[rustc_reservation_impl]` attribute is internally used \
|
|
|
|
for reserving for `for<T> From<!> for T` impl"
|
2019-07-13 15:02:00 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
rustc_attr!(
|
2022-07-26 21:40:48 +00:00
|
|
|
rustc_test_marker, Normal, template!(NameValueStr: "name"), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No, "the `#[rustc_test_marker]` attribute is used internally to track tests",
|
2019-08-22 21:30:59 +00:00
|
|
|
),
|
2020-02-08 17:56:25 +00:00
|
|
|
rustc_attr!(
|
2024-03-05 07:46:49 +00:00
|
|
|
rustc_unsafe_specialization_marker, Normal, template!(Word),
|
2024-03-18 16:05:18 +00:00
|
|
|
WarnFollowing, EncodeCrossCrate::No,
|
2020-02-08 17:56:25 +00:00
|
|
|
"the `#[rustc_unsafe_specialization_marker]` attribute is used to check specializations"
|
|
|
|
),
|
|
|
|
rustc_attr!(
|
2024-03-05 07:46:49 +00:00
|
|
|
rustc_specialization_trait, Normal, template!(Word),
|
2024-03-18 16:05:18 +00:00
|
|
|
WarnFollowing, EncodeCrossCrate::No,
|
2020-02-08 17:56:25 +00:00
|
|
|
"the `#[rustc_specialization_trait]` attribute is used to check specializations"
|
|
|
|
),
|
2021-04-08 13:37:38 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_main, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No,
|
2021-04-08 13:37:38 +00:00
|
|
|
"the `#[rustc_main]` attribute is used internally to specify test entry point function",
|
|
|
|
),
|
2021-04-12 23:03:53 +00:00
|
|
|
rustc_attr!(
|
2024-04-17 20:32:17 +00:00
|
|
|
rustc_skip_during_method_dispatch, Normal, template!(List: "array, boxed_slice"), WarnFollowing,
|
|
|
|
EncodeCrossCrate::No,
|
|
|
|
"the `#[rustc_skip_during_method_dispatch]` attribute is used to exclude a trait \
|
|
|
|
from method dispatch when the receiver is of the following type, for compatibility in \
|
|
|
|
editions < 2021 (array) or editions < 2024 (boxed_slice)."
|
2021-04-12 23:03:53 +00:00
|
|
|
),
|
2021-12-21 15:40:50 +00:00
|
|
|
rustc_attr!(
|
2024-03-05 07:46:49 +00:00
|
|
|
rustc_must_implement_one_of, Normal, template!(List: "function1, function2, ..."),
|
2024-03-18 16:05:18 +00:00
|
|
|
ErrorFollowing, EncodeCrossCrate::No,
|
2021-12-21 15:40:50 +00:00
|
|
|
"the `#[rustc_must_implement_one_of]` attribute is used to change minimal complete \
|
|
|
|
definition of a trait, it's currently in experimental form and should be changed before \
|
|
|
|
being exposed outside of the std"
|
|
|
|
),
|
2023-03-21 15:43:51 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_doc_primitive, Normal, template!(NameValueStr: "primitive name"), ErrorFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::Yes, r#"`rustc_doc_primitive` is a rustc internal attribute"#,
|
2023-03-21 15:43:51 +00:00
|
|
|
),
|
2023-09-25 19:40:40 +00:00
|
|
|
rustc_attr!(
|
|
|
|
rustc_safe_intrinsic, Normal, template!(Word), WarnFollowing,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No,
|
2023-09-25 19:40:40 +00:00
|
|
|
"the `#[rustc_safe_intrinsic]` attribute is used internally to mark intrinsics as safe"
|
|
|
|
),
|
2024-01-30 16:03:58 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_intrinsic, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::Yes,
|
2024-01-30 16:03:58 +00:00
|
|
|
"the `#[rustc_intrinsic]` attribute is used to declare intrinsics with function bodies",
|
|
|
|
),
|
2024-02-14 21:08:03 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_no_mir_inline, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes,
|
2024-02-14 21:08:03 +00:00
|
|
|
"#[rustc_no_mir_inline] prevents the MIR inliner from inlining a function while not affecting codegen"
|
|
|
|
),
|
2024-02-19 17:35:12 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_intrinsic_must_be_overridden, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::Yes,
|
2024-02-19 17:35:12 +00:00
|
|
|
"the `#[rustc_intrinsic_must_be_overridden]` attribute is used to declare intrinsics without real bodies",
|
|
|
|
),
|
2019-08-22 16:32:31 +00:00
|
|
|
|
2019-08-22 21:30:59 +00:00
|
|
|
// ==========================================================================
|
|
|
|
// Internal attributes, Testing:
|
|
|
|
// ==========================================================================
|
2019-08-22 16:32:31 +00:00
|
|
|
|
2024-03-18 16:05:18 +00:00
|
|
|
rustc_attr!(TEST, rustc_effective_visibility, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes),
|
2024-03-05 07:46:49 +00:00
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_outlives, Normal, template!(Word),
|
2024-03-18 16:05:18 +00:00
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
2024-03-05 07:46:49 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_capture_analysis, Normal, template!(Word),
|
2024-03-18 16:05:18 +00:00
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_insignificant_dtor, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::Yes
|
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_strict_coherence, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::Yes
|
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_variance, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
2024-03-05 07:46:49 +00:00
|
|
|
),
|
2024-03-14 09:12:39 +00:00
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_variance_of_opaques, Normal, template!(Word),
|
2024-03-18 16:05:18 +00:00
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
2024-03-14 09:12:39 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_hidden_type_of_opaques, Normal, template!(Word),
|
2024-03-18 16:05:18 +00:00
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_layout, Normal, template!(List: "field1, field2, ..."),
|
|
|
|
WarnFollowing, EncodeCrossCrate::Yes
|
|
|
|
),
|
2024-03-14 09:12:39 +00:00
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_abi, Normal, template!(List: "field1, field2, ..."),
|
2024-03-18 16:05:18 +00:00
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
2024-03-14 09:12:39 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_regions, Normal, template!(Word),
|
2024-03-18 16:05:18 +00:00
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
2024-03-14 09:12:39 +00:00
|
|
|
),
|
2019-11-03 15:44:19 +00:00
|
|
|
rustc_attr!(
|
2021-07-29 17:00:41 +00:00
|
|
|
TEST, rustc_error, Normal,
|
2024-03-18 16:05:18 +00:00
|
|
|
template!(Word, List: "delayed_bug_from_inside_query"),
|
|
|
|
WarnFollowingWordOnly, EncodeCrossCrate::Yes
|
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_dump_user_args, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
2024-03-14 09:12:39 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
TEST, rustc_evaluate_where_clauses, Normal, template!(Word), WarnFollowing,
|
|
|
|
EncodeCrossCrate::Yes
|
2024-03-14 09:12:39 +00:00
|
|
|
),
|
2021-09-05 23:30:37 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
TEST, rustc_if_this_changed, Normal, template!(Word, List: "DepNode"), DuplicatesOk,
|
|
|
|
EncodeCrossCrate::No
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
TEST, rustc_then_this_would_need, Normal, template!(List: "DepNode"), DuplicatesOk,
|
|
|
|
EncodeCrossCrate::No
|
2019-11-03 15:44:19 +00:00
|
|
|
),
|
2019-08-22 17:37:04 +00:00
|
|
|
rustc_attr!(
|
2021-07-29 17:00:41 +00:00
|
|
|
TEST, rustc_clean, Normal,
|
2019-08-22 21:30:59 +00:00
|
|
|
template!(List: r#"cfg = "...", /*opt*/ label = "...", /*opt*/ except = "...""#),
|
2024-03-18 16:05:18 +00:00
|
|
|
DuplicatesOk, EncodeCrossCrate::No
|
2019-08-22 17:37:04 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
2021-07-29 17:00:41 +00:00
|
|
|
TEST, rustc_partition_reused, Normal,
|
2024-03-18 16:05:18 +00:00
|
|
|
template!(List: r#"cfg = "...", module = "...""#), DuplicatesOk, EncodeCrossCrate::No
|
2019-08-22 16:32:31 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
rustc_attr!(
|
2021-07-29 17:00:41 +00:00
|
|
|
TEST, rustc_partition_codegened, Normal,
|
2024-03-18 16:05:18 +00:00
|
|
|
template!(List: r#"cfg = "...", module = "...""#), DuplicatesOk, EncodeCrossCrate::No
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
2019-08-22 21:30:59 +00:00
|
|
|
rustc_attr!(
|
2021-07-29 17:00:41 +00:00
|
|
|
TEST, rustc_expected_cgu_reuse, Normal,
|
2021-09-05 23:30:37 +00:00
|
|
|
template!(List: r#"cfg = "...", module = "...", kind = "...""#), DuplicatesOk,
|
2024-03-18 16:05:18 +00:00
|
|
|
EncodeCrossCrate::No
|
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_symbol_name, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
2024-03-14 09:12:39 +00:00
|
|
|
),
|
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
TEST, rustc_polymorphize_error, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::Yes
|
2021-09-05 23:30:37 +00:00
|
|
|
),
|
2024-03-14 09:12:39 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
TEST, rustc_def_path, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_mir, Normal, template!(List: "arg1, arg2, ..."),
|
|
|
|
DuplicatesOk, EncodeCrossCrate::Yes
|
2024-03-14 09:12:39 +00:00
|
|
|
),
|
2022-08-03 11:30:13 +00:00
|
|
|
gated!(
|
|
|
|
custom_mir, Normal, template!(List: r#"dialect = "...", phase = "...""#),
|
2024-03-18 16:05:18 +00:00
|
|
|
ErrorFollowing, EncodeCrossCrate::No,
|
2024-03-14 09:12:39 +00:00
|
|
|
"the `#[custom_mir]` attribute is just used for the Rust test suite",
|
|
|
|
),
|
2024-06-19 12:24:25 +00:00
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_dump_item_bounds, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_dump_predicates, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
|
|
|
),
|
2024-03-14 09:12:39 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
TEST, rustc_object_lifetime_default, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::No
|
2022-08-03 11:30:13 +00:00
|
|
|
),
|
2024-03-14 09:12:39 +00:00
|
|
|
rustc_attr!(
|
2024-03-18 16:05:18 +00:00
|
|
|
TEST, rustc_dump_vtable, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::Yes
|
|
|
|
),
|
|
|
|
rustc_attr!(
|
|
|
|
TEST, rustc_dummy, Normal, template!(Word /* doesn't matter*/),
|
|
|
|
DuplicatesOk, EncodeCrossCrate::No
|
2024-03-14 09:12:39 +00:00
|
|
|
),
|
2019-08-22 18:40:50 +00:00
|
|
|
gated!(
|
2024-03-18 16:05:18 +00:00
|
|
|
omit_gdb_pretty_printer_section, Normal, template!(Word),
|
|
|
|
WarnFollowing, EncodeCrossCrate::No,
|
2019-08-22 21:30:59 +00:00
|
|
|
"the `#[omit_gdb_pretty_printer_section]` attribute is just used for the Rust test suite",
|
2019-08-22 18:40:50 +00:00
|
|
|
),
|
2024-03-02 21:48:41 +00:00
|
|
|
rustc_attr!(
|
|
|
|
TEST, pattern_complexity, CrateLevel, template!(NameValueStr: "N"),
|
2024-03-18 16:05:18 +00:00
|
|
|
ErrorFollowing, EncodeCrossCrate::No,
|
2024-03-02 21:48:41 +00:00
|
|
|
),
|
2019-08-22 16:32:31 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
pub fn deprecated_attributes() -> Vec<&'static BuiltinAttribute> {
|
2021-11-12 12:15:14 +00:00
|
|
|
BUILTIN_ATTRIBUTES.iter().filter(|attr| attr.gate.is_deprecated()).collect()
|
2019-08-22 16:32:31 +00:00
|
|
|
}
|
|
|
|
|
2019-11-30 01:20:07 +00:00
|
|
|
pub fn is_builtin_attr_name(name: Symbol) -> bool {
|
2019-08-22 16:32:31 +00:00
|
|
|
BUILTIN_ATTRIBUTE_MAP.get(&name).is_some()
|
|
|
|
}
|
|
|
|
|
2024-03-18 16:05:18 +00:00
|
|
|
/// Whether this builtin attribute is encoded cross crate.
|
|
|
|
/// This means it can be used cross crate.
|
|
|
|
pub fn encode_cross_crate(name: Symbol) -> bool {
|
|
|
|
if let Some(attr) = BUILTIN_ATTRIBUTE_MAP.get(&name) {
|
2024-04-07 15:59:11 +00:00
|
|
|
attr.encode_cross_crate == EncodeCrossCrate::Yes
|
2024-03-18 16:05:18 +00:00
|
|
|
} else {
|
|
|
|
true
|
|
|
|
}
|
2022-04-01 13:04:47 +00:00
|
|
|
}
|
|
|
|
|
2022-09-06 06:16:54 +00:00
|
|
|
pub fn is_valid_for_get_attr(name: Symbol) -> bool {
|
2023-05-24 14:19:22 +00:00
|
|
|
BUILTIN_ATTRIBUTE_MAP.get(&name).is_some_and(|attr| match attr.duplicates {
|
2022-09-06 06:16:54 +00:00
|
|
|
WarnFollowing | ErrorFollowing | ErrorPreceding | FutureWarnFollowing
|
|
|
|
| FutureWarnPreceding => true,
|
|
|
|
DuplicatesOk | WarnFollowingWordOnly => false,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2024-05-15 23:52:08 +00:00
|
|
|
pub fn is_unsafe_attr(name: Symbol) -> bool {
|
|
|
|
BUILTIN_ATTRIBUTE_MAP.get(&name).is_some_and(|attr| attr.safety == AttributeSafety::Unsafe)
|
|
|
|
}
|
|
|
|
|
2022-06-16 15:39:39 +00:00
|
|
|
pub static BUILTIN_ATTRIBUTE_MAP: LazyLock<FxHashMap<Symbol, &BuiltinAttribute>> =
|
|
|
|
LazyLock::new(|| {
|
2020-09-01 20:49:36 +00:00
|
|
|
let mut map = FxHashMap::default();
|
|
|
|
for attr in BUILTIN_ATTRIBUTES.iter() {
|
2021-11-12 12:15:14 +00:00
|
|
|
if map.insert(attr.name, attr).is_some() {
|
|
|
|
panic!("duplicate builtin attribute `{}`", attr.name);
|
2020-09-01 20:49:36 +00:00
|
|
|
}
|
2019-08-22 16:32:31 +00:00
|
|
|
}
|
2020-09-01 20:49:36 +00:00
|
|
|
map
|
|
|
|
});
|