refactor AttributeGate and rustc_attr! to emit notes during feature checking
This commit is contained in:
parent
52882f6522
commit
959d6de1a9
26 changed files with 274 additions and 195 deletions
|
|
@ -36,6 +36,16 @@ macro_rules! gate_alt {
|
|||
feature_err(&$visitor.sess, $name, $span, $explain).emit();
|
||||
}
|
||||
}};
|
||||
($visitor:expr, $has_feature:expr, $name:expr, $span:expr, $explain:expr, $notes: expr) => {{
|
||||
if !$has_feature && !$span.allows_unstable($name) {
|
||||
#[allow(rustc::untranslatable_diagnostic)] // FIXME: make this translatable
|
||||
let mut diag = feature_err(&$visitor.sess, $name, $span, $explain);
|
||||
for note in $notes {
|
||||
diag.note(*note);
|
||||
}
|
||||
diag.emit();
|
||||
}
|
||||
}};
|
||||
}
|
||||
|
||||
/// The case involving a multispan.
|
||||
|
|
@ -154,11 +164,11 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
|||
let attr_info = attr.ident().and_then(|ident| BUILTIN_ATTRIBUTE_MAP.get(&ident.name));
|
||||
// Check feature gates for built-in attributes.
|
||||
if let Some(BuiltinAttribute {
|
||||
gate: AttributeGate::Gated(_, name, descr, has_feature),
|
||||
gate: AttributeGate::Gated { feature, message, check, notes, .. },
|
||||
..
|
||||
}) = attr_info
|
||||
{
|
||||
gate_alt!(self, has_feature(self.features), *name, attr.span, *descr);
|
||||
gate_alt!(self, check(self.features), *feature, attr.span, *message, *notes);
|
||||
}
|
||||
// Check unstable flavors of the `#[doc]` attribute.
|
||||
if attr.has_name(sym::doc) {
|
||||
|
|
|
|||
|
|
@ -94,31 +94,27 @@ pub enum AttributeSafety {
|
|||
Unsafe { unsafe_since: Option<Edition> },
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
#[derive(Clone, Debug, Copy)]
|
||||
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),
|
||||
|
||||
/// A gated attribute which requires a feature gate to be enabled.
|
||||
Gated {
|
||||
stability: Stability,
|
||||
/// The feature gate, for example `#![feature(rustc_attrs)]` for rustc_* attributes.
|
||||
feature: Symbol,
|
||||
/// The error message displayed when an attempt is made to use the attribute without its feature gate.
|
||||
message: &'static str,
|
||||
/// Check function to be called during the `PostExpansionVisitor` pass.
|
||||
check: fn(&Features) -> bool,
|
||||
/// Notes to be displayed when an attempt is made to use the attribute without its feature gate.
|
||||
notes: &'static [&'static str],
|
||||
},
|
||||
/// 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 {
|
||||
Self::Gated(ref stab, name, expl, _) => {
|
||||
write!(fmt, "Gated({stab:?}, {name}, {expl})")
|
||||
}
|
||||
Self::Ungated => write!(fmt, "Ungated"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl AttributeGate {
|
||||
fn is_deprecated(&self) -> bool {
|
||||
matches!(*self, Self::Gated(Stability::Deprecated(_, _), ..))
|
||||
matches!(*self, Self::Gated { stability: Stability::Deprecated(_, _), .. })
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -247,7 +243,7 @@ macro_rules! ungated {
|
|||
}
|
||||
|
||||
macro_rules! gated {
|
||||
(unsafe $attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $gate:ident, $msg:expr $(,)?) => {
|
||||
(unsafe $attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $gate:ident, $message:expr $(,)?) => {
|
||||
BuiltinAttribute {
|
||||
name: sym::$attr,
|
||||
encode_cross_crate: $encode_cross_crate,
|
||||
|
|
@ -255,10 +251,16 @@ macro_rules! gated {
|
|||
safety: AttributeSafety::Unsafe { unsafe_since: None },
|
||||
template: $tpl,
|
||||
duplicates: $duplicates,
|
||||
gate: Gated(Stability::Unstable, sym::$gate, $msg, Features::$gate),
|
||||
gate: Gated {
|
||||
stability: Stability::Unstable,
|
||||
feature: sym::$gate,
|
||||
message: $message,
|
||||
check: Features::$gate,
|
||||
notes: &[],
|
||||
},
|
||||
}
|
||||
};
|
||||
(unsafe $attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $msg:expr $(,)?) => {
|
||||
(unsafe $attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $message:expr $(,)?) => {
|
||||
BuiltinAttribute {
|
||||
name: sym::$attr,
|
||||
encode_cross_crate: $encode_cross_crate,
|
||||
|
|
@ -266,10 +268,16 @@ macro_rules! gated {
|
|||
safety: AttributeSafety::Unsafe { unsafe_since: None },
|
||||
template: $tpl,
|
||||
duplicates: $duplicates,
|
||||
gate: Gated(Stability::Unstable, sym::$attr, $msg, Features::$attr),
|
||||
gate: Gated {
|
||||
stability: Stability::Unstable,
|
||||
feature: sym::$attr,
|
||||
message: $message,
|
||||
check: Features::$attr,
|
||||
notes: &[],
|
||||
},
|
||||
}
|
||||
};
|
||||
($attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $gate:ident, $msg:expr $(,)?) => {
|
||||
($attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $gate:ident, $message:expr $(,)?) => {
|
||||
BuiltinAttribute {
|
||||
name: sym::$attr,
|
||||
encode_cross_crate: $encode_cross_crate,
|
||||
|
|
@ -277,10 +285,16 @@ macro_rules! gated {
|
|||
safety: AttributeSafety::Normal,
|
||||
template: $tpl,
|
||||
duplicates: $duplicates,
|
||||
gate: Gated(Stability::Unstable, sym::$gate, $msg, Features::$gate),
|
||||
gate: Gated {
|
||||
stability: Stability::Unstable,
|
||||
feature: sym::$gate,
|
||||
message: $message,
|
||||
check: Features::$gate,
|
||||
notes: &[],
|
||||
},
|
||||
}
|
||||
};
|
||||
($attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $msg:expr $(,)?) => {
|
||||
($attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $message:expr $(,)?) => {
|
||||
BuiltinAttribute {
|
||||
name: sym::$attr,
|
||||
encode_cross_crate: $encode_cross_crate,
|
||||
|
|
@ -288,7 +302,13 @@ macro_rules! gated {
|
|||
safety: AttributeSafety::Normal,
|
||||
template: $tpl,
|
||||
duplicates: $duplicates,
|
||||
gate: Gated(Stability::Unstable, sym::$attr, $msg, Features::$attr),
|
||||
gate: Gated {
|
||||
stability: Stability::Unstable,
|
||||
feature: sym::$attr,
|
||||
message: $message,
|
||||
check: Features::$attr,
|
||||
notes: &[],
|
||||
},
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
@ -304,12 +324,11 @@ macro_rules! rustc_attr {
|
|||
concat!(
|
||||
"the `#[",
|
||||
stringify!($attr),
|
||||
"]` attribute is just used for rustc unit tests \
|
||||
and will never be stable",
|
||||
"]` attribute is used for rustc unit tests"
|
||||
),
|
||||
)
|
||||
};
|
||||
($attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $msg:expr $(,)?) => {
|
||||
($attr:ident, $typ:expr, $tpl:expr, $duplicates:expr, $encode_cross_crate:expr, $($notes:expr),* $(,)?) => {
|
||||
BuiltinAttribute {
|
||||
name: sym::$attr,
|
||||
encode_cross_crate: $encode_cross_crate,
|
||||
|
|
@ -317,7 +336,18 @@ macro_rules! rustc_attr {
|
|||
safety: AttributeSafety::Normal,
|
||||
template: $tpl,
|
||||
duplicates: $duplicates,
|
||||
gate: Gated(Stability::Unstable, sym::rustc_attrs, $msg, Features::rustc_attrs),
|
||||
gate: Gated {
|
||||
stability: Stability::Unstable,
|
||||
feature: sym::rustc_attrs,
|
||||
message: "use of an internal attribute",
|
||||
check: Features::rustc_attrs,
|
||||
notes: &[
|
||||
concat!("the `#[",
|
||||
stringify!($attr),
|
||||
"]` attribute is an internal implementation detail that will never be stable"),
|
||||
$($notes),*
|
||||
]
|
||||
},
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
@ -328,9 +358,6 @@ macro_rules! experimental {
|
|||
};
|
||||
}
|
||||
|
||||
const IMPL_DETAIL: &str = "internal implementation detail";
|
||||
const INTERNAL_UNSTABLE: &str = "this is an internal attribute that will never be stable";
|
||||
|
||||
#[derive(PartialEq)]
|
||||
pub enum EncodeCrossCrate {
|
||||
Yes,
|
||||
|
|
@ -668,7 +695,7 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
rustc_attr!(
|
||||
rustc_deprecated_safe_2024, Normal, template!(List: r#"audit_that = "...""#),
|
||||
ErrorFollowing, EncodeCrossCrate::Yes,
|
||||
"rustc_deprecated_safe_2024 is supposed to be used in libstd only",
|
||||
"`#[rustc_deprecated_safe_2024]` is used to declare functions unsafe across the edition 2024 boundary",
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_pub_transparent, Normal, template!(Word),
|
||||
|
|
@ -695,7 +722,7 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
ErrorFollowing,
|
||||
EncodeCrossCrate::No,
|
||||
"`rustc_never_type_options` is used to experiment with never type fallback and work on \
|
||||
never type stabilization, and will never be stable"
|
||||
never type stabilization"
|
||||
),
|
||||
|
||||
// ==========================================================================
|
||||
|
|
@ -704,23 +731,23 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
|
||||
rustc_attr!(
|
||||
rustc_allocator, Normal, template!(Word), WarnFollowing,
|
||||
EncodeCrossCrate::No, IMPL_DETAIL
|
||||
EncodeCrossCrate::No,
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_nounwind, Normal, template!(Word), WarnFollowing,
|
||||
EncodeCrossCrate::No, IMPL_DETAIL
|
||||
EncodeCrossCrate::No,
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_reallocator, Normal, template!(Word), WarnFollowing,
|
||||
EncodeCrossCrate::No, IMPL_DETAIL
|
||||
EncodeCrossCrate::No,
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_deallocator, Normal, template!(Word), WarnFollowing,
|
||||
EncodeCrossCrate::No, IMPL_DETAIL
|
||||
EncodeCrossCrate::No,
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_allocator_zeroed, Normal, template!(Word), WarnFollowing,
|
||||
EncodeCrossCrate::No, IMPL_DETAIL
|
||||
EncodeCrossCrate::No,
|
||||
),
|
||||
gated!(
|
||||
default_lib_allocator, Normal, template!(Word), WarnFollowing,
|
||||
|
|
@ -762,7 +789,7 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
),
|
||||
rustc_attr!(
|
||||
rustc_std_internal_symbol, Normal, template!(Word), WarnFollowing,
|
||||
EncodeCrossCrate::No, INTERNAL_UNSTABLE
|
||||
EncodeCrossCrate::No,
|
||||
),
|
||||
|
||||
// ==========================================================================
|
||||
|
|
@ -772,11 +799,11 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
rustc_attr!(
|
||||
rustc_builtin_macro, Normal,
|
||||
template!(Word, List: "name, /*opt*/ attributes(name1, name2, ...)"), ErrorFollowing,
|
||||
EncodeCrossCrate::Yes, IMPL_DETAIL
|
||||
EncodeCrossCrate::Yes,
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_proc_macro_decls, Normal, template!(Word), WarnFollowing,
|
||||
EncodeCrossCrate::No, INTERNAL_UNSTABLE
|
||||
EncodeCrossCrate::No,
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_macro_transparency, Normal,
|
||||
|
|
@ -786,7 +813,7 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
rustc_attr!(
|
||||
rustc_autodiff, Normal,
|
||||
template!(Word, List: r#""...""#), DuplicatesOk,
|
||||
EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
||||
EncodeCrossCrate::Yes,
|
||||
),
|
||||
// Traces that are left when `cfg` and `cfg_attr` attributes are expanded.
|
||||
// The attributes are not gated, to avoid stability errors, but they cannot be used in stable
|
||||
|
|
@ -812,54 +839,53 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
NameValueStr: "message"
|
||||
),
|
||||
ErrorFollowing, EncodeCrossCrate::Yes,
|
||||
INTERNAL_UNSTABLE
|
||||
"see `#[diagnostic::on_unimplemented]` for the stable equivalent of this attribute"
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_confusables, Normal,
|
||||
template!(List: r#""name1", "name2", ..."#),
|
||||
ErrorFollowing, EncodeCrossCrate::Yes,
|
||||
INTERNAL_UNSTABLE,
|
||||
),
|
||||
// Enumerates "identity-like" conversion methods to suggest on type mismatch.
|
||||
rustc_attr!(
|
||||
rustc_conversion_suggestion, Normal, template!(Word),
|
||||
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
||||
WarnFollowing, EncodeCrossCrate::Yes,
|
||||
),
|
||||
// Prevents field reads in the marked trait or method to be considered
|
||||
// during dead code analysis.
|
||||
rustc_attr!(
|
||||
rustc_trivial_field_reads, Normal, template!(Word),
|
||||
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
||||
WarnFollowing, EncodeCrossCrate::Yes,
|
||||
),
|
||||
// Used by the `rustc::potential_query_instability` lint to warn methods which
|
||||
// might not be stable during incremental compilation.
|
||||
rustc_attr!(
|
||||
rustc_lint_query_instability, Normal, template!(Word),
|
||||
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
||||
WarnFollowing, EncodeCrossCrate::Yes,
|
||||
),
|
||||
// Used by the `rustc::untracked_query_information` lint to warn methods which
|
||||
// might not be stable during incremental compilation.
|
||||
rustc_attr!(
|
||||
rustc_lint_untracked_query_information, Normal, template!(Word),
|
||||
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
||||
WarnFollowing, EncodeCrossCrate::Yes,
|
||||
),
|
||||
// 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.
|
||||
rustc_attr!(
|
||||
rustc_lint_diagnostics, Normal, template!(Word),
|
||||
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
||||
WarnFollowing, EncodeCrossCrate::Yes,
|
||||
),
|
||||
// Used by the `rustc::bad_opt_access` lint to identify `DebuggingOptions` and `CodegenOptions`
|
||||
// types (as well as any others in future).
|
||||
rustc_attr!(
|
||||
rustc_lint_opt_ty, Normal, template!(Word),
|
||||
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
||||
WarnFollowing, EncodeCrossCrate::Yes,
|
||||
),
|
||||
// Used by the `rustc::bad_opt_access` lint on fields
|
||||
// types (as well as any others in future).
|
||||
rustc_attr!(
|
||||
rustc_lint_opt_deny_field_access, Normal, template!(List: "message"),
|
||||
WarnFollowing, EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
||||
WarnFollowing, EncodeCrossCrate::Yes,
|
||||
),
|
||||
|
||||
// ==========================================================================
|
||||
|
|
@ -868,28 +894,30 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
|
||||
rustc_attr!(
|
||||
rustc_promotable, Normal, template!(Word), WarnFollowing,
|
||||
EncodeCrossCrate::No, IMPL_DETAIL),
|
||||
EncodeCrossCrate::No, ),
|
||||
rustc_attr!(
|
||||
rustc_legacy_const_generics, Normal, template!(List: "N"), ErrorFollowing,
|
||||
EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
||||
EncodeCrossCrate::Yes,
|
||||
),
|
||||
// Do not const-check this function's body. It will always get replaced during CTFE.
|
||||
rustc_attr!(
|
||||
rustc_do_not_const_check, Normal, template!(Word), WarnFollowing,
|
||||
EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
||||
EncodeCrossCrate::Yes, "`#[rustc_do_not_const_check]` skips const-check for this function's body",
|
||||
),
|
||||
// Ensure the argument to this function is &&str during const-check.
|
||||
rustc_attr!(
|
||||
rustc_const_panic_str, Normal, template!(Word), WarnFollowing,
|
||||
EncodeCrossCrate::Yes, INTERNAL_UNSTABLE
|
||||
EncodeCrossCrate::Yes, "`#[rustc_const_panic_str]` ensures the argument to this function is &&str during const-check",
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_const_stable_indirect, Normal,
|
||||
template!(Word), WarnFollowing, EncodeCrossCrate::No, IMPL_DETAIL,
|
||||
template!(Word),
|
||||
WarnFollowing,
|
||||
EncodeCrossCrate::No,
|
||||
"this is an internal implementation detail",
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_intrinsic_const_stable_indirect, Normal,
|
||||
template!(Word), WarnFollowing, EncodeCrossCrate::No, IMPL_DETAIL,
|
||||
template!(Word), WarnFollowing, EncodeCrossCrate::No, "this is an internal implementation detail",
|
||||
),
|
||||
gated!(
|
||||
rustc_allow_const_fn_unstable, Normal,
|
||||
|
|
@ -905,21 +933,21 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
rustc_layout_scalar_valid_range_start, Normal, template!(List: "value"), ErrorFollowing,
|
||||
EncodeCrossCrate::Yes,
|
||||
"the `#[rustc_layout_scalar_valid_range_start]` attribute is just used to enable \
|
||||
niche optimizations in libcore and libstd and will never be stable",
|
||||
niche optimizations in the standard library",
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_layout_scalar_valid_range_end, Normal, template!(List: "value"), ErrorFollowing,
|
||||
EncodeCrossCrate::Yes,
|
||||
"the `#[rustc_layout_scalar_valid_range_end]` attribute is just used to enable \
|
||||
niche optimizations in libcore and libstd and will never be stable",
|
||||
niche optimizations in the standard library",
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_nonnull_optimization_guaranteed, Normal, template!(Word), WarnFollowing,
|
||||
EncodeCrossCrate::Yes,
|
||||
"the `#[rustc_nonnull_optimization_guaranteed]` attribute is just used to document \
|
||||
guaranteed niche optimizations in libcore and libstd and will never be stable\n\
|
||||
(note that the compiler does not even check whether the type indeed is being non-null-optimized; \
|
||||
it is your responsibility to ensure that the attribute is only used on types that are optimized)",
|
||||
guaranteed niche optimizations in the standard library",
|
||||
"the compiler does not even check whether the type indeed is being non-null-optimized; \
|
||||
it is your responsibility to ensure that the attribute is only used on types that are optimized",
|
||||
),
|
||||
|
||||
// ==========================================================================
|
||||
|
|
@ -932,17 +960,17 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
rustc_attr!(
|
||||
rustc_as_ptr, Normal, template!(Word), ErrorFollowing,
|
||||
EncodeCrossCrate::Yes,
|
||||
"#[rustc_as_ptr] is used to mark functions returning pointers to their inner allocations."
|
||||
"`#[rustc_as_ptr]` is used to mark functions returning pointers to their inner allocations."
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_pass_by_value, Normal, template!(Word), ErrorFollowing,
|
||||
EncodeCrossCrate::Yes,
|
||||
"#[rustc_pass_by_value] is used to mark types that must be passed by value instead of reference."
|
||||
"`#[rustc_pass_by_value]` is used to mark types that must be passed by value instead of reference."
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_never_returns_null_ptr, Normal, template!(Word), ErrorFollowing,
|
||||
EncodeCrossCrate::Yes,
|
||||
"#[rustc_never_returns_null_ptr] is used to mark functions returning non-null pointers."
|
||||
"`#[rustc_never_returns_null_ptr]` is used to mark functions returning non-null pointers."
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_no_implicit_autorefs, AttributeType::Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::Yes,
|
||||
|
|
@ -950,15 +978,15 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
),
|
||||
rustc_attr!(
|
||||
rustc_coherence_is_core, AttributeType::CrateLevel, template!(Word), ErrorFollowing, EncodeCrossCrate::No,
|
||||
"#![rustc_coherence_is_core] allows inherent methods on builtin types, only intended to be used in `core`."
|
||||
"`#![rustc_coherence_is_core]` allows inherent methods on builtin types, only intended to be used in `core`."
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_coinductive, AttributeType::Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No,
|
||||
"#![rustc_coinductive] changes a trait to be coinductive, allowing cycles in the trait solver."
|
||||
"`#[rustc_coinductive]` changes a trait to be coinductive, allowing cycles in the trait solver."
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_allow_incoherent_impl, AttributeType::Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::No,
|
||||
"#[rustc_allow_incoherent_impl] has to be added to all impl items of an incoherent inherent impl."
|
||||
"`#[rustc_allow_incoherent_impl]` has to be added to all impl items of an incoherent inherent impl."
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_preserve_ub_checks, AttributeType::CrateLevel, template!(Word), ErrorFollowing, EncodeCrossCrate::No,
|
||||
|
|
@ -970,7 +998,7 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
template!(Word),
|
||||
ErrorFollowing,
|
||||
EncodeCrossCrate::No,
|
||||
"#[rustc_deny_explicit_impl] enforces that a trait can have no user-provided impls"
|
||||
"`#[rustc_deny_explicit_impl]` enforces that a trait can have no user-provided impls"
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_do_not_implement_via_object,
|
||||
|
|
@ -978,14 +1006,14 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
template!(Word),
|
||||
ErrorFollowing,
|
||||
EncodeCrossCrate::No,
|
||||
"#[rustc_do_not_implement_via_object] opts out of the automatic trait impl for trait objects \
|
||||
"`#[rustc_do_not_implement_via_object]` opts out of the automatic trait impl for trait objects \
|
||||
(`impl Trait for dyn Trait`)"
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_has_incoherent_inherent_impls, AttributeType::Normal, template!(Word),
|
||||
ErrorFollowing, EncodeCrossCrate::Yes,
|
||||
"#[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]."
|
||||
"`#[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]`."
|
||||
),
|
||||
|
||||
BuiltinAttribute {
|
||||
|
|
@ -996,12 +1024,14 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
safety: AttributeSafety::Normal,
|
||||
template: template!(NameValueStr: "name"),
|
||||
duplicates: ErrorFollowing,
|
||||
gate: Gated(
|
||||
Stability::Unstable,
|
||||
sym::rustc_attrs,
|
||||
"diagnostic items compiler internal support for linting",
|
||||
Features::rustc_attrs,
|
||||
),
|
||||
gate: Gated{
|
||||
stability: Stability::Unstable,
|
||||
feature: sym::rustc_attrs,
|
||||
message: "use of an internal attribute",
|
||||
check: Features::rustc_attrs,
|
||||
notes: &["the `#[rustc_diagnostic_item]` attribute allows the compiler to reference types \
|
||||
from the standard library for diagnostic purposes"],
|
||||
},
|
||||
},
|
||||
gated!(
|
||||
// Used in resolve:
|
||||
|
|
@ -1015,14 +1045,14 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
rustc_attr!(
|
||||
rustc_inherit_overflow_checks, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::No,
|
||||
"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",
|
||||
overflow checking behavior of several functions in the standard library that are inlined \
|
||||
across crates",
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_reservation_impl, Normal,
|
||||
template!(NameValueStr: "reservation message"), ErrorFollowing, EncodeCrossCrate::Yes,
|
||||
"the `#[rustc_reservation_impl]` attribute is internally used \
|
||||
for reserving for `for<T> From<!> for T` impl"
|
||||
for reserving `impl<T> From<!> for T` as part of the effort to stabilize `!`"
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_test_marker, Normal, template!(NameValueStr: "name"), WarnFollowing,
|
||||
|
|
@ -1053,12 +1083,13 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
rustc_must_implement_one_of, Normal, template!(List: "function1, function2, ..."),
|
||||
ErrorFollowing, EncodeCrossCrate::No,
|
||||
"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"
|
||||
definition of a trait. Its syntax and semantics are highly experimental and will be \
|
||||
subject to change before stabilization",
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_doc_primitive, Normal, template!(NameValueStr: "primitive name"), ErrorFollowing,
|
||||
EncodeCrossCrate::Yes, r#"`rustc_doc_primitive` is a rustc internal attribute"#,
|
||||
EncodeCrossCrate::Yes, "the `#[rustc_doc_primitive]` attribute is used by the standard library \
|
||||
to provide a way to generate documentation for primitive types",
|
||||
),
|
||||
gated!(
|
||||
rustc_intrinsic, Normal, template!(Word), ErrorFollowing, EncodeCrossCrate::Yes, intrinsics,
|
||||
|
|
@ -1066,11 +1097,11 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||
),
|
||||
rustc_attr!(
|
||||
rustc_no_mir_inline, Normal, template!(Word), WarnFollowing, EncodeCrossCrate::Yes,
|
||||
"#[rustc_no_mir_inline] prevents the MIR inliner from inlining a function while not affecting codegen"
|
||||
"`#[rustc_no_mir_inline]` prevents the MIR inliner from inlining a function while not affecting codegen"
|
||||
),
|
||||
rustc_attr!(
|
||||
rustc_force_inline, Normal, template!(Word, NameValueStr: "reason"), WarnFollowing, EncodeCrossCrate::Yes,
|
||||
"#[rustc_force_inline] forces a free function to be inlined"
|
||||
"`#[rustc_force_inline]` forces a free function to be inlined"
|
||||
),
|
||||
|
||||
// ==========================================================================
|
||||
|
|
|
|||
|
|
@ -72,8 +72,8 @@ lint_builtin_const_no_mangle = const items should never be `#[no_mangle]`
|
|||
lint_builtin_decl_unsafe_fn = declaration of an `unsafe` function
|
||||
lint_builtin_decl_unsafe_method = declaration of an `unsafe` method
|
||||
|
||||
lint_builtin_deprecated_attr_link = use of deprecated attribute `{$name}`: {$reason}. See {$link}
|
||||
.msg_suggestion = {$msg}
|
||||
lint_builtin_deprecated_attr_link = use of deprecated attribute `{$name}`: {$message}. See {$link}
|
||||
.msg_suggestion = {$suggestion}
|
||||
.default_suggestion = remove this attribute
|
||||
lint_builtin_deref_nullptr = dereferencing a null pointer
|
||||
.label = this code causes undefined behavior when executed
|
||||
|
|
|
|||
|
|
@ -818,25 +818,22 @@ impl EarlyLintPass for DeprecatedAttr {
|
|||
fn check_attribute(&mut self, cx: &EarlyContext<'_>, attr: &ast::Attribute) {
|
||||
for BuiltinAttribute { name, gate, .. } in &self.depr_attrs {
|
||||
if attr.ident().map(|ident| ident.name) == Some(*name) {
|
||||
if let &AttributeGate::Gated(
|
||||
Stability::Deprecated(link, suggestion),
|
||||
name,
|
||||
reason,
|
||||
_,
|
||||
) = gate
|
||||
if let &AttributeGate::Gated {
|
||||
stability: Stability::Deprecated(link, suggestion),
|
||||
message,
|
||||
..
|
||||
} = gate
|
||||
{
|
||||
let suggestion = match suggestion {
|
||||
Some(msg) => {
|
||||
BuiltinDeprecatedAttrLinkSuggestion::Msg { suggestion: attr.span, msg }
|
||||
}
|
||||
None => {
|
||||
BuiltinDeprecatedAttrLinkSuggestion::Default { suggestion: attr.span }
|
||||
Some(suggestion) => {
|
||||
BuiltinDeprecatedAttrLinkSuggestion::Msg { span: attr.span, suggestion }
|
||||
}
|
||||
None => BuiltinDeprecatedAttrLinkSuggestion::Default { span: attr.span },
|
||||
};
|
||||
cx.emit_span_lint(
|
||||
DEPRECATED,
|
||||
attr.span,
|
||||
BuiltinDeprecatedAttrLink { name, reason, link, suggestion },
|
||||
BuiltinDeprecatedAttrLink { name: *name, message, link, suggestion },
|
||||
);
|
||||
}
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -204,7 +204,7 @@ pub(crate) struct BuiltinAnonymousParams<'a> {
|
|||
#[diag(lint_builtin_deprecated_attr_link)]
|
||||
pub(crate) struct BuiltinDeprecatedAttrLink<'a> {
|
||||
pub name: Symbol,
|
||||
pub reason: &'a str,
|
||||
pub message: &'a str,
|
||||
pub link: &'a str,
|
||||
#[subdiagnostic]
|
||||
pub suggestion: BuiltinDeprecatedAttrLinkSuggestion<'a>,
|
||||
|
|
@ -215,13 +215,13 @@ pub(crate) enum BuiltinDeprecatedAttrLinkSuggestion<'a> {
|
|||
#[suggestion(lint_msg_suggestion, code = "", applicability = "machine-applicable")]
|
||||
Msg {
|
||||
#[primary_span]
|
||||
suggestion: Span,
|
||||
msg: &'a str,
|
||||
span: Span,
|
||||
suggestion: &'a str,
|
||||
},
|
||||
#[suggestion(lint_default_suggestion, code = "", applicability = "machine-applicable")]
|
||||
Default {
|
||||
#[primary_span]
|
||||
suggestion: Span,
|
||||
span: Span,
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ use rustc_feature::{GateIssue, UnstableFeatures, find_feature_issue};
|
|||
use rustc_span::edition::Edition;
|
||||
use rustc_span::hygiene::ExpnId;
|
||||
use rustc_span::source_map::{FilePathMapping, SourceMap};
|
||||
use rustc_span::{Span, Symbol};
|
||||
use rustc_span::{Span, Symbol, sym};
|
||||
|
||||
use crate::Session;
|
||||
use crate::config::{Cfg, CheckCfg};
|
||||
|
|
@ -192,8 +192,11 @@ pub fn add_feature_diagnostics_for_issue<G: EmissionGuarantee>(
|
|||
} else {
|
||||
err.subdiagnostic(FeatureDiagnosticHelp { feature });
|
||||
}
|
||||
|
||||
if sess.opts.unstable_opts.ui_testing {
|
||||
if feature == sym::rustc_attrs {
|
||||
// We're unlikely to stabilize something out of `rustc_attrs`
|
||||
// without at least renaming it, so pointing out how old
|
||||
// the compiler is will do little good.
|
||||
} else if sess.opts.unstable_opts.ui_testing {
|
||||
err.subdiagnostic(SuggestUpgradeCompiler::ui_testing());
|
||||
} else if let Some(suggestion) = SuggestUpgradeCompiler::new() {
|
||||
err.subdiagnostic(suggestion);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
#[rustc_do_not_const_check]
|
||||
//~^ ERROR this is an internal attribute that will never be stable
|
||||
//~^ ERROR use of an internal attribute [E0658]
|
||||
//~| NOTE the `#[rustc_do_not_const_check]` attribute is an internal implementation detail that will never be stable
|
||||
//~| NOTE `#[rustc_do_not_const_check]` skips const-check for this function's body
|
||||
const fn foo() {}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
error[E0658]: this is an internal attribute that will never be stable
|
||||
error[E0658]: use of an internal attribute
|
||||
--> $DIR/gate-do-not-const-check.rs:1:1
|
||||
|
|
||||
LL | #[rustc_do_not_const_check]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= note: the `#[rustc_do_not_const_check]` attribute is an internal implementation detail that will never be stable
|
||||
= note: `#[rustc_do_not_const_check]` skips const-check for this function's body
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
// check that `pattern_complexity_limit` is feature-gated
|
||||
|
||||
#![pattern_complexity_limit = "42"]
|
||||
//~^ ERROR: the `#[pattern_complexity_limit]` attribute is just used for rustc unit tests
|
||||
//~^ ERROR: use of an internal attribute [E0658]
|
||||
//~| NOTE the `#[pattern_complexity_limit]` attribute is an internal implementation detail that will never be stable
|
||||
//~| NOTE: the `#[pattern_complexity_limit]` attribute is used for rustc unit tests
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
error[E0658]: the `#[pattern_complexity_limit]` attribute is just used for rustc unit tests and will never be stable
|
||||
error[E0658]: use of an internal attribute
|
||||
--> $DIR/feature-gate-pattern-complexity-limit.rs:3:1
|
||||
|
|
||||
LL | #![pattern_complexity_limit = "42"]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= note: the `#[pattern_complexity_limit]` attribute is an internal implementation detail that will never be stable
|
||||
= note: the `#[pattern_complexity_limit]` attribute is used for rustc unit tests
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,12 @@
|
|||
// Test that `#[rustc_*]` attributes are gated by `rustc_attrs` feature gate.
|
||||
|
||||
#[rustc_variance] //~ ERROR the `#[rustc_variance]` attribute is just used for rustc unit tests and will never be stable
|
||||
#[rustc_nonnull_optimization_guaranteed] //~ ERROR the `#[rustc_nonnull_optimization_guaranteed]` attribute is just used to document guaranteed niche optimizations in libcore and libstd and will never be stable
|
||||
|
||||
#[rustc_variance]
|
||||
//~^ ERROR use of an internal attribute [E0658]
|
||||
//~| NOTE the `#[rustc_variance]` attribute is an internal implementation detail that will never be stable
|
||||
//~| NOTE the `#[rustc_variance]` attribute is used for rustc unit tests
|
||||
#[rustc_nonnull_optimization_guaranteed]
|
||||
//~^ ERROR use of an internal attribute [E0658]
|
||||
//~| NOTE the `#[rustc_nonnull_optimization_guaranteed]` attribute is an internal implementation detail that will never be stable
|
||||
//~| NOTE the `#[rustc_nonnull_optimization_guaranteed]` attribute is just used to document guaranteed niche optimizations in the standard library
|
||||
//~| NOTE the compiler does not even check whether the type indeed is being non-null-optimized; it is your responsibility to ensure that the attribute is only used on types that are optimized
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,21 +1,23 @@
|
|||
error[E0658]: the `#[rustc_variance]` attribute is just used for rustc unit tests and will never be stable
|
||||
error[E0658]: use of an internal attribute
|
||||
--> $DIR/feature-gate-rustc-attrs-1.rs:3:1
|
||||
|
|
||||
LL | #[rustc_variance]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= note: the `#[rustc_variance]` attribute is an internal implementation detail that will never be stable
|
||||
= note: the `#[rustc_variance]` attribute is used for rustc unit tests
|
||||
|
||||
error[E0658]: the `#[rustc_nonnull_optimization_guaranteed]` attribute is just used to document guaranteed niche optimizations in libcore and libstd and will never be stable
|
||||
(note that the compiler does not even check whether the type indeed is being non-null-optimized; it is your responsibility to ensure that the attribute is only used on types that are optimized)
|
||||
--> $DIR/feature-gate-rustc-attrs-1.rs:4:1
|
||||
error[E0658]: use of an internal attribute
|
||||
--> $DIR/feature-gate-rustc-attrs-1.rs:7:1
|
||||
|
|
||||
LL | #[rustc_nonnull_optimization_guaranteed]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= note: the `#[rustc_nonnull_optimization_guaranteed]` attribute is an internal implementation detail that will never be stable
|
||||
= note: the `#[rustc_nonnull_optimization_guaranteed]` attribute is just used to document guaranteed niche optimizations in the standard library
|
||||
= note: the compiler does not even check whether the type indeed is being non-null-optimized; it is your responsibility to ensure that the attribute is only used on types that are optimized
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -8,15 +8,19 @@ mod unknown { pub macro rustc() {} }
|
|||
#[rustc::unknown]
|
||||
//~^ ERROR attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||
//~| ERROR expected attribute, found macro `rustc::unknown`
|
||||
//~| NOTE not an attribute
|
||||
fn f() {}
|
||||
|
||||
#[unknown::rustc]
|
||||
//~^ ERROR attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||
//~| ERROR expected attribute, found macro `unknown::rustc`
|
||||
//~| NOTE not an attribute
|
||||
fn g() {}
|
||||
|
||||
#[rustc_dummy]
|
||||
//~^ ERROR the `#[rustc_dummy]` attribute is just used for rustc unit tests
|
||||
//~^ ERROR use of an internal attribute [E0658]
|
||||
//~| NOTE the `#[rustc_dummy]` attribute is an internal implementation detail that will never be stable
|
||||
//~| NOTE the `#[rustc_dummy]` attribute is used for rustc unit tests
|
||||
#[rustc_unknown]
|
||||
//~^ ERROR attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||
//~| ERROR cannot find attribute `rustc_unknown` in this scope
|
||||
|
|
|
|||
|
|
@ -11,37 +11,38 @@ LL | #[rustc::unknown]
|
|||
| ^^^^^^^^^^^^^^ not an attribute
|
||||
|
||||
error: attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||
--> $DIR/feature-gate-rustc-attrs.rs:13:12
|
||||
--> $DIR/feature-gate-rustc-attrs.rs:14:12
|
||||
|
|
||||
LL | #[unknown::rustc]
|
||||
| ^^^^^
|
||||
|
||||
error: expected attribute, found macro `unknown::rustc`
|
||||
--> $DIR/feature-gate-rustc-attrs.rs:13:3
|
||||
--> $DIR/feature-gate-rustc-attrs.rs:14:3
|
||||
|
|
||||
LL | #[unknown::rustc]
|
||||
| ^^^^^^^^^^^^^^ not an attribute
|
||||
|
||||
error: attributes starting with `rustc` are reserved for use by the `rustc` compiler
|
||||
--> $DIR/feature-gate-rustc-attrs.rs:20:3
|
||||
--> $DIR/feature-gate-rustc-attrs.rs:24:3
|
||||
|
|
||||
LL | #[rustc_unknown]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: cannot find attribute `rustc_unknown` in this scope
|
||||
--> $DIR/feature-gate-rustc-attrs.rs:20:3
|
||||
--> $DIR/feature-gate-rustc-attrs.rs:24:3
|
||||
|
|
||||
LL | #[rustc_unknown]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error[E0658]: the `#[rustc_dummy]` attribute is just used for rustc unit tests and will never be stable
|
||||
--> $DIR/feature-gate-rustc-attrs.rs:18:1
|
||||
error[E0658]: use of an internal attribute
|
||||
--> $DIR/feature-gate-rustc-attrs.rs:20:1
|
||||
|
|
||||
LL | #[rustc_dummy]
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= note: the `#[rustc_dummy]` attribute is an internal implementation detail that will never be stable
|
||||
= note: the `#[rustc_dummy]` attribute is used for rustc unit tests
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -11,9 +11,11 @@
|
|||
|
||||
#![macro_export]
|
||||
//~^ ERROR: `macro_export` attribute cannot be used at crate level
|
||||
#![rustc_main] //~ ERROR: the `#[rustc_main]` attribute is used internally to specify
|
||||
#![rustc_main]
|
||||
//~^ ERROR: `rustc_main` attribute cannot be used at crate level
|
||||
//~| NOTE: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
//~| ERROR: use of an internal attribute [E0658]
|
||||
//~| NOTE: the `#[rustc_main]` attribute is an internal implementation detail that will never be stable
|
||||
//~| NOTE: the `#[rustc_main]` attribute is used internally to specify test entry point function
|
||||
#![repr()]
|
||||
//~^ ERROR: `repr` attribute cannot be used at crate level
|
||||
#![path = "3800"]
|
||||
|
|
|
|||
|
|
@ -1,14 +1,15 @@
|
|||
error[E0658]: the `#[rustc_main]` attribute is used internally to specify test entry point function
|
||||
error[E0658]: use of an internal attribute
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:14:1
|
||||
|
|
||||
LL | #![rustc_main]
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= note: the `#[rustc_main]` attribute is an internal implementation detail that will never be stable
|
||||
= note: the `#[rustc_main]` attribute is used internally to specify test entry point function
|
||||
|
||||
error: valid forms for the attribute are `#[inline]` and `#[inline(always|never)]`
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:44:5
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:46:5
|
||||
|
|
||||
LL | #[inline = "2100"] fn f() { }
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
@ -18,7 +19,7 @@ LL | #[inline = "2100"] fn f() { }
|
|||
= note: `#[deny(ill_formed_attribute_input)]` on by default
|
||||
|
||||
error[E0518]: attribute should be applied to function or closure
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:30:1
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:32:1
|
||||
|
|
||||
LL | #[inline]
|
||||
| ^^^^^^^^^
|
||||
|
|
@ -29,7 +30,7 @@ LL | | }
|
|||
| |_- not a function or closure
|
||||
|
||||
error: attribute should be applied to an `extern crate` item
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:63:1
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:65:1
|
||||
|
|
||||
LL | #[no_link]
|
||||
| ^^^^^^^^^^
|
||||
|
|
@ -43,7 +44,7 @@ LL | | }
|
|||
| |_- not an `extern crate` item
|
||||
|
||||
error: attribute should be applied to a free function, impl method or static
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:89:1
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:91:1
|
||||
|
|
||||
LL | #[export_name = "2200"]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
@ -57,7 +58,7 @@ LL | | }
|
|||
| |_- not a free function, impl method or static
|
||||
|
||||
error[E0517]: attribute should be applied to a struct, enum, or union
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:123:8
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:125:8
|
||||
|
|
||||
LL | #[repr(C)]
|
||||
| ^
|
||||
|
|
@ -70,7 +71,7 @@ LL | | }
|
|||
| |_- not a struct, enum, or union
|
||||
|
||||
error[E0517]: attribute should be applied to a struct, enum, or union
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:147:8
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:149:8
|
||||
|
|
||||
LL | #[repr(Rust)]
|
||||
| ^^^^
|
||||
|
|
@ -83,19 +84,19 @@ LL | | }
|
|||
| |_- not a struct, enum, or union
|
||||
|
||||
error: attribute should be applied to an `extern crate` item
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:24:1
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:26:1
|
||||
|
|
||||
LL | #![no_link]
|
||||
| ^^^^^^^^^^^ not an `extern crate` item
|
||||
|
||||
error: attribute should be applied to a free function, impl method or static
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:26:1
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:28:1
|
||||
|
|
||||
LL | #![export_name = "2200"]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ not a free function, impl method or static
|
||||
|
||||
error[E0518]: attribute should be applied to function or closure
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:28:1
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:30:1
|
||||
|
|
||||
LL | #![inline]
|
||||
| ^^^^^^^^^^ not a function or closure
|
||||
|
|
@ -131,7 +132,7 @@ LL + #[rustc_main]
|
|||
|
|
||||
|
||||
error: `path` attribute cannot be used at crate level
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:19:1
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:21:1
|
||||
|
|
||||
LL | #![path = "3800"]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
@ -146,7 +147,7 @@ LL + #[path = "3800"]
|
|||
|
|
||||
|
||||
error: `automatically_derived` attribute cannot be used at crate level
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:21:1
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:23:1
|
||||
|
|
||||
LL | #![automatically_derived]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
@ -161,7 +162,7 @@ LL + #[automatically_derived]
|
|||
|
|
||||
|
||||
error: `repr` attribute cannot be used at crate level
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:17:1
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:19:1
|
||||
|
|
||||
LL | #![repr()]
|
||||
| ^^^^^^^^^^
|
||||
|
|
@ -176,139 +177,139 @@ LL + #[repr()]
|
|||
|
|
||||
|
||||
error[E0518]: attribute should be applied to function or closure
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:40:17
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:42:17
|
||||
|
|
||||
LL | mod inner { #![inline] }
|
||||
| ------------^^^^^^^^^^-- not a function or closure
|
||||
|
||||
error[E0518]: attribute should be applied to function or closure
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:50:5
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:52:5
|
||||
|
|
||||
LL | #[inline] struct S;
|
||||
| ^^^^^^^^^ --------- not a function or closure
|
||||
|
||||
error[E0518]: attribute should be applied to function or closure
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:54:5
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:56:5
|
||||
|
|
||||
LL | #[inline] type T = S;
|
||||
| ^^^^^^^^^ ----------- not a function or closure
|
||||
|
||||
error[E0518]: attribute should be applied to function or closure
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:58:5
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:60:5
|
||||
|
|
||||
LL | #[inline] impl S { }
|
||||
| ^^^^^^^^^ ---------- not a function or closure
|
||||
|
||||
error: attribute should be applied to an `extern crate` item
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:68:17
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:70:17
|
||||
|
|
||||
LL | mod inner { #![no_link] }
|
||||
| ------------^^^^^^^^^^^-- not an `extern crate` item
|
||||
|
||||
error: attribute should be applied to an `extern crate` item
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:72:5
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:74:5
|
||||
|
|
||||
LL | #[no_link] fn f() { }
|
||||
| ^^^^^^^^^^ ---------- not an `extern crate` item
|
||||
|
||||
error: attribute should be applied to an `extern crate` item
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:76:5
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:78:5
|
||||
|
|
||||
LL | #[no_link] struct S;
|
||||
| ^^^^^^^^^^ --------- not an `extern crate` item
|
||||
|
||||
error: attribute should be applied to an `extern crate` item
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:80:5
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:82:5
|
||||
|
|
||||
LL | #[no_link]type T = S;
|
||||
| ^^^^^^^^^^----------- not an `extern crate` item
|
||||
|
||||
error: attribute should be applied to an `extern crate` item
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:84:5
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:86:5
|
||||
|
|
||||
LL | #[no_link] impl S { }
|
||||
| ^^^^^^^^^^ ---------- not an `extern crate` item
|
||||
|
||||
error: attribute should be applied to a free function, impl method or static
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:94:17
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:96:17
|
||||
|
|
||||
LL | mod inner { #![export_name="2200"] }
|
||||
| ------------^^^^^^^^^^^^^^^^^^^^^^-- not a free function, impl method or static
|
||||
|
||||
error: attribute should be applied to a free function, impl method or static
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:100:5
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:102:5
|
||||
|
|
||||
LL | #[export_name = "2200"] struct S;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ --------- not a free function, impl method or static
|
||||
|
||||
error: attribute should be applied to a free function, impl method or static
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:104:5
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:106:5
|
||||
|
|
||||
LL | #[export_name = "2200"] type T = S;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ ----------- not a free function, impl method or static
|
||||
|
||||
error: attribute should be applied to a free function, impl method or static
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:108:5
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:110:5
|
||||
|
|
||||
LL | #[export_name = "2200"] impl S { }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ ---------- not a free function, impl method or static
|
||||
|
||||
error: attribute should be applied to a free function, impl method or static
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:113:9
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:115:9
|
||||
|
|
||||
LL | #[export_name = "2200"] fn foo();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ --------- not a free function, impl method or static
|
||||
|
||||
error: attribute should be applied to a free function, impl method or static
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:117:9
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:119:9
|
||||
|
|
||||
LL | #[export_name = "2200"] fn bar() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^ ----------- not a free function, impl method or static
|
||||
|
||||
error[E0517]: attribute should be applied to a struct, enum, or union
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:127:25
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:129:25
|
||||
|
|
||||
LL | mod inner { #![repr(C)] }
|
||||
| --------------------^---- not a struct, enum, or union
|
||||
|
||||
error[E0517]: attribute should be applied to a struct, enum, or union
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:131:12
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:133:12
|
||||
|
|
||||
LL | #[repr(C)] fn f() { }
|
||||
| ^ ---------- not a struct, enum, or union
|
||||
|
||||
error[E0517]: attribute should be applied to a struct, enum, or union
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:137:12
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:139:12
|
||||
|
|
||||
LL | #[repr(C)] type T = S;
|
||||
| ^ ----------- not a struct, enum, or union
|
||||
|
||||
error[E0517]: attribute should be applied to a struct, enum, or union
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:141:12
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:143:12
|
||||
|
|
||||
LL | #[repr(C)] impl S { }
|
||||
| ^ ---------- not a struct, enum, or union
|
||||
|
||||
error[E0517]: attribute should be applied to a struct, enum, or union
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:151:25
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:153:25
|
||||
|
|
||||
LL | mod inner { #![repr(Rust)] }
|
||||
| --------------------^^^^---- not a struct, enum, or union
|
||||
|
||||
error[E0517]: attribute should be applied to a struct, enum, or union
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:155:12
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:157:12
|
||||
|
|
||||
LL | #[repr(Rust)] fn f() { }
|
||||
| ^^^^ ---------- not a struct, enum, or union
|
||||
|
||||
error[E0517]: attribute should be applied to a struct, enum, or union
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:161:12
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:163:12
|
||||
|
|
||||
LL | #[repr(Rust)] type T = S;
|
||||
| ^^^^ ----------- not a struct, enum, or union
|
||||
|
||||
error[E0517]: attribute should be applied to a struct, enum, or union
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:165:12
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs-error.rs:167:12
|
||||
|
|
||||
LL | #[repr(Rust)] impl S { }
|
||||
| ^^^^ ---------- not a struct, enum, or union
|
||||
|
|
|
|||
|
|
@ -2,11 +2,15 @@
|
|||
#![allow(internal_features)]
|
||||
|
||||
#[rustc_force_inline]
|
||||
//~^ ERROR #[rustc_force_inline] forces a free function to be inlined
|
||||
//~^ ERROR use of an internal attribute [E0658]
|
||||
//~| NOTE the `#[rustc_force_inline]` attribute is an internal implementation detail that will never be stable
|
||||
//~| NOTE `#[rustc_force_inline]` forces a free function to be inlined
|
||||
pub fn bare() {
|
||||
}
|
||||
|
||||
#[rustc_force_inline = "the test requires it"]
|
||||
//~^ ERROR #[rustc_force_inline] forces a free function to be inlined
|
||||
//~^ ERROR use of an internal attribute [E0658]
|
||||
//~| NOTE the `#[rustc_force_inline]` attribute is an internal implementation detail that will never be stable
|
||||
//~| NOTE `#[rustc_force_inline]` forces a free function to be inlined
|
||||
pub fn justified() {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,20 +1,22 @@
|
|||
error[E0658]: #[rustc_force_inline] forces a free function to be inlined
|
||||
error[E0658]: use of an internal attribute
|
||||
--> $DIR/gate.rs:4:1
|
||||
|
|
||||
LL | #[rustc_force_inline]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= note: the `#[rustc_force_inline]` attribute is an internal implementation detail that will never be stable
|
||||
= note: `#[rustc_force_inline]` forces a free function to be inlined
|
||||
|
||||
error[E0658]: #[rustc_force_inline] forces a free function to be inlined
|
||||
--> $DIR/gate.rs:9:1
|
||||
error[E0658]: use of an internal attribute
|
||||
--> $DIR/gate.rs:11:1
|
||||
|
|
||||
LL | #[rustc_force_inline = "the test requires it"]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= note: the `#[rustc_force_inline]` attribute is an internal implementation detail that will never be stable
|
||||
= note: `#[rustc_force_inline]` forces a free function to be inlined
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
// Test that `#[rustc_on_unimplemented]` is gated by `rustc_attrs` feature gate.
|
||||
|
||||
#[rustc_on_unimplemented = "test error `{Self}` with `{Bar}`"]
|
||||
//~^ ERROR this is an internal attribute that will never be stable
|
||||
trait Foo<Bar>
|
||||
{}
|
||||
//~^ ERROR use of an internal attribute [E0658]
|
||||
//~| NOTE the `#[rustc_on_unimplemented]` attribute is an internal implementation detail that will never be stable
|
||||
//~| NOTE see `#[diagnostic::on_unimplemented]` for the stable equivalent of this attribute
|
||||
trait Foo<Bar> {}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
error[E0658]: this is an internal attribute that will never be stable
|
||||
error[E0658]: use of an internal attribute
|
||||
--> $DIR/feature-gate-on-unimplemented.rs:3:1
|
||||
|
|
||||
LL | #[rustc_on_unimplemented = "test error `{Self}` with `{Bar}`"]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= note: the `#[rustc_on_unimplemented]` attribute is an internal implementation detail that will never be stable
|
||||
= note: see `#[diagnostic::on_unimplemented]` for the stable equivalent of this attribute
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
#[rustc_doc_primitive = "usize"]
|
||||
//~^ ERROR `rustc_doc_primitive` is a rustc internal attribute
|
||||
//~^ ERROR use of an internal attribute [E0658]
|
||||
//~| NOTE the `#[rustc_doc_primitive]` attribute is an internal implementation detail that will never be stable
|
||||
//~| NOTE the `#[rustc_doc_primitive]` attribute is used by the standard library to provide a way to generate documentation for primitive types
|
||||
/// Some docs
|
||||
mod usize {}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
error[E0658]: `rustc_doc_primitive` is a rustc internal attribute
|
||||
error[E0658]: use of an internal attribute
|
||||
--> $DIR/feature-gate-doc_primitive.rs:1:1
|
||||
|
|
||||
LL | #[rustc_doc_primitive = "usize"]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= note: the `#[rustc_doc_primitive]` attribute is an internal implementation detail that will never be stable
|
||||
= note: the `#[rustc_doc_primitive]` attribute is used by the standard library to provide a way to generate documentation for primitive types
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
#[rustc_diagnostic_item = "foomp"] //~ ERROR compiler internal support for linting
|
||||
#[rustc_diagnostic_item = "foomp"]
|
||||
//~^ ERROR use of an internal attribute [E0658]
|
||||
//~| NOTE the `#[rustc_diagnostic_item]` attribute allows the compiler to reference types from the standard library for diagnostic purposes
|
||||
struct Foomp;
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
error[E0658]: diagnostic items compiler internal support for linting
|
||||
error[E0658]: use of an internal attribute
|
||||
--> $DIR/diagnostic_item.rs:1:1
|
||||
|
|
||||
LL | #[rustc_diagnostic_item = "foomp"]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= note: the `#[rustc_diagnostic_item]` attribute allows the compiler to reference types from the standard library for diagnostic purposes
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
#[rustc_must_implement_one_of(eq, neq)]
|
||||
//~^ ERROR 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
|
||||
//~^ ERROR use of an internal attribute [E0658]
|
||||
//~| NOTE the `#[rustc_must_implement_one_of]` attribute is an internal implementation detail that will never be stable
|
||||
//~| NOTE the `#[rustc_must_implement_one_of]` attribute is used to change minimal complete definition of a trait. Its syntax and semantics are highly experimental and will be subject to change before stabilization
|
||||
trait Equal {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
!self.neq(other)
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
error[E0658]: 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
|
||||
error[E0658]: use of an internal attribute
|
||||
--> $DIR/rustc_must_implement_one_of_gated.rs:1:1
|
||||
|
|
||||
LL | #[rustc_must_implement_one_of(eq, neq)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(rustc_attrs)]` to the crate attributes to enable
|
||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||
= note: the `#[rustc_must_implement_one_of]` attribute is an internal implementation detail that will never be stable
|
||||
= note: the `#[rustc_must_implement_one_of]` attribute is used to change minimal complete definition of a trait. Its syntax and semantics are highly experimental and will be subject to change before stabilization
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue