Remove edition umbrella features.

This commit is contained in:
Eric Huss 2023-12-10 09:34:13 -08:00
parent 7e452c123c
commit f481596ee4
49 changed files with 471 additions and 652 deletions

View File

@ -1,9 +1,11 @@
#### Note: this error code is no longer emitted by the compiler.
A `#![feature]` attribute was declared for a feature that is stable in the A `#![feature]` attribute was declared for a feature that is stable in the
current edition, but not in all editions. current edition, but not in all editions.
Erroneous code example: Erroneous code example:
```rust2018,compile_fail,E0705 ```compile_fail
#![feature(rust_2018_preview)] #![feature(rust_2018_preview)]
#![feature(test_2018_feature)] // error: the feature #![feature(test_2018_feature)] // error: the feature
// `test_2018_feature` is // `test_2018_feature` is

View File

@ -35,9 +35,6 @@ expand_explain_doc_comment_outer =
expand_expr_repeat_no_syntax_vars = expand_expr_repeat_no_syntax_vars =
attempted to repeat an expression containing no syntax variables matched as repeating at this depth attempted to repeat an expression containing no syntax variables matched as repeating at this depth
expand_feature_included_in_edition =
the feature `{$feature}` is included in the Rust {$edition} edition
expand_feature_not_allowed = expand_feature_not_allowed =
the feature `{$name}` is not in the list of allowed features the feature `{$name}` is not in the list of allowed features

View File

@ -1,8 +1,8 @@
//! Conditional compilation stripping. //! Conditional compilation stripping.
use crate::errors::{ use crate::errors::{
FeatureIncludedInEdition, FeatureNotAllowed, FeatureRemoved, FeatureRemovedReason, InvalidCfg, FeatureNotAllowed, FeatureRemoved, FeatureRemovedReason, InvalidCfg, MalformedFeatureAttribute,
MalformedFeatureAttribute, MalformedFeatureAttributeHelp, RemoveExprNotSupported, MalformedFeatureAttributeHelp, RemoveExprNotSupported,
}; };
use rustc_ast::ptr::P; use rustc_ast::ptr::P;
use rustc_ast::token::{Delimiter, Token, TokenKind}; use rustc_ast::token::{Delimiter, Token, TokenKind};
@ -13,13 +13,11 @@ use rustc_ast::NodeId;
use rustc_ast::{self as ast, AttrStyle, Attribute, HasAttrs, HasTokens, MetaItem}; use rustc_ast::{self as ast, AttrStyle, Attribute, HasAttrs, HasTokens, MetaItem};
use rustc_attr as attr; use rustc_attr as attr;
use rustc_data_structures::flat_map_in_place::FlatMapInPlace; use rustc_data_structures::flat_map_in_place::FlatMapInPlace;
use rustc_data_structures::fx::FxHashSet;
use rustc_feature::Features; use rustc_feature::Features;
use rustc_feature::{ACCEPTED_FEATURES, REMOVED_FEATURES, UNSTABLE_FEATURES}; use rustc_feature::{ACCEPTED_FEATURES, REMOVED_FEATURES, UNSTABLE_FEATURES};
use rustc_parse::validate_attr; use rustc_parse::validate_attr;
use rustc_session::parse::feature_err; use rustc_session::parse::feature_err;
use rustc_session::Session; use rustc_session::Session;
use rustc_span::edition::ALL_EDITIONS;
use rustc_span::symbol::{sym, Symbol}; use rustc_span::symbol::{sym, Symbol};
use rustc_span::Span; use rustc_span::Span;
use thin_vec::ThinVec; use thin_vec::ThinVec;
@ -48,42 +46,6 @@ pub fn features(sess: &Session, krate_attrs: &[Attribute], crate_name: Symbol) -
let mut features = Features::default(); let mut features = Features::default();
// The edition from `--edition`.
let crate_edition = sess.edition();
// The maximum of (a) the edition from `--edition` and (b) any edition
// umbrella feature-gates declared in the code.
// - E.g. if `crate_edition` is 2015 but `rust_2018_preview` is present,
// `feature_edition` is 2018
let mut features_edition = crate_edition;
for attr in krate_attrs {
for mi in feature_list(attr) {
if mi.is_word() {
let name = mi.name_or_empty();
let edition = ALL_EDITIONS.iter().find(|e| name == e.feature_name()).copied();
if let Some(edition) = edition
&& edition > features_edition
{
features_edition = edition;
}
}
}
}
// Enable edition-dependent features based on `features_edition`.
// - E.g. enable `test_2018_feature` if `features_edition` is 2018 or higher
let mut edition_enabled_features = FxHashSet::default();
for f in UNSTABLE_FEATURES {
if let Some(edition) = f.feature.edition
&& edition <= features_edition
{
// FIXME(Manishearth) there is currently no way to set lib features by
// edition.
edition_enabled_features.insert(f.feature.name);
(f.set_enabled)(&mut features);
}
}
// Process all features declared in the code. // Process all features declared in the code.
for attr in krate_attrs { for attr in krate_attrs {
for mi in feature_list(attr) { for mi in feature_list(attr) {
@ -108,38 +70,6 @@ pub fn features(sess: &Session, krate_attrs: &[Attribute], crate_name: Symbol) -
} }
}; };
// If the declared feature is an edition umbrella feature-gate,
// warn if it was redundant w.r.t. `crate_edition`.
// - E.g. warn if `rust_2018_preview` is declared when
// `crate_edition` is 2018
// - E.g. don't warn if `rust_2018_preview` is declared when
// `crate_edition` is 2015.
if let Some(&edition) = ALL_EDITIONS.iter().find(|e| name == e.feature_name()) {
if edition <= crate_edition {
sess.emit_warning(FeatureIncludedInEdition {
span: mi.span(),
feature: name,
edition,
});
}
features.set_declared_lang_feature(name, mi.span(), None);
continue;
}
// If the declared feature is edition-dependent and was already
// enabled due to `feature_edition`, give a warning.
// - E.g. warn if `test_2018_feature` is declared when
// `feature_edition` is 2018 or higher.
if edition_enabled_features.contains(&name) {
sess.emit_warning(FeatureIncludedInEdition {
span: mi.span(),
feature: name,
edition: features_edition,
});
features.set_declared_lang_feature(name, mi.span(), None);
continue;
}
// If the declared feature has been removed, issue an error. // If the declared feature has been removed, issue an error.
if let Some(f) = REMOVED_FEATURES.iter().find(|f| name == f.feature.name) { if let Some(f) = REMOVED_FEATURES.iter().find(|f| name == f.feature.name) {
sess.emit_err(FeatureRemoved { sess.emit_err(FeatureRemoved {

View File

@ -1,7 +1,6 @@
use rustc_ast::ast; use rustc_ast::ast;
use rustc_macros::Diagnostic; use rustc_macros::Diagnostic;
use rustc_session::Limit; use rustc_session::Limit;
use rustc_span::edition::Edition;
use rustc_span::symbol::{Ident, MacroRulesNormalizedIdent}; use rustc_span::symbol::{Ident, MacroRulesNormalizedIdent};
use rustc_span::{Span, Symbol}; use rustc_span::{Span, Symbol};
use std::borrow::Cow; use std::borrow::Cow;
@ -168,15 +167,6 @@ pub(crate) struct TakesNoArguments<'a> {
pub name: &'a str, pub name: &'a str,
} }
#[derive(Diagnostic)]
#[diag(expand_feature_included_in_edition, code = "E0705")]
pub(crate) struct FeatureIncludedInEdition {
#[primary_span]
pub span: Span,
pub feature: Symbol,
pub edition: Edition,
}
#[derive(Diagnostic)] #[derive(Diagnostic)]
#[diag(expand_feature_removed, code = "E0557")] #[diag(expand_feature_removed, code = "E0557")]
pub(crate) struct FeatureRemoved<'a> { pub(crate) struct FeatureRemoved<'a> {

View File

@ -5,7 +5,7 @@ use rustc_span::symbol::sym;
macro_rules! declare_features { macro_rules! declare_features {
($( ($(
$(#[doc = $doc:tt])* (accepted, $feature:ident, $ver:expr, $issue:expr, None), $(#[doc = $doc:tt])* (accepted, $feature:ident, $ver:expr, $issue:expr),
)+) => { )+) => {
/// Formerly unstable features that have now been accepted (stabilized). /// Formerly unstable features that have now been accepted (stabilized).
pub const ACCEPTED_FEATURES: &[Feature] = &[ pub const ACCEPTED_FEATURES: &[Feature] = &[
@ -13,7 +13,6 @@ macro_rules! declare_features {
name: sym::$feature, name: sym::$feature,
since: $ver, since: $ver,
issue: to_nonzero($issue), issue: to_nonzero($issue),
edition: None,
}),+ }),+
]; ];
} }
@ -27,10 +26,10 @@ declare_features! (
/// A temporary feature gate used to enable parser extensions needed /// A temporary feature gate used to enable parser extensions needed
/// to bootstrap fix for #5723. /// to bootstrap fix for #5723.
(accepted, issue_5723_bootstrap, "1.0.0", None, None), (accepted, issue_5723_bootstrap, "1.0.0", None),
/// These are used to test this portion of the compiler, /// These are used to test this portion of the compiler,
/// they don't actually mean anything. /// they don't actually mean anything.
(accepted, test_accepted_feature, "1.0.0", None, None), (accepted, test_accepted_feature, "1.0.0", None),
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!
// Features are listed in alphabetical order. Tidy will fail if you don't keep it this way. // Features are listed in alphabetical order. Tidy will fail if you don't keep it this way.
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!
@ -44,338 +43,338 @@ declare_features! (
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
/// Allows `#[target_feature(...)]` on aarch64 platforms /// Allows `#[target_feature(...)]` on aarch64 platforms
(accepted, aarch64_target_feature, "1.61.0", Some(44839), None), (accepted, aarch64_target_feature, "1.61.0", Some(44839)),
/// Allows using the `efiapi` ABI. /// Allows using the `efiapi` ABI.
(accepted, abi_efiapi, "1.68.0", Some(65815), None), (accepted, abi_efiapi, "1.68.0", Some(65815)),
/// Allows the sysV64 ABI to be specified on all platforms /// Allows the sysV64 ABI to be specified on all platforms
/// instead of just the platforms on which it is the C ABI. /// instead of just the platforms on which it is the C ABI.
(accepted, abi_sysv64, "1.24.0", Some(36167), None), (accepted, abi_sysv64, "1.24.0", Some(36167)),
/// Allows using the `thiscall` ABI. /// Allows using the `thiscall` ABI.
(accepted, abi_thiscall, "1.73.0", None, None), (accepted, abi_thiscall, "1.73.0", None),
/// Allows using ADX intrinsics from `core::arch::{x86, x86_64}`. /// Allows using ADX intrinsics from `core::arch::{x86, x86_64}`.
(accepted, adx_target_feature, "1.61.0", Some(44839), None), (accepted, adx_target_feature, "1.61.0", Some(44839)),
/// Allows explicit discriminants on non-unit enum variants. /// Allows explicit discriminants on non-unit enum variants.
(accepted, arbitrary_enum_discriminant, "1.66.0", Some(60553), None), (accepted, arbitrary_enum_discriminant, "1.66.0", Some(60553)),
/// Allows using `sym` operands in inline assembly. /// Allows using `sym` operands in inline assembly.
(accepted, asm_sym, "1.66.0", Some(93333), None), (accepted, asm_sym, "1.66.0", Some(93333)),
/// Allows the definition of associated constants in `trait` or `impl` blocks. /// Allows the definition of associated constants in `trait` or `impl` blocks.
(accepted, associated_consts, "1.20.0", Some(29646), None), (accepted, associated_consts, "1.20.0", Some(29646)),
/// Allows using associated `type`s in `trait`s. /// Allows using associated `type`s in `trait`s.
(accepted, associated_types, "1.0.0", None, None), (accepted, associated_types, "1.0.0", None),
/// Allows free and inherent `async fn`s, `async` blocks, and `<expr>.await` expressions. /// Allows free and inherent `async fn`s, `async` blocks, and `<expr>.await` expressions.
(accepted, async_await, "1.39.0", Some(50547), None), (accepted, async_await, "1.39.0", Some(50547)),
/// Allows async functions to be declared, implemented, and used in traits. /// Allows async functions to be declared, implemented, and used in traits.
(accepted, async_fn_in_trait, "1.75.0", Some(91611), None), (accepted, async_fn_in_trait, "1.75.0", Some(91611)),
/// Allows all literals in attribute lists and values of key-value pairs. /// Allows all literals in attribute lists and values of key-value pairs.
(accepted, attr_literals, "1.30.0", Some(34981), None), (accepted, attr_literals, "1.30.0", Some(34981)),
/// Allows overloading augmented assignment operations like `a += b`. /// Allows overloading augmented assignment operations like `a += b`.
(accepted, augmented_assignments, "1.8.0", Some(28235), None), (accepted, augmented_assignments, "1.8.0", Some(28235)),
/// Allows mixing bind-by-move in patterns and references to those identifiers in guards. /// Allows mixing bind-by-move in patterns and references to those identifiers in guards.
(accepted, bind_by_move_pattern_guards, "1.39.0", Some(15287), None), (accepted, bind_by_move_pattern_guards, "1.39.0", Some(15287)),
/// Allows bindings in the subpattern of a binding pattern. /// Allows bindings in the subpattern of a binding pattern.
/// For example, you can write `x @ Some(y)`. /// For example, you can write `x @ Some(y)`.
(accepted, bindings_after_at, "1.56.0", Some(65490), None), (accepted, bindings_after_at, "1.56.0", Some(65490)),
/// Allows empty structs and enum variants with braces. /// Allows empty structs and enum variants with braces.
(accepted, braced_empty_structs, "1.8.0", Some(29720), None), (accepted, braced_empty_structs, "1.8.0", Some(29720)),
/// Allows `c"foo"` literals. /// Allows `c"foo"` literals.
(accepted, c_str_literals, "CURRENT_RUSTC_VERSION", Some(105723), None), (accepted, c_str_literals, "CURRENT_RUSTC_VERSION", Some(105723)),
/// Allows `#[cfg_attr(predicate, multiple, attributes, here)]`. /// Allows `#[cfg_attr(predicate, multiple, attributes, here)]`.
(accepted, cfg_attr_multi, "1.33.0", Some(54881), None), (accepted, cfg_attr_multi, "1.33.0", Some(54881)),
/// Allows the use of `#[cfg(doctest)]`, set when rustdoc is collecting doctests. /// Allows the use of `#[cfg(doctest)]`, set when rustdoc is collecting doctests.
(accepted, cfg_doctest, "1.40.0", Some(62210), None), (accepted, cfg_doctest, "1.40.0", Some(62210)),
/// Enables `#[cfg(panic = "...")]` config key. /// Enables `#[cfg(panic = "...")]` config key.
(accepted, cfg_panic, "1.60.0", Some(77443), None), (accepted, cfg_panic, "1.60.0", Some(77443)),
/// Allows `cfg(target_feature = "...")`. /// Allows `cfg(target_feature = "...")`.
(accepted, cfg_target_feature, "1.27.0", Some(29717), None), (accepted, cfg_target_feature, "1.27.0", Some(29717)),
/// Allows `cfg(target_vendor = "...")`. /// Allows `cfg(target_vendor = "...")`.
(accepted, cfg_target_vendor, "1.33.0", Some(29718), None), (accepted, cfg_target_vendor, "1.33.0", Some(29718)),
/// Allows implementing `Clone` for closures where possible (RFC 2132). /// Allows implementing `Clone` for closures where possible (RFC 2132).
(accepted, clone_closures, "1.26.0", Some(44490), None), (accepted, clone_closures, "1.26.0", Some(44490)),
/// Allows coercing non capturing closures to function pointers. /// Allows coercing non capturing closures to function pointers.
(accepted, closure_to_fn_coercion, "1.19.0", Some(39817), None), (accepted, closure_to_fn_coercion, "1.19.0", Some(39817)),
/// Allows using the CMPXCHG16B target feature. /// Allows using the CMPXCHG16B target feature.
(accepted, cmpxchg16b_target_feature, "1.69.0", Some(44839), None), (accepted, cmpxchg16b_target_feature, "1.69.0", Some(44839)),
/// Allows usage of the `compile_error!` macro. /// Allows usage of the `compile_error!` macro.
(accepted, compile_error, "1.20.0", Some(40872), None), (accepted, compile_error, "1.20.0", Some(40872)),
/// Allows `impl Trait` in function return types. /// Allows `impl Trait` in function return types.
(accepted, conservative_impl_trait, "1.26.0", Some(34511), None), (accepted, conservative_impl_trait, "1.26.0", Some(34511)),
/// Allows calling constructor functions in `const fn`. /// Allows calling constructor functions in `const fn`.
(accepted, const_constructor, "1.40.0", Some(61456), None), (accepted, const_constructor, "1.40.0", Some(61456)),
/// Allows using and casting function pointers in a `const fn`. /// Allows using and casting function pointers in a `const fn`.
(accepted, const_fn_fn_ptr_basics, "1.61.0", Some(57563), None), (accepted, const_fn_fn_ptr_basics, "1.61.0", Some(57563)),
/// Allows trait bounds in `const fn`. /// Allows trait bounds in `const fn`.
(accepted, const_fn_trait_bound, "1.61.0", Some(93706), None), (accepted, const_fn_trait_bound, "1.61.0", Some(93706)),
/// Allows calling `transmute` in const fn /// Allows calling `transmute` in const fn
(accepted, const_fn_transmute, "1.56.0", Some(53605), None), (accepted, const_fn_transmute, "1.56.0", Some(53605)),
/// Allows accessing fields of unions inside `const` functions. /// Allows accessing fields of unions inside `const` functions.
(accepted, const_fn_union, "1.56.0", Some(51909), None), (accepted, const_fn_union, "1.56.0", Some(51909)),
/// Allows unsizing coercions in `const fn`. /// Allows unsizing coercions in `const fn`.
(accepted, const_fn_unsize, "1.54.0", Some(64992), None), (accepted, const_fn_unsize, "1.54.0", Some(64992)),
/// Allows const generics to have default values (e.g. `struct Foo<const N: usize = 3>(...);`). /// Allows const generics to have default values (e.g. `struct Foo<const N: usize = 3>(...);`).
(accepted, const_generics_defaults, "1.59.0", Some(44580), None), (accepted, const_generics_defaults, "1.59.0", Some(44580)),
/// Allows the use of `if` and `match` in constants. /// Allows the use of `if` and `match` in constants.
(accepted, const_if_match, "1.46.0", Some(49146), None), (accepted, const_if_match, "1.46.0", Some(49146)),
/// Allows argument and return position `impl Trait` in a `const fn`. /// Allows argument and return position `impl Trait` in a `const fn`.
(accepted, const_impl_trait, "1.61.0", Some(77463), None), (accepted, const_impl_trait, "1.61.0", Some(77463)),
/// Allows indexing into constant arrays. /// Allows indexing into constant arrays.
(accepted, const_indexing, "1.26.0", Some(29947), None), (accepted, const_indexing, "1.26.0", Some(29947)),
/// Allows let bindings, assignments and destructuring in `const` functions and constants. /// Allows let bindings, assignments and destructuring in `const` functions and constants.
/// As long as control flow is not implemented in const eval, `&&` and `||` may not be used /// As long as control flow is not implemented in const eval, `&&` and `||` may not be used
/// at the same time as let bindings. /// at the same time as let bindings.
(accepted, const_let, "1.33.0", Some(48821), None), (accepted, const_let, "1.33.0", Some(48821)),
/// Allows the use of `loop` and `while` in constants. /// Allows the use of `loop` and `while` in constants.
(accepted, const_loop, "1.46.0", Some(52000), None), (accepted, const_loop, "1.46.0", Some(52000)),
/// Allows panicking during const eval (producing compile-time errors). /// Allows panicking during const eval (producing compile-time errors).
(accepted, const_panic, "1.57.0", Some(51999), None), (accepted, const_panic, "1.57.0", Some(51999)),
/// Allows dereferencing raw pointers during const eval. /// Allows dereferencing raw pointers during const eval.
(accepted, const_raw_ptr_deref, "1.58.0", Some(51911), None), (accepted, const_raw_ptr_deref, "1.58.0", Some(51911)),
/// Allows implementing `Copy` for closures where possible (RFC 2132). /// Allows implementing `Copy` for closures where possible (RFC 2132).
(accepted, copy_closures, "1.26.0", Some(44490), None), (accepted, copy_closures, "1.26.0", Some(44490)),
/// Allows `crate` in paths. /// Allows `crate` in paths.
(accepted, crate_in_paths, "1.30.0", Some(45477), None), (accepted, crate_in_paths, "1.30.0", Some(45477)),
/// Allows using `#[debugger_visualizer]` attribute. /// Allows using `#[debugger_visualizer]` attribute.
(accepted, debugger_visualizer, "1.71.0", Some(95939), None), (accepted, debugger_visualizer, "1.71.0", Some(95939)),
/// Allows rustc to inject a default alloc_error_handler /// Allows rustc to inject a default alloc_error_handler
(accepted, default_alloc_error_handler, "1.68.0", Some(66741), None), (accepted, default_alloc_error_handler, "1.68.0", Some(66741)),
/// Allows using assigning a default type to type parameters in algebraic data type definitions. /// Allows using assigning a default type to type parameters in algebraic data type definitions.
(accepted, default_type_params, "1.0.0", None, None), (accepted, default_type_params, "1.0.0", None),
/// Allows `#[deprecated]` attribute. /// Allows `#[deprecated]` attribute.
(accepted, deprecated, "1.9.0", Some(29935), None), (accepted, deprecated, "1.9.0", Some(29935)),
/// Allows `#[derive(Default)]` and `#[default]` on enums. /// Allows `#[derive(Default)]` and `#[default]` on enums.
(accepted, derive_default_enum, "1.62.0", Some(86985), None), (accepted, derive_default_enum, "1.62.0", Some(86985)),
/// Allows the use of destructuring assignments. /// Allows the use of destructuring assignments.
(accepted, destructuring_assignment, "1.59.0", Some(71126), None), (accepted, destructuring_assignment, "1.59.0", Some(71126)),
/// Allows `#[doc(alias = "...")]`. /// Allows `#[doc(alias = "...")]`.
(accepted, doc_alias, "1.48.0", Some(50146), None), (accepted, doc_alias, "1.48.0", Some(50146)),
/// Allows `..` in tuple (struct) patterns. /// Allows `..` in tuple (struct) patterns.
(accepted, dotdot_in_tuple_patterns, "1.14.0", Some(33627), None), (accepted, dotdot_in_tuple_patterns, "1.14.0", Some(33627)),
/// Allows `..=` in patterns (RFC 1192). /// Allows `..=` in patterns (RFC 1192).
(accepted, dotdoteq_in_patterns, "1.26.0", Some(28237), None), (accepted, dotdoteq_in_patterns, "1.26.0", Some(28237)),
/// Allows `Drop` types in constants (RFC 1440). /// Allows `Drop` types in constants (RFC 1440).
(accepted, drop_types_in_const, "1.22.0", Some(33156), None), (accepted, drop_types_in_const, "1.22.0", Some(33156)),
/// Allows using `dyn Trait` as a syntax for trait objects. /// Allows using `dyn Trait` as a syntax for trait objects.
(accepted, dyn_trait, "1.27.0", Some(44662), None), (accepted, dyn_trait, "1.27.0", Some(44662)),
/// Allows integer match exhaustiveness checking (RFC 2591). /// Allows integer match exhaustiveness checking (RFC 2591).
(accepted, exhaustive_integer_patterns, "1.33.0", Some(50907), None), (accepted, exhaustive_integer_patterns, "1.33.0", Some(50907)),
/// Allows explicit generic arguments specification with `impl Trait` present. /// Allows explicit generic arguments specification with `impl Trait` present.
(accepted, explicit_generic_args_with_impl_trait, "1.63.0", Some(83701), None), (accepted, explicit_generic_args_with_impl_trait, "1.63.0", Some(83701)),
/// Allows arbitrary expressions in key-value attributes at parse time. /// Allows arbitrary expressions in key-value attributes at parse time.
(accepted, extended_key_value_attributes, "1.54.0", Some(78835), None), (accepted, extended_key_value_attributes, "1.54.0", Some(78835)),
/// Allows resolving absolute paths as paths from other crates. /// Allows resolving absolute paths as paths from other crates.
(accepted, extern_absolute_paths, "1.30.0", Some(44660), None), (accepted, extern_absolute_paths, "1.30.0", Some(44660)),
/// Allows `extern crate foo as bar;`. This puts `bar` into extern prelude. /// Allows `extern crate foo as bar;`. This puts `bar` into extern prelude.
(accepted, extern_crate_item_prelude, "1.31.0", Some(55599), None), (accepted, extern_crate_item_prelude, "1.31.0", Some(55599)),
/// Allows `extern crate self as foo;`. /// Allows `extern crate self as foo;`.
/// This puts local crate root into extern prelude under name `foo`. /// This puts local crate root into extern prelude under name `foo`.
(accepted, extern_crate_self, "1.34.0", Some(56409), None), (accepted, extern_crate_self, "1.34.0", Some(56409)),
/// Allows access to crate names passed via `--extern` through prelude. /// Allows access to crate names passed via `--extern` through prelude.
(accepted, extern_prelude, "1.30.0", Some(44660), None), (accepted, extern_prelude, "1.30.0", Some(44660)),
/// Allows using F16C intrinsics from `core::arch::{x86, x86_64}`. /// Allows using F16C intrinsics from `core::arch::{x86, x86_64}`.
(accepted, f16c_target_feature, "1.68.0", Some(44839), None), (accepted, f16c_target_feature, "1.68.0", Some(44839)),
/// Allows field shorthands (`x` meaning `x: x`) in struct literal expressions. /// Allows field shorthands (`x` meaning `x: x`) in struct literal expressions.
(accepted, field_init_shorthand, "1.17.0", Some(37340), None), (accepted, field_init_shorthand, "1.17.0", Some(37340)),
/// Allows `#[must_use]` on functions, and introduces must-use operators (RFC 1940). /// Allows `#[must_use]` on functions, and introduces must-use operators (RFC 1940).
(accepted, fn_must_use, "1.27.0", Some(43302), None), (accepted, fn_must_use, "1.27.0", Some(43302)),
/// Allows capturing variables in scope using format_args! /// Allows capturing variables in scope using format_args!
(accepted, format_args_capture, "1.58.0", Some(67984), None), (accepted, format_args_capture, "1.58.0", Some(67984)),
/// Allows associated types to be generic, e.g., `type Foo<T>;` (RFC 1598). /// Allows associated types to be generic, e.g., `type Foo<T>;` (RFC 1598).
(accepted, generic_associated_types, "1.65.0", Some(44265), None), (accepted, generic_associated_types, "1.65.0", Some(44265)),
/// Allows attributes on lifetime/type formal parameters in generics (RFC 1327). /// Allows attributes on lifetime/type formal parameters in generics (RFC 1327).
(accepted, generic_param_attrs, "1.27.0", Some(48848), None), (accepted, generic_param_attrs, "1.27.0", Some(48848)),
/// Allows the `#[global_allocator]` attribute. /// Allows the `#[global_allocator]` attribute.
(accepted, global_allocator, "1.28.0", Some(27389), None), (accepted, global_allocator, "1.28.0", Some(27389)),
// FIXME: explain `globs`. // FIXME: explain `globs`.
(accepted, globs, "1.0.0", None, None), (accepted, globs, "1.0.0", None),
/// Allows using `..=X` as a pattern. /// Allows using `..=X` as a pattern.
(accepted, half_open_range_patterns, "1.66.0", Some(67264), None), (accepted, half_open_range_patterns, "1.66.0", Some(67264)),
/// Allows using the `u128` and `i128` types. /// Allows using the `u128` and `i128` types.
(accepted, i128_type, "1.26.0", Some(35118), None), (accepted, i128_type, "1.26.0", Some(35118)),
/// Allows the use of `if let` expressions. /// Allows the use of `if let` expressions.
(accepted, if_let, "1.0.0", None, None), (accepted, if_let, "1.0.0", None),
/// Allows top level or-patterns (`p | q`) in `if let` and `while let`. /// Allows top level or-patterns (`p | q`) in `if let` and `while let`.
(accepted, if_while_or_patterns, "1.33.0", Some(48215), None), (accepted, if_while_or_patterns, "1.33.0", Some(48215)),
/// Allows lifetime elision in `impl` headers. For example: /// Allows lifetime elision in `impl` headers. For example:
/// + `impl<I:Iterator> Iterator for &mut Iterator` /// + `impl<I:Iterator> Iterator for &mut Iterator`
/// + `impl Debug for Foo<'_>` /// + `impl Debug for Foo<'_>`
(accepted, impl_header_lifetime_elision, "1.31.0", Some(15872), None), (accepted, impl_header_lifetime_elision, "1.31.0", Some(15872)),
/// Allows referencing `Self` and projections in impl-trait. /// Allows referencing `Self` and projections in impl-trait.
(accepted, impl_trait_projections, "1.74.0", Some(103532), None), (accepted, impl_trait_projections, "1.74.0", Some(103532)),
/// Allows using `a..=b` and `..=b` as inclusive range syntaxes. /// Allows using `a..=b` and `..=b` as inclusive range syntaxes.
(accepted, inclusive_range_syntax, "1.26.0", Some(28237), None), (accepted, inclusive_range_syntax, "1.26.0", Some(28237)),
/// Allows inferring outlives requirements (RFC 2093). /// Allows inferring outlives requirements (RFC 2093).
(accepted, infer_outlives_requirements, "1.30.0", Some(44493), None), (accepted, infer_outlives_requirements, "1.30.0", Some(44493)),
/// Allows irrefutable patterns in `if let` and `while let` statements (RFC 2086). /// Allows irrefutable patterns in `if let` and `while let` statements (RFC 2086).
(accepted, irrefutable_let_patterns, "1.33.0", Some(44495), None), (accepted, irrefutable_let_patterns, "1.33.0", Some(44495)),
/// Allows `#[instruction_set(_)]` attribute. /// Allows `#[instruction_set(_)]` attribute.
(accepted, isa_attribute, "1.67.0", Some(74727), None), (accepted, isa_attribute, "1.67.0", Some(74727)),
/// Allows some increased flexibility in the name resolution rules, /// Allows some increased flexibility in the name resolution rules,
/// especially around globs and shadowing (RFC 1560). /// especially around globs and shadowing (RFC 1560).
(accepted, item_like_imports, "1.15.0", Some(35120), None), (accepted, item_like_imports, "1.15.0", Some(35120)),
/// Allows `'a: { break 'a; }`. /// Allows `'a: { break 'a; }`.
(accepted, label_break_value, "1.65.0", Some(48594), None), (accepted, label_break_value, "1.65.0", Some(48594)),
/// Allows `let...else` statements. /// Allows `let...else` statements.
(accepted, let_else, "1.65.0", Some(87335), None), (accepted, let_else, "1.65.0", Some(87335)),
/// Allows `break {expr}` with a value inside `loop`s. /// Allows `break {expr}` with a value inside `loop`s.
(accepted, loop_break_value, "1.19.0", Some(37339), None), (accepted, loop_break_value, "1.19.0", Some(37339)),
/// Allows use of `?` as the Kleene "at most one" operator in macros. /// Allows use of `?` as the Kleene "at most one" operator in macros.
(accepted, macro_at_most_once_rep, "1.32.0", Some(48075), None), (accepted, macro_at_most_once_rep, "1.32.0", Some(48075)),
/// Allows macro attributes to observe output of `#[derive]`. /// Allows macro attributes to observe output of `#[derive]`.
(accepted, macro_attributes_in_derive_output, "1.57.0", Some(81119), None), (accepted, macro_attributes_in_derive_output, "1.57.0", Some(81119)),
/// Allows use of the `:lifetime` macro fragment specifier. /// Allows use of the `:lifetime` macro fragment specifier.
(accepted, macro_lifetime_matcher, "1.27.0", Some(34303), None), (accepted, macro_lifetime_matcher, "1.27.0", Some(34303)),
/// Allows use of the `:literal` macro fragment specifier (RFC 1576). /// Allows use of the `:literal` macro fragment specifier (RFC 1576).
(accepted, macro_literal_matcher, "1.32.0", Some(35625), None), (accepted, macro_literal_matcher, "1.32.0", Some(35625)),
/// Allows `macro_rules!` items. /// Allows `macro_rules!` items.
(accepted, macro_rules, "1.0.0", None, None), (accepted, macro_rules, "1.0.0", None),
/// Allows use of the `:vis` macro fragment specifier /// Allows use of the `:vis` macro fragment specifier
(accepted, macro_vis_matcher, "1.30.0", Some(41022), None), (accepted, macro_vis_matcher, "1.30.0", Some(41022)),
/// Allows macro invocations in `extern {}` blocks. /// Allows macro invocations in `extern {}` blocks.
(accepted, macros_in_extern, "1.40.0", Some(49476), None), (accepted, macros_in_extern, "1.40.0", Some(49476)),
/// Allows '|' at beginning of match arms (RFC 1925). /// Allows '|' at beginning of match arms (RFC 1925).
(accepted, match_beginning_vert, "1.25.0", Some(44101), None), (accepted, match_beginning_vert, "1.25.0", Some(44101)),
/// Allows default match binding modes (RFC 2005). /// Allows default match binding modes (RFC 2005).
(accepted, match_default_bindings, "1.26.0", Some(42640), None), (accepted, match_default_bindings, "1.26.0", Some(42640)),
/// Allows `impl Trait` with multiple unrelated lifetimes. /// Allows `impl Trait` with multiple unrelated lifetimes.
(accepted, member_constraints, "1.54.0", Some(61997), None), (accepted, member_constraints, "1.54.0", Some(61997)),
/// Allows the definition of `const fn` functions. /// Allows the definition of `const fn` functions.
(accepted, min_const_fn, "1.31.0", Some(53555), None), (accepted, min_const_fn, "1.31.0", Some(53555)),
/// The smallest useful subset of const generics. /// The smallest useful subset of const generics.
(accepted, min_const_generics, "1.51.0", Some(74878), None), (accepted, min_const_generics, "1.51.0", Some(74878)),
/// Allows calling `const unsafe fn` inside `unsafe` blocks in `const fn` functions. /// Allows calling `const unsafe fn` inside `unsafe` blocks in `const fn` functions.
(accepted, min_const_unsafe_fn, "1.33.0", Some(55607), None), (accepted, min_const_unsafe_fn, "1.33.0", Some(55607)),
/// Allows using `Self` and associated types in struct expressions and patterns. /// Allows using `Self` and associated types in struct expressions and patterns.
(accepted, more_struct_aliases, "1.16.0", Some(37544), None), (accepted, more_struct_aliases, "1.16.0", Some(37544)),
/// Allows using the MOVBE target feature. /// Allows using the MOVBE target feature.
(accepted, movbe_target_feature, "1.70.0", Some(44839), None), (accepted, movbe_target_feature, "1.70.0", Some(44839)),
/// Allows patterns with concurrent by-move and by-ref bindings. /// Allows patterns with concurrent by-move and by-ref bindings.
/// For example, you can write `Foo(a, ref b)` where `a` is by-move and `b` is by-ref. /// For example, you can write `Foo(a, ref b)` where `a` is by-move and `b` is by-ref.
(accepted, move_ref_pattern, "1.49.0", Some(68354), None), (accepted, move_ref_pattern, "1.49.0", Some(68354)),
/// Allows specifying modifiers in the link attribute: `#[link(modifiers = "...")]` /// Allows specifying modifiers in the link attribute: `#[link(modifiers = "...")]`
(accepted, native_link_modifiers, "1.61.0", Some(81490), None), (accepted, native_link_modifiers, "1.61.0", Some(81490)),
/// Allows specifying the bundle link modifier /// Allows specifying the bundle link modifier
(accepted, native_link_modifiers_bundle, "1.63.0", Some(81490), None), (accepted, native_link_modifiers_bundle, "1.63.0", Some(81490)),
/// Allows specifying the verbatim link modifier /// Allows specifying the verbatim link modifier
(accepted, native_link_modifiers_verbatim, "1.67.0", Some(81490), None), (accepted, native_link_modifiers_verbatim, "1.67.0", Some(81490)),
/// Allows specifying the whole-archive link modifier /// Allows specifying the whole-archive link modifier
(accepted, native_link_modifiers_whole_archive, "1.61.0", Some(81490), None), (accepted, native_link_modifiers_whole_archive, "1.61.0", Some(81490)),
/// Allows using non lexical lifetimes (RFC 2094). /// Allows using non lexical lifetimes (RFC 2094).
(accepted, nll, "1.63.0", Some(43234), None), (accepted, nll, "1.63.0", Some(43234)),
/// Allows using `#![no_std]`. /// Allows using `#![no_std]`.
(accepted, no_std, "1.6.0", None, None), (accepted, no_std, "1.6.0", None),
/// Allows defining identifiers beyond ASCII. /// Allows defining identifiers beyond ASCII.
(accepted, non_ascii_idents, "1.53.0", Some(55467), None), (accepted, non_ascii_idents, "1.53.0", Some(55467)),
/// Allows future-proofing enums/structs with the `#[non_exhaustive]` attribute (RFC 2008). /// Allows future-proofing enums/structs with the `#[non_exhaustive]` attribute (RFC 2008).
(accepted, non_exhaustive, "1.40.0", Some(44109), None), (accepted, non_exhaustive, "1.40.0", Some(44109)),
/// Allows `foo.rs` as an alternative to `foo/mod.rs`. /// Allows `foo.rs` as an alternative to `foo/mod.rs`.
(accepted, non_modrs_mods, "1.30.0", Some(44660), None), (accepted, non_modrs_mods, "1.30.0", Some(44660)),
/// Allows the use of or-patterns (e.g., `0 | 1`). /// Allows the use of or-patterns (e.g., `0 | 1`).
(accepted, or_patterns, "1.53.0", Some(54883), None), (accepted, or_patterns, "1.53.0", Some(54883)),
/// Allows using `+bundle,+whole-archive` link modifiers with native libs. /// Allows using `+bundle,+whole-archive` link modifiers with native libs.
(accepted, packed_bundled_libs, "1.74.0", Some(108081), None), (accepted, packed_bundled_libs, "1.74.0", Some(108081)),
/// Allows annotating functions conforming to `fn(&PanicInfo) -> !` with `#[panic_handler]`. /// Allows annotating functions conforming to `fn(&PanicInfo) -> !` with `#[panic_handler]`.
/// This defines the behavior of panics. /// This defines the behavior of panics.
(accepted, panic_handler, "1.30.0", Some(44489), None), (accepted, panic_handler, "1.30.0", Some(44489)),
/// Allows attributes in formal function parameters. /// Allows attributes in formal function parameters.
(accepted, param_attrs, "1.39.0", Some(60406), None), (accepted, param_attrs, "1.39.0", Some(60406)),
/// Allows parentheses in patterns. /// Allows parentheses in patterns.
(accepted, pattern_parentheses, "1.31.0", Some(51087), None), (accepted, pattern_parentheses, "1.31.0", Some(51087)),
/// Allows procedural macros in `proc-macro` crates. /// Allows procedural macros in `proc-macro` crates.
(accepted, proc_macro, "1.29.0", Some(38356), None), (accepted, proc_macro, "1.29.0", Some(38356)),
/// Allows multi-segment paths in attributes and derives. /// Allows multi-segment paths in attributes and derives.
(accepted, proc_macro_path_invoc, "1.30.0", Some(38356), None), (accepted, proc_macro_path_invoc, "1.30.0", Some(38356)),
/// Allows `pub(restricted)` visibilities (RFC 1422). /// Allows `pub(restricted)` visibilities (RFC 1422).
(accepted, pub_restricted, "1.18.0", Some(32409), None), (accepted, pub_restricted, "1.18.0", Some(32409)),
/// Allows use of the postfix `?` operator in expressions. /// Allows use of the postfix `?` operator in expressions.
(accepted, question_mark, "1.13.0", Some(31436), None), (accepted, question_mark, "1.13.0", Some(31436)),
/// Allows the use of raw-dylibs (RFC 2627). /// Allows the use of raw-dylibs (RFC 2627).
(accepted, raw_dylib, "1.71.0", Some(58713), None), (accepted, raw_dylib, "1.71.0", Some(58713)),
/// Allows keywords to be escaped for use as identifiers. /// Allows keywords to be escaped for use as identifiers.
(accepted, raw_identifiers, "1.30.0", Some(48589), None), (accepted, raw_identifiers, "1.30.0", Some(48589)),
/// Allows relaxing the coherence rules such that /// Allows relaxing the coherence rules such that
/// `impl<T> ForeignTrait<LocalType> for ForeignType<T>` is permitted. /// `impl<T> ForeignTrait<LocalType> for ForeignType<T>` is permitted.
(accepted, re_rebalance_coherence, "1.41.0", Some(55437), None), (accepted, re_rebalance_coherence, "1.41.0", Some(55437)),
/// Allows numeric fields in struct expressions and patterns. /// Allows numeric fields in struct expressions and patterns.
(accepted, relaxed_adts, "1.19.0", Some(35626), None), (accepted, relaxed_adts, "1.19.0", Some(35626)),
/// Lessens the requirements for structs to implement `Unsize`. /// Lessens the requirements for structs to implement `Unsize`.
(accepted, relaxed_struct_unsize, "1.58.0", Some(81793), None), (accepted, relaxed_struct_unsize, "1.58.0", Some(81793)),
/// Allows `repr(align(16))` struct attribute (RFC 1358). /// Allows `repr(align(16))` struct attribute (RFC 1358).
(accepted, repr_align, "1.25.0", Some(33626), None), (accepted, repr_align, "1.25.0", Some(33626)),
/// Allows using `#[repr(align(X))]` on enums with equivalent semantics /// Allows using `#[repr(align(X))]` on enums with equivalent semantics
/// to wrapping an enum in a wrapper struct with `#[repr(align(X))]`. /// to wrapping an enum in a wrapper struct with `#[repr(align(X))]`.
(accepted, repr_align_enum, "1.37.0", Some(57996), None), (accepted, repr_align_enum, "1.37.0", Some(57996)),
/// Allows `#[repr(packed(N))]` attribute on structs. /// Allows `#[repr(packed(N))]` attribute on structs.
(accepted, repr_packed, "1.33.0", Some(33158), None), (accepted, repr_packed, "1.33.0", Some(33158)),
/// Allows `#[repr(transparent)]` attribute on newtype structs. /// Allows `#[repr(transparent)]` attribute on newtype structs.
(accepted, repr_transparent, "1.28.0", Some(43036), None), (accepted, repr_transparent, "1.28.0", Some(43036)),
/// Allows return-position `impl Trait` in traits. /// Allows return-position `impl Trait` in traits.
(accepted, return_position_impl_trait_in_trait, "1.75.0", Some(91611), None), (accepted, return_position_impl_trait_in_trait, "1.75.0", Some(91611)),
/// Allows code like `let x: &'static u32 = &42` to work (RFC 1414). /// Allows code like `let x: &'static u32 = &42` to work (RFC 1414).
(accepted, rvalue_static_promotion, "1.21.0", Some(38865), None), (accepted, rvalue_static_promotion, "1.21.0", Some(38865)),
/// Allows `Self` in type definitions (RFC 2300). /// Allows `Self` in type definitions (RFC 2300).
(accepted, self_in_typedefs, "1.32.0", Some(49303), None), (accepted, self_in_typedefs, "1.32.0", Some(49303)),
/// Allows `Self` struct constructor (RFC 2302). /// Allows `Self` struct constructor (RFC 2302).
(accepted, self_struct_ctor, "1.32.0", Some(51994), None), (accepted, self_struct_ctor, "1.32.0", Some(51994)),
/// Allows using subslice patterns, `[a, .., b]` and `[a, xs @ .., b]`. /// Allows using subslice patterns, `[a, .., b]` and `[a, xs @ .., b]`.
(accepted, slice_patterns, "1.42.0", Some(62254), None), (accepted, slice_patterns, "1.42.0", Some(62254)),
/// Allows use of `&foo[a..b]` as a slicing syntax. /// Allows use of `&foo[a..b]` as a slicing syntax.
(accepted, slicing_syntax, "1.0.0", None, None), (accepted, slicing_syntax, "1.0.0", None),
/// Allows elision of `'static` lifetimes in `static`s and `const`s. /// Allows elision of `'static` lifetimes in `static`s and `const`s.
(accepted, static_in_const, "1.17.0", Some(35897), None), (accepted, static_in_const, "1.17.0", Some(35897)),
/// Allows the definition recursive static items. /// Allows the definition recursive static items.
(accepted, static_recursion, "1.17.0", Some(29719), None), (accepted, static_recursion, "1.17.0", Some(29719)),
/// Allows attributes on struct literal fields. /// Allows attributes on struct literal fields.
(accepted, struct_field_attributes, "1.20.0", Some(38814), None), (accepted, struct_field_attributes, "1.20.0", Some(38814)),
/// Allows struct variants `Foo { baz: u8, .. }` in enums (RFC 418). /// Allows struct variants `Foo { baz: u8, .. }` in enums (RFC 418).
(accepted, struct_variant, "1.0.0", None, None), (accepted, struct_variant, "1.0.0", None),
/// Allows `#[target_feature(...)]`. /// Allows `#[target_feature(...)]`.
(accepted, target_feature, "1.27.0", None, None), (accepted, target_feature, "1.27.0", None),
/// Allows `fn main()` with return types which implements `Termination` (RFC 1937). /// Allows `fn main()` with return types which implements `Termination` (RFC 1937).
(accepted, termination_trait, "1.26.0", Some(43301), None), (accepted, termination_trait, "1.26.0", Some(43301)),
/// Allows `#[test]` functions where the return type implements `Termination` (RFC 1937). /// Allows `#[test]` functions where the return type implements `Termination` (RFC 1937).
(accepted, termination_trait_test, "1.27.0", Some(48854), None), (accepted, termination_trait_test, "1.27.0", Some(48854)),
/// Allows attributes scoped to tools. /// Allows attributes scoped to tools.
(accepted, tool_attributes, "1.30.0", Some(44690), None), (accepted, tool_attributes, "1.30.0", Some(44690)),
/// Allows scoped lints. /// Allows scoped lints.
(accepted, tool_lints, "1.31.0", Some(44690), None), (accepted, tool_lints, "1.31.0", Some(44690)),
/// Allows `#[track_caller]` to be used which provides /// Allows `#[track_caller]` to be used which provides
/// accurate caller location reporting during panic (RFC 2091). /// accurate caller location reporting during panic (RFC 2091).
(accepted, track_caller, "1.46.0", Some(47809), None), (accepted, track_caller, "1.46.0", Some(47809)),
/// Allows dyn upcasting trait objects via supertraits. /// Allows dyn upcasting trait objects via supertraits.
/// Dyn upcasting is casting, e.g., `dyn Foo -> dyn Bar` where `Foo: Bar`. /// Dyn upcasting is casting, e.g., `dyn Foo -> dyn Bar` where `Foo: Bar`.
(accepted, trait_upcasting, "CURRENT_RUSTC_VERSION", Some(65991), None), (accepted, trait_upcasting, "CURRENT_RUSTC_VERSION", Some(65991)),
/// Allows #[repr(transparent)] on univariant enums (RFC 2645). /// Allows #[repr(transparent)] on univariant enums (RFC 2645).
(accepted, transparent_enums, "1.42.0", Some(60405), None), (accepted, transparent_enums, "1.42.0", Some(60405)),
/// Allows indexing tuples. /// Allows indexing tuples.
(accepted, tuple_indexing, "1.0.0", None, None), (accepted, tuple_indexing, "1.0.0", None),
/// Allows paths to enum variants on type aliases including `Self`. /// Allows paths to enum variants on type aliases including `Self`.
(accepted, type_alias_enum_variants, "1.37.0", Some(49683), None), (accepted, type_alias_enum_variants, "1.37.0", Some(49683)),
/// Allows macros to appear in the type position. /// Allows macros to appear in the type position.
(accepted, type_macros, "1.13.0", Some(27245), None), (accepted, type_macros, "1.13.0", Some(27245)),
/// Allows `const _: TYPE = VALUE`. /// Allows `const _: TYPE = VALUE`.
(accepted, underscore_const_names, "1.37.0", Some(54912), None), (accepted, underscore_const_names, "1.37.0", Some(54912)),
/// Allows `use path as _;` and `extern crate c as _;`. /// Allows `use path as _;` and `extern crate c as _;`.
(accepted, underscore_imports, "1.33.0", Some(48216), None), (accepted, underscore_imports, "1.33.0", Some(48216)),
/// Allows `'_` placeholder lifetimes. /// Allows `'_` placeholder lifetimes.
(accepted, underscore_lifetimes, "1.26.0", Some(44524), None), (accepted, underscore_lifetimes, "1.26.0", Some(44524)),
/// Allows `use x::y;` to search `x` in the current scope. /// Allows `use x::y;` to search `x` in the current scope.
(accepted, uniform_paths, "1.32.0", Some(53130), None), (accepted, uniform_paths, "1.32.0", Some(53130)),
/// Allows `impl Trait` in function arguments. /// Allows `impl Trait` in function arguments.
(accepted, universal_impl_trait, "1.26.0", Some(34511), None), (accepted, universal_impl_trait, "1.26.0", Some(34511)),
/// Allows arbitrary delimited token streams in non-macro attributes. /// Allows arbitrary delimited token streams in non-macro attributes.
(accepted, unrestricted_attribute_tokens, "1.34.0", Some(55208), None), (accepted, unrestricted_attribute_tokens, "1.34.0", Some(55208)),
/// The `unsafe_op_in_unsafe_fn` lint (allowed by default): no longer treat an unsafe function as an unsafe block. /// The `unsafe_op_in_unsafe_fn` lint (allowed by default): no longer treat an unsafe function as an unsafe block.
(accepted, unsafe_block_in_unsafe_fn, "1.52.0", Some(71668), None), (accepted, unsafe_block_in_unsafe_fn, "1.52.0", Some(71668)),
/// Allows importing and reexporting macros with `use`, /// Allows importing and reexporting macros with `use`,
/// enables macro modularization in general. /// enables macro modularization in general.
(accepted, use_extern_macros, "1.30.0", Some(35896), None), (accepted, use_extern_macros, "1.30.0", Some(35896)),
/// Allows nested groups in `use` items (RFC 2128). /// Allows nested groups in `use` items (RFC 2128).
(accepted, use_nested_groups, "1.25.0", Some(44494), None), (accepted, use_nested_groups, "1.25.0", Some(44494)),
/// Allows `#[used]` to preserve symbols (see llvm.compiler.used). /// Allows `#[used]` to preserve symbols (see llvm.compiler.used).
(accepted, used, "1.30.0", Some(40289), None), (accepted, used, "1.30.0", Some(40289)),
/// Allows the use of `while let` expressions. /// Allows the use of `while let` expressions.
(accepted, while_let, "1.0.0", None, None), (accepted, while_let, "1.0.0", None),
/// Allows `#![windows_subsystem]`. /// Allows `#![windows_subsystem]`.
(accepted, windows_subsystem, "1.18.0", Some(37499), None), (accepted, windows_subsystem, "1.18.0", Some(37499)),
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!
// Features are listed in alphabetical order. Tidy will fail if you don't keep it this way. // Features are listed in alphabetical order. Tidy will fail if you don't keep it this way.
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!

View File

@ -26,7 +26,7 @@ mod unstable;
#[cfg(test)] #[cfg(test)]
mod tests; mod tests;
use rustc_span::{edition::Edition, symbol::Symbol}; use rustc_span::symbol::Symbol;
use std::num::NonZeroU32; use std::num::NonZeroU32;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -34,7 +34,6 @@ pub struct Feature {
pub name: Symbol, pub name: Symbol,
pub since: &'static str, pub since: &'static str,
issue: Option<NonZeroU32>, issue: Option<NonZeroU32>,
pub edition: Option<Edition>,
} }
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug)]

View File

@ -10,7 +10,7 @@ pub struct RemovedFeature {
macro_rules! declare_features { macro_rules! declare_features {
($( ($(
$(#[doc = $doc:tt])* (removed, $feature:ident, $ver:expr, $issue:expr, None, $reason:expr), $(#[doc = $doc:tt])* (removed, $feature:ident, $ver:expr, $issue:expr, $reason:expr),
)+) => { )+) => {
/// Formerly unstable features that have now been removed. /// Formerly unstable features that have now been removed.
pub const REMOVED_FEATURES: &[RemovedFeature] = &[ pub const REMOVED_FEATURES: &[RemovedFeature] = &[
@ -19,7 +19,6 @@ macro_rules! declare_features {
name: sym::$feature, name: sym::$feature,
since: $ver, since: $ver,
issue: to_nonzero($issue), issue: to_nonzero($issue),
edition: None,
}, },
reason: $reason reason: $reason
}),+ }),+
@ -33,176 +32,178 @@ declare_features! (
// feature-group-start: removed features // feature-group-start: removed features
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
(removed, advanced_slice_patterns, "1.0.0", Some(62254), None, (removed, advanced_slice_patterns, "1.0.0", Some(62254),
Some("merged into `#![feature(slice_patterns)]`")), Some("merged into `#![feature(slice_patterns)]`")),
(removed, allocator, "1.0.0", None, None, None), (removed, allocator, "1.0.0", None, None),
/// Allows a test to fail without failing the whole suite. /// Allows a test to fail without failing the whole suite.
(removed, allow_fail, "1.19.0", Some(46488), None, Some("removed due to no clear use cases")), (removed, allow_fail, "1.19.0", Some(46488), Some("removed due to no clear use cases")),
(removed, await_macro, "1.38.0", Some(50547), None, (removed, await_macro, "1.38.0", Some(50547),
Some("subsumed by `.await` syntax")), Some("subsumed by `.await` syntax")),
/// Allows using the `box $expr` syntax. /// Allows using the `box $expr` syntax.
(removed, box_syntax, "1.70.0", Some(49733), None, Some("replaced with `#[rustc_box]`")), (removed, box_syntax, "1.70.0", Some(49733), Some("replaced with `#[rustc_box]`")),
/// Allows capturing disjoint fields in a closure/coroutine (RFC 2229). /// Allows capturing disjoint fields in a closure/coroutine (RFC 2229).
(removed, capture_disjoint_fields, "1.49.0", Some(53488), None, Some("stabilized in Rust 2021")), (removed, capture_disjoint_fields, "1.49.0", Some(53488), Some("stabilized in Rust 2021")),
/// Allows comparing raw pointers during const eval. /// Allows comparing raw pointers during const eval.
(removed, const_compare_raw_pointers, "1.46.0", Some(53020), None, (removed, const_compare_raw_pointers, "1.46.0", Some(53020),
Some("cannot be allowed in const eval in any meaningful way")), Some("cannot be allowed in const eval in any meaningful way")),
/// Allows limiting the evaluation steps of const expressions /// Allows limiting the evaluation steps of const expressions
(removed, const_eval_limit, "1.43.0", Some(67217), None, Some("removed the limit entirely")), (removed, const_eval_limit, "1.43.0", Some(67217), Some("removed the limit entirely")),
/// Allows non-trivial generic constants which have to be manually propagated upwards. /// Allows non-trivial generic constants which have to be manually propagated upwards.
(removed, const_evaluatable_checked, "1.48.0", Some(76560), None, Some("renamed to `generic_const_exprs`")), (removed, const_evaluatable_checked, "1.48.0", Some(76560), Some("renamed to `generic_const_exprs`")),
/// Allows the definition of `const` functions with some advanced features. /// Allows the definition of `const` functions with some advanced features.
(removed, const_fn, "1.54.0", Some(57563), None, (removed, const_fn, "1.54.0", Some(57563),
Some("split into finer-grained feature gates")), Some("split into finer-grained feature gates")),
/// Allows const generic types (e.g. `struct Foo<const N: usize>(...);`). /// Allows const generic types (e.g. `struct Foo<const N: usize>(...);`).
(removed, const_generics, "1.34.0", Some(44580), None, (removed, const_generics, "1.34.0", Some(44580),
Some("removed in favor of `#![feature(adt_const_params)]` and `#![feature(generic_const_exprs)]`")), Some("removed in favor of `#![feature(adt_const_params)]` and `#![feature(generic_const_exprs)]`")),
/// Allows `[x; N]` where `x` is a constant (RFC 2203). /// Allows `[x; N]` where `x` is a constant (RFC 2203).
(removed, const_in_array_repeat_expressions, "1.37.0", Some(49147), None, (removed, const_in_array_repeat_expressions, "1.37.0", Some(49147),
Some("removed due to causing promotable bugs")), Some("removed due to causing promotable bugs")),
/// Allows casting raw pointers to `usize` during const eval. /// Allows casting raw pointers to `usize` during const eval.
(removed, const_raw_ptr_to_usize_cast, "1.55.0", Some(51910), None, (removed, const_raw_ptr_to_usize_cast, "1.55.0", Some(51910),
Some("at compile-time, pointers do not have an integer value, so these casts cannot be properly supported")), Some("at compile-time, pointers do not have an integer value, so these casts cannot be properly supported")),
/// Allows `T: ?const Trait` syntax in bounds. /// Allows `T: ?const Trait` syntax in bounds.
(removed, const_trait_bound_opt_out, "1.42.0", Some(67794), None, (removed, const_trait_bound_opt_out, "1.42.0", Some(67794),
Some("Removed in favor of `~const` bound in #![feature(const_trait_impl)]")), Some("Removed in favor of `~const` bound in #![feature(const_trait_impl)]")),
/// Allows using `crate` as visibility modifier, synonymous with `pub(crate)`. /// Allows using `crate` as visibility modifier, synonymous with `pub(crate)`.
(removed, crate_visibility_modifier, "1.63.0", Some(53120), None, Some("removed in favor of `pub(crate)`")), (removed, crate_visibility_modifier, "1.63.0", Some(53120), Some("removed in favor of `pub(crate)`")),
/// Allows using custom attributes (RFC 572). /// Allows using custom attributes (RFC 572).
(removed, custom_attribute, "1.0.0", Some(29642), None, (removed, custom_attribute, "1.0.0", Some(29642),
Some("removed in favor of `#![register_tool]` and `#![register_attr]`")), Some("removed in favor of `#![register_tool]` and `#![register_attr]`")),
/// Allows the use of `#[derive(Anything)]` as sugar for `#[derive_Anything]`. /// Allows the use of `#[derive(Anything)]` as sugar for `#[derive_Anything]`.
(removed, custom_derive, "1.32.0", Some(29644), None, (removed, custom_derive, "1.32.0", Some(29644),
Some("subsumed by `#[proc_macro_derive]`")), Some("subsumed by `#[proc_macro_derive]`")),
/// Allows using `#[doc(keyword = "...")]`. /// Allows using `#[doc(keyword = "...")]`.
(removed, doc_keyword, "1.28.0", Some(51315), None, (removed, doc_keyword, "1.28.0", Some(51315),
Some("merged into `#![feature(rustdoc_internals)]`")), Some("merged into `#![feature(rustdoc_internals)]`")),
/// Allows using `doc(primitive)` without a future-incompat warning. /// Allows using `doc(primitive)` without a future-incompat warning.
(removed, doc_primitive, "1.56.0", Some(88070), None, (removed, doc_primitive, "1.56.0", Some(88070),
Some("merged into `#![feature(rustdoc_internals)]`")), Some("merged into `#![feature(rustdoc_internals)]`")),
/// Allows `#[doc(spotlight)]`. /// Allows `#[doc(spotlight)]`.
/// The attribute was renamed to `#[doc(notable_trait)]` /// The attribute was renamed to `#[doc(notable_trait)]`
/// and the feature to `doc_notable_trait`. /// and the feature to `doc_notable_trait`.
(removed, doc_spotlight, "1.22.0", Some(45040), None, (removed, doc_spotlight, "1.22.0", Some(45040),
Some("renamed to `doc_notable_trait`")), Some("renamed to `doc_notable_trait`")),
/// Allows using `#[unsafe_destructor_blind_to_params]` (RFC 1238). /// Allows using `#[unsafe_destructor_blind_to_params]` (RFC 1238).
(removed, dropck_parametricity, "1.38.0", Some(28498), None, None), (removed, dropck_parametricity, "1.38.0", Some(28498), None),
/// Allows defining `existential type`s. /// Allows defining `existential type`s.
(removed, existential_type, "1.38.0", Some(63063), None, (removed, existential_type, "1.38.0", Some(63063),
Some("removed in favor of `#![feature(type_alias_impl_trait)]`")), Some("removed in favor of `#![feature(type_alias_impl_trait)]`")),
/// Paths of the form: `extern::foo::bar` /// Paths of the form: `extern::foo::bar`
(removed, extern_in_paths, "1.33.0", Some(55600), None, (removed, extern_in_paths, "1.33.0", Some(55600),
Some("subsumed by `::foo::bar` paths")), Some("subsumed by `::foo::bar` paths")),
/// Allows `#[doc(include = "some-file")]`. /// Allows `#[doc(include = "some-file")]`.
(removed, external_doc, "1.54.0", Some(44732), None, (removed, external_doc, "1.54.0", Some(44732),
Some("use #[doc = include_str!(\"filename\")] instead, which handles macro invocations")), Some("use #[doc = include_str!(\"filename\")] instead, which handles macro invocations")),
/// Allows generators to be cloned. /// Allows generators to be cloned.
(removed, generator_clone, "1.65.0", Some(95360), None, Some("renamed to `coroutine_clone`")), (removed, generator_clone, "1.65.0", Some(95360), Some("renamed to `coroutine_clone`")),
/// Allows defining generators. /// Allows defining generators.
(removed, generators, "1.21.0", Some(43122), None, Some("renamed to `coroutines`")), (removed, generators, "1.21.0", Some(43122), Some("renamed to `coroutines`")),
/// Allows `impl Trait` in bindings (`let`, `const`, `static`). /// Allows `impl Trait` in bindings (`let`, `const`, `static`).
(removed, impl_trait_in_bindings, "1.55.0", Some(63065), None, (removed, impl_trait_in_bindings, "1.55.0", Some(63065),
Some("the implementation was not maintainable, the feature may get reintroduced once the current refactorings are done")), Some("the implementation was not maintainable, the feature may get reintroduced once the current refactorings are done")),
(removed, import_shadowing, "1.0.0", None, None, None), (removed, import_shadowing, "1.0.0", None, None),
/// Allows in-band quantification of lifetime bindings (e.g., `fn foo(x: &'a u8) -> &'a u8`). /// Allows in-band quantification of lifetime bindings (e.g., `fn foo(x: &'a u8) -> &'a u8`).
(removed, in_band_lifetimes, "1.23.0", Some(44524), None, (removed, in_band_lifetimes, "1.23.0", Some(44524),
Some("removed due to unsolved ergonomic questions and added lifetime resolution complexity")), Some("removed due to unsolved ergonomic questions and added lifetime resolution complexity")),
/// Allows inferring `'static` outlives requirements (RFC 2093). /// Allows inferring `'static` outlives requirements (RFC 2093).
(removed, infer_static_outlives_requirements, "1.63.0", Some(54185), None, (removed, infer_static_outlives_requirements, "1.63.0", Some(54185),
Some("removed as it caused some confusion and discussion was inactive for years")), Some("removed as it caused some confusion and discussion was inactive for years")),
/// Lazily evaluate constants. This allows constants to depend on type parameters. /// Lazily evaluate constants. This allows constants to depend on type parameters.
(removed, lazy_normalization_consts, "1.46.0", Some(72219), None, Some("superseded by `generic_const_exprs`")), (removed, lazy_normalization_consts, "1.46.0", Some(72219), Some("superseded by `generic_const_exprs`")),
/// Allows using the `#[link_args]` attribute. /// Allows using the `#[link_args]` attribute.
(removed, link_args, "1.53.0", Some(29596), None, (removed, link_args, "1.53.0", Some(29596),
Some("removed in favor of using `-C link-arg=ARG` on command line, \ Some("removed in favor of using `-C link-arg=ARG` on command line, \
which is available from cargo build scripts with `cargo:rustc-link-arg` now")), which is available from cargo build scripts with `cargo:rustc-link-arg` now")),
(removed, macro_reexport, "1.0.0", Some(29638), None, (removed, macro_reexport, "1.0.0", Some(29638),
Some("subsumed by `pub use`")), Some("subsumed by `pub use`")),
/// Allows using `#[main]` to replace the entrypoint `#[lang = "start"]` calls. /// Allows using `#[main]` to replace the entrypoint `#[lang = "start"]` calls.
(removed, main, "1.53.0", Some(29634), None, None), (removed, main, "1.53.0", Some(29634), None),
(removed, managed_boxes, "1.0.0", None, None, None), (removed, managed_boxes, "1.0.0", None, None),
/// Allows the use of type alias impl trait in function return positions /// Allows the use of type alias impl trait in function return positions
(removed, min_type_alias_impl_trait, "1.56.0", Some(63063), None, (removed, min_type_alias_impl_trait, "1.56.0", Some(63063),
Some("removed in favor of full type_alias_impl_trait")), Some("removed in favor of full type_alias_impl_trait")),
(removed, needs_allocator, "1.4.0", Some(27389), None, (removed, needs_allocator, "1.4.0", Some(27389),
Some("subsumed by `#![feature(allocator_internals)]`")), Some("subsumed by `#![feature(allocator_internals)]`")),
/// Allows use of unary negate on unsigned integers, e.g., -e for e: u8 /// Allows use of unary negate on unsigned integers, e.g., -e for e: u8
(removed, negate_unsigned, "1.0.0", Some(29645), None, None), (removed, negate_unsigned, "1.0.0", Some(29645), None),
/// Allows `#[no_coverage]` on functions. /// Allows `#[no_coverage]` on functions.
/// The feature was renamed to `coverage_attribute` and the attribute to `#[coverage(on|off)]` /// The feature was renamed to `coverage_attribute` and the attribute to `#[coverage(on|off)]`
(removed, no_coverage, "1.74.0", Some(84605), None, Some("renamed to `coverage_attribute`")), (removed, no_coverage, "1.74.0", Some(84605), Some("renamed to `coverage_attribute`")),
/// Allows `#[no_debug]`. /// Allows `#[no_debug]`.
(removed, no_debug, "1.43.0", Some(29721), None, Some("removed due to lack of demand")), (removed, no_debug, "1.43.0", Some(29721), Some("removed due to lack of demand")),
/// Note: this feature was previously recorded in a separate /// Note: this feature was previously recorded in a separate
/// `STABLE_REMOVED` list because it, uniquely, was once stable but was /// `STABLE_REMOVED` list because it, uniquely, was once stable but was
/// then removed. But there was no utility storing it separately, so now /// then removed. But there was no utility storing it separately, so now
/// it's in this list. /// it's in this list.
(removed, no_stack_check, "1.0.0", None, None, None), (removed, no_stack_check, "1.0.0", None, None),
/// Allows using `#[on_unimplemented(..)]` on traits. /// Allows using `#[on_unimplemented(..)]` on traits.
/// (Moved to `rustc_attrs`.) /// (Moved to `rustc_attrs`.)
(removed, on_unimplemented, "1.40.0", None, None, None), (removed, on_unimplemented, "1.40.0", None, None),
/// A way to temporarily opt out of opt-in copy. This will *never* be accepted. /// A way to temporarily opt out of opt-in copy. This will *never* be accepted.
(removed, opt_out_copy, "1.0.0", None, None, None), (removed, opt_out_copy, "1.0.0", None, None),
/// Allows features specific to OIBIT (now called auto traits). /// Allows features specific to OIBIT (now called auto traits).
/// Renamed to `auto_traits`. /// Renamed to `auto_traits`.
(removed, optin_builtin_traits, "1.0.0", Some(13231), None, (removed, optin_builtin_traits, "1.0.0", Some(13231),
Some("renamed to `auto_traits`")), Some("renamed to `auto_traits`")),
/// Allows overlapping impls of marker traits. /// Allows overlapping impls of marker traits.
(removed, overlapping_marker_traits, "1.42.0", Some(29864), None, (removed, overlapping_marker_traits, "1.42.0", Some(29864),
Some("removed in favor of `#![feature(marker_trait_attr)]`")), Some("removed in favor of `#![feature(marker_trait_attr)]`")),
(removed, panic_implementation, "1.28.0", Some(44489), None, (removed, panic_implementation, "1.28.0", Some(44489),
Some("subsumed by `#[panic_handler]`")), Some("subsumed by `#[panic_handler]`")),
/// Allows using `#![plugin(myplugin)]`. /// Allows using `#![plugin(myplugin)]`.
(removed, plugin, "1.75.0", Some(29597), None, (removed, plugin, "1.75.0", Some(29597),
Some("plugins are no longer supported")), Some("plugins are no longer supported")),
/// Allows using `#[plugin_registrar]` on functions. /// Allows using `#[plugin_registrar]` on functions.
(removed, plugin_registrar, "1.54.0", Some(29597), None, (removed, plugin_registrar, "1.54.0", Some(29597),
Some("plugins are no longer supported")), Some("plugins are no longer supported")),
/// Allows exhaustive integer pattern matching with `usize::MAX`/`isize::MIN`/`isize::MAX`. /// Allows exhaustive integer pattern matching with `usize::MAX`/`isize::MIN`/`isize::MAX`.
(removed, precise_pointer_size_matching, "1.32.0", Some(56354), None, (removed, precise_pointer_size_matching, "1.32.0", Some(56354),
Some("removed in favor of half-open ranges")), Some("removed in favor of half-open ranges")),
(removed, proc_macro_expr, "1.27.0", Some(54727), None, (removed, proc_macro_expr, "1.27.0", Some(54727),
Some("subsumed by `#![feature(proc_macro_hygiene)]`")), Some("subsumed by `#![feature(proc_macro_hygiene)]`")),
(removed, proc_macro_gen, "1.27.0", Some(54727), None, (removed, proc_macro_gen, "1.27.0", Some(54727),
Some("subsumed by `#![feature(proc_macro_hygiene)]`")), Some("subsumed by `#![feature(proc_macro_hygiene)]`")),
(removed, proc_macro_mod, "1.27.0", Some(54727), None, (removed, proc_macro_mod, "1.27.0", Some(54727),
Some("subsumed by `#![feature(proc_macro_hygiene)]`")), Some("subsumed by `#![feature(proc_macro_hygiene)]`")),
(removed, proc_macro_non_items, "1.27.0", Some(54727), None, (removed, proc_macro_non_items, "1.27.0", Some(54727),
Some("subsumed by `#![feature(proc_macro_hygiene)]`")), Some("subsumed by `#![feature(proc_macro_hygiene)]`")),
(removed, pub_macro_rules, "1.53.0", Some(78855), None, (removed, pub_macro_rules, "1.53.0", Some(78855),
Some("removed due to being incomplete, in particular it does not work across crates")), Some("removed due to being incomplete, in particular it does not work across crates")),
(removed, pushpop_unsafe, "1.2.0", None, None, None), (removed, pushpop_unsafe, "1.2.0", None, None),
(removed, quad_precision_float, "1.0.0", None, None, None), (removed, quad_precision_float, "1.0.0", None, None),
(removed, quote, "1.33.0", Some(29601), None, None), (removed, quote, "1.33.0", Some(29601), None),
(removed, reflect, "1.0.0", Some(27749), None, None), (removed, reflect, "1.0.0", Some(27749), None),
/// Allows using the `#[register_attr]` attribute. /// Allows using the `#[register_attr]` attribute.
(removed, register_attr, "1.65.0", Some(66080), None, (removed, register_attr, "1.65.0", Some(66080),
Some("removed in favor of `#![register_tool]`")), Some("removed in favor of `#![register_tool]`")),
(removed, rust_2018_preview, "CURRENT_RUSTC_VERSION", None,
Some("2018 Edition preview is no longer relevant")),
/// Allows using the macros: /// Allows using the macros:
/// + `__diagnostic_used` /// + `__diagnostic_used`
/// + `__register_diagnostic` /// + `__register_diagnostic`
/// +`__build_diagnostic_array` /// +`__build_diagnostic_array`
(removed, rustc_diagnostic_macros, "1.38.0", None, None, None), (removed, rustc_diagnostic_macros, "1.38.0", None, None),
/// Allows identifying crates that contain sanitizer runtimes. /// Allows identifying crates that contain sanitizer runtimes.
(removed, sanitizer_runtime, "1.17.0", None, None, None), (removed, sanitizer_runtime, "1.17.0", None, None),
(removed, simd, "1.0.0", Some(27731), None, (removed, simd, "1.0.0", Some(27731),
Some("removed in favor of `#[repr(simd)]`")), Some("removed in favor of `#[repr(simd)]`")),
/// Allows `#[link(kind = "static-nobundle", ...)]`. /// Allows `#[link(kind = "static-nobundle", ...)]`.
(removed, static_nobundle, "1.16.0", Some(37403), None, (removed, static_nobundle, "1.16.0", Some(37403),
Some(r#"subsumed by `#[link(kind = "static", modifiers = "-bundle", ...)]`"#)), Some(r#"subsumed by `#[link(kind = "static", modifiers = "-bundle", ...)]`"#)),
(removed, struct_inherit, "1.0.0", None, None, None), (removed, struct_inherit, "1.0.0", None, None),
(removed, test_removed_feature, "1.0.0", None, None, None), (removed, test_removed_feature, "1.0.0", None, None),
/// Allows using items which are missing stability attributes /// Allows using items which are missing stability attributes
(removed, unmarked_api, "1.0.0", None, None, None), (removed, unmarked_api, "1.0.0", None, None),
(removed, unsafe_no_drop_flag, "1.0.0", None, None, None), (removed, unsafe_no_drop_flag, "1.0.0", None, None),
/// Allows `union` fields that don't implement `Copy` as long as they don't have any drop glue. /// Allows `union` fields that don't implement `Copy` as long as they don't have any drop glue.
(removed, untagged_unions, "1.13.0", Some(55149), None, (removed, untagged_unions, "1.13.0", Some(55149),
Some("unions with `Copy` and `ManuallyDrop` fields are stable; there is no intent to stabilize more")), Some("unions with `Copy` and `ManuallyDrop` fields are stable; there is no intent to stabilize more")),
/// Allows `#[unwind(..)]`. /// Allows `#[unwind(..)]`.
/// ///
/// Permits specifying whether a function should permit unwinding or abort on unwind. /// Permits specifying whether a function should permit unwinding or abort on unwind.
(removed, unwind_attributes, "1.56.0", Some(58760), None, Some("use the C-unwind ABI instead")), (removed, unwind_attributes, "1.56.0", Some(58760), Some("use the C-unwind ABI instead")),
(removed, visible_private_types, "1.0.0", None, None, None), (removed, visible_private_types, "1.0.0", None, None),
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!
// Features are listed in alphabetical order. Tidy will fail if you don't keep it this way. // Features are listed in alphabetical order. Tidy will fail if you don't keep it this way.
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!

View File

@ -3,7 +3,6 @@
use super::{to_nonzero, Feature}; use super::{to_nonzero, Feature};
use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
use rustc_span::edition::Edition;
use rustc_span::symbol::{sym, Symbol}; use rustc_span::symbol::{sym, Symbol};
use rustc_span::Span; use rustc_span::Span;
@ -33,7 +32,7 @@ macro_rules! status_to_enum {
macro_rules! declare_features { macro_rules! declare_features {
($( ($(
$(#[doc = $doc:tt])* ($status:ident, $feature:ident, $ver:expr, $issue:expr, $edition:expr), $(#[doc = $doc:tt])* ($status:ident, $feature:ident, $ver:expr, $issue:expr),
)+) => { )+) => {
/// Unstable language features that are being implemented or being /// Unstable language features that are being implemented or being
/// considered for acceptance (stabilization) or removal. /// considered for acceptance (stabilization) or removal.
@ -43,7 +42,6 @@ macro_rules! declare_features {
name: sym::$feature, name: sym::$feature,
since: $ver, since: $ver,
issue: to_nonzero($issue), issue: to_nonzero($issue),
edition: $edition,
}, },
// Sets this feature's corresponding bool within `features`. // Sets this feature's corresponding bool within `features`.
set_enabled: |features| features.$feature = true, set_enabled: |features| features.$feature = true,
@ -102,8 +100,7 @@ macro_rules! declare_features {
self.declared_features.contains(&feature) self.declared_features.contains(&feature)
} }
/// Is the given feature active, i.e. declared or automatically /// Is the given feature active (enabled by the user)?
/// enabled due to the edition?
/// ///
/// Panics if the symbol doesn't correspond to a declared feature. /// Panics if the symbol doesn't correspond to a declared feature.
pub fn active(&self, feature: Symbol) -> bool { pub fn active(&self, feature: Symbol) -> bool {
@ -179,58 +176,56 @@ declare_features! (
// no-tracking-issue-start // no-tracking-issue-start
/// Allows using the `unadjusted` ABI; perma-unstable. /// Allows using the `unadjusted` ABI; perma-unstable.
(internal, abi_unadjusted, "1.16.0", None, None), (internal, abi_unadjusted, "1.16.0", None),
/// Allows using the `vectorcall` ABI. /// Allows using the `vectorcall` ABI.
(unstable, abi_vectorcall, "1.7.0", None, None), (unstable, abi_vectorcall, "1.7.0", None),
/// Allows using `#![needs_allocator]`, an implementation detail of `#[global_allocator]`. /// Allows using `#![needs_allocator]`, an implementation detail of `#[global_allocator]`.
(internal, allocator_internals, "1.20.0", None, None), (internal, allocator_internals, "1.20.0", None),
/// Allows using `#[allow_internal_unsafe]`. This is an /// Allows using `#[allow_internal_unsafe]`. This is an
/// attribute on `macro_rules!` and can't use the attribute handling /// attribute on `macro_rules!` and can't use the attribute handling
/// below (it has to be checked before expansion possibly makes /// below (it has to be checked before expansion possibly makes
/// macros disappear). /// macros disappear).
(internal, allow_internal_unsafe, "1.0.0", None, None), (internal, allow_internal_unsafe, "1.0.0", None),
/// Allows using `#[allow_internal_unstable]`. This is an /// Allows using `#[allow_internal_unstable]`. This is an
/// attribute on `macro_rules!` and can't use the attribute handling /// attribute on `macro_rules!` and can't use the attribute handling
/// below (it has to be checked before expansion possibly makes /// below (it has to be checked before expansion possibly makes
/// macros disappear). /// macros disappear).
(internal, allow_internal_unstable, "1.0.0", None, None), (internal, allow_internal_unstable, "1.0.0", None),
/// Allows using anonymous lifetimes in argument-position impl-trait. /// Allows using anonymous lifetimes in argument-position impl-trait.
(unstable, anonymous_lifetime_in_impl_trait, "1.63.0", None, None), (unstable, anonymous_lifetime_in_impl_trait, "1.63.0", None),
/// Allows identifying the `compiler_builtins` crate. /// Allows identifying the `compiler_builtins` crate.
(internal, compiler_builtins, "1.13.0", None, None), (internal, compiler_builtins, "1.13.0", None),
/// Allows writing custom MIR /// Allows writing custom MIR
(internal, custom_mir, "1.65.0", None, None), (internal, custom_mir, "1.65.0", None),
/// Outputs useful `assert!` messages /// Outputs useful `assert!` messages
(unstable, generic_assert, "1.63.0", None, None), (unstable, generic_assert, "1.63.0", None),
/// Allows using the `rust-intrinsic`'s "ABI". /// Allows using the `rust-intrinsic`'s "ABI".
(internal, intrinsics, "1.0.0", None, None), (internal, intrinsics, "1.0.0", None),
/// Allows using `#[lang = ".."]` attribute for linking items to special compiler logic. /// Allows using `#[lang = ".."]` attribute for linking items to special compiler logic.
(internal, lang_items, "1.0.0", None, None), (internal, lang_items, "1.0.0", None),
/// Changes `impl Trait` to capture all lifetimes in scope. /// Changes `impl Trait` to capture all lifetimes in scope.
(unstable, lifetime_capture_rules_2024, "CURRENT_RUSTC_VERSION", None, None), (unstable, lifetime_capture_rules_2024, "CURRENT_RUSTC_VERSION", None),
/// Allows `#[link(..., cfg(..))]`; perma-unstable per #37406 /// Allows `#[link(..., cfg(..))]`; perma-unstable per #37406
(unstable, link_cfg, "1.14.0", None, None), (unstable, link_cfg, "1.14.0", None),
/// Allows the `multiple_supertrait_upcastable` lint. /// Allows the `multiple_supertrait_upcastable` lint.
(unstable, multiple_supertrait_upcastable, "1.69.0", None, None), (unstable, multiple_supertrait_upcastable, "1.69.0", None),
/// Allow negative trait bounds. This is an internal-only feature for testing the trait solver! /// Allow negative trait bounds. This is an internal-only feature for testing the trait solver!
(incomplete, negative_bounds, "1.71.0", None, None), (incomplete, negative_bounds, "1.71.0", None),
/// Allows using `#[omit_gdb_pretty_printer_section]`. /// Allows using `#[omit_gdb_pretty_printer_section]`.
(internal, omit_gdb_pretty_printer_section, "1.5.0", None, None), (internal, omit_gdb_pretty_printer_section, "1.5.0", None),
/// Allows using `#[prelude_import]` on glob `use` items. /// Allows using `#[prelude_import]` on glob `use` items.
(internal, prelude_import, "1.2.0", None, None), (internal, prelude_import, "1.2.0", None),
/// Used to identify crates that contain the profiler runtime. /// Used to identify crates that contain the profiler runtime.
(internal, profiler_runtime, "1.18.0", None, None), (internal, profiler_runtime, "1.18.0", None),
/// Allows using `rustc_*` attributes (RFC 572). /// Allows using `rustc_*` attributes (RFC 572).
(internal, rustc_attrs, "1.0.0", None, None), (internal, rustc_attrs, "1.0.0", None),
/// Allows using the `#[stable]` and `#[unstable]` attributes. /// Allows using the `#[stable]` and `#[unstable]` attributes.
(internal, staged_api, "1.0.0", None, None), (internal, staged_api, "1.0.0", None),
/// Added for testing E0705; perma-unstable.
(internal, test_2018_feature, "1.31.0", None, Some(Edition::Edition2018)),
/// Added for testing unstable lints; perma-unstable. /// Added for testing unstable lints; perma-unstable.
(internal, test_unstable_lint, "1.60.0", None, None), (internal, test_unstable_lint, "1.60.0", None),
/// Use for stable + negative coherence and strict coherence depending on trait's /// Use for stable + negative coherence and strict coherence depending on trait's
/// rustc_strict_coherence value. /// rustc_strict_coherence value.
(unstable, with_negative_coherence, "1.60.0", None, None), (unstable, with_negative_coherence, "1.60.0", None),
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!
// Features are listed in alphabetical order. Tidy will fail if you don't keep it this way. // Features are listed in alphabetical order. Tidy will fail if you don't keep it this way.
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!
@ -246,44 +241,44 @@ declare_features! (
/// Allows features specific to auto traits. /// Allows features specific to auto traits.
/// Renamed from `optin_builtin_traits`. /// Renamed from `optin_builtin_traits`.
(unstable, auto_traits, "1.50.0", Some(13231), None), (unstable, auto_traits, "1.50.0", Some(13231)),
/// Allows using `box` in patterns (RFC 469). /// Allows using `box` in patterns (RFC 469).
(unstable, box_patterns, "1.0.0", Some(29641), None), (unstable, box_patterns, "1.0.0", Some(29641)),
/// Allows `#[doc(notable_trait)]`. /// Allows `#[doc(notable_trait)]`.
/// Renamed from `doc_spotlight`. /// Renamed from `doc_spotlight`.
(unstable, doc_notable_trait, "1.52.0", Some(45040), None), (unstable, doc_notable_trait, "1.52.0", Some(45040)),
/// Allows using the `may_dangle` attribute (RFC 1327). /// Allows using the `may_dangle` attribute (RFC 1327).
(unstable, dropck_eyepatch, "1.10.0", Some(34761), None), (unstable, dropck_eyepatch, "1.10.0", Some(34761)),
/// Allows using the `#[fundamental]` attribute. /// Allows using the `#[fundamental]` attribute.
(unstable, fundamental, "1.0.0", Some(29635), None), (unstable, fundamental, "1.0.0", Some(29635)),
/// Allows using `#[link_name="llvm.*"]`. /// Allows using `#[link_name="llvm.*"]`.
(internal, link_llvm_intrinsics, "1.0.0", Some(29602), None), (internal, link_llvm_intrinsics, "1.0.0", Some(29602)),
/// Allows using the `#[linkage = ".."]` attribute. /// Allows using the `#[linkage = ".."]` attribute.
(unstable, linkage, "1.0.0", Some(29603), None), (unstable, linkage, "1.0.0", Some(29603)),
/// Allows declaring with `#![needs_panic_runtime]` that a panic runtime is needed. /// Allows declaring with `#![needs_panic_runtime]` that a panic runtime is needed.
(internal, needs_panic_runtime, "1.10.0", Some(32837), None), (internal, needs_panic_runtime, "1.10.0", Some(32837)),
/// Allows using the `#![panic_runtime]` attribute. /// Allows using the `#![panic_runtime]` attribute.
(internal, panic_runtime, "1.10.0", Some(32837), None), (internal, panic_runtime, "1.10.0", Some(32837)),
/// Allows `extern "platform-intrinsic" { ... }`. /// Allows `extern "platform-intrinsic" { ... }`.
(internal, platform_intrinsics, "1.4.0", Some(27731), None), (internal, platform_intrinsics, "1.4.0", Some(27731)),
/// Allows using `#[rustc_allow_const_fn_unstable]`. /// Allows using `#[rustc_allow_const_fn_unstable]`.
/// This is an attribute on `const fn` for the same /// This is an attribute on `const fn` for the same
/// purpose as `#[allow_internal_unstable]`. /// purpose as `#[allow_internal_unstable]`.
(internal, rustc_allow_const_fn_unstable, "1.49.0", Some(69399), None), (internal, rustc_allow_const_fn_unstable, "1.49.0", Some(69399)),
/// Allows using compiler's own crates. /// Allows using compiler's own crates.
(unstable, rustc_private, "1.0.0", Some(27812), None), (unstable, rustc_private, "1.0.0", Some(27812)),
/// Allows using internal rustdoc features like `doc(keyword)`. /// Allows using internal rustdoc features like `doc(keyword)`.
(internal, rustdoc_internals, "1.58.0", Some(90418), None), (internal, rustdoc_internals, "1.58.0", Some(90418)),
/// Allows using the `rustdoc::missing_doc_code_examples` lint /// Allows using the `rustdoc::missing_doc_code_examples` lint
(unstable, rustdoc_missing_doc_code_examples, "1.31.0", Some(101730), None), (unstable, rustdoc_missing_doc_code_examples, "1.31.0", Some(101730)),
/// Allows using `#[start]` on a function indicating that it is the program entrypoint. /// Allows using `#[start]` on a function indicating that it is the program entrypoint.
(unstable, start, "1.0.0", Some(29633), None), (unstable, start, "1.0.0", Some(29633)),
/// Allows using `#[structural_match]` which indicates that a type is structurally matchable. /// Allows using `#[structural_match]` which indicates that a type is structurally matchable.
/// FIXME: Subsumed by trait `StructuralPartialEq`, cannot move to removed until a library /// FIXME: Subsumed by trait `StructuralPartialEq`, cannot move to removed until a library
/// feature with the same name exists. /// feature with the same name exists.
(unstable, structural_match, "1.8.0", Some(31434), None), (unstable, structural_match, "1.8.0", Some(31434)),
/// Allows using the `rust-call` ABI. /// Allows using the `rust-call` ABI.
(unstable, unboxed_closures, "1.0.0", Some(29625), None), (unstable, unboxed_closures, "1.0.0", Some(29625)),
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!
// Features are listed in alphabetical order. Tidy will fail if you don't keep it this way. // Features are listed in alphabetical order. Tidy will fail if you don't keep it this way.
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!
@ -299,21 +294,21 @@ declare_features! (
// FIXME: Document these and merge with the list below. // FIXME: Document these and merge with the list below.
// Unstable `#[target_feature]` directives. // Unstable `#[target_feature]` directives.
(unstable, aarch64_ver_target_feature, "1.27.0", Some(44839), None), (unstable, aarch64_ver_target_feature, "1.27.0", Some(44839)),
(unstable, arm_target_feature, "1.27.0", Some(44839), None), (unstable, arm_target_feature, "1.27.0", Some(44839)),
(unstable, avx512_target_feature, "1.27.0", Some(44839), None), (unstable, avx512_target_feature, "1.27.0", Some(44839)),
(unstable, bpf_target_feature, "1.54.0", Some(44839), None), (unstable, bpf_target_feature, "1.54.0", Some(44839)),
(unstable, csky_target_feature, "1.73.0", Some(44839), None), (unstable, csky_target_feature, "1.73.0", Some(44839)),
(unstable, ermsb_target_feature, "1.49.0", Some(44839), None), (unstable, ermsb_target_feature, "1.49.0", Some(44839)),
(unstable, hexagon_target_feature, "1.27.0", Some(44839), None), (unstable, hexagon_target_feature, "1.27.0", Some(44839)),
(unstable, loongarch_target_feature, "1.73.0", Some(44839), None), (unstable, loongarch_target_feature, "1.73.0", Some(44839)),
(unstable, mips_target_feature, "1.27.0", Some(44839), None), (unstable, mips_target_feature, "1.27.0", Some(44839)),
(unstable, powerpc_target_feature, "1.27.0", Some(44839), None), (unstable, powerpc_target_feature, "1.27.0", Some(44839)),
(unstable, riscv_target_feature, "1.45.0", Some(44839), None), (unstable, riscv_target_feature, "1.45.0", Some(44839)),
(unstable, rtm_target_feature, "1.35.0", Some(44839), None), (unstable, rtm_target_feature, "1.35.0", Some(44839)),
(unstable, sse4a_target_feature, "1.27.0", Some(44839), None), (unstable, sse4a_target_feature, "1.27.0", Some(44839)),
(unstable, tbm_target_feature, "1.27.0", Some(44839), None), (unstable, tbm_target_feature, "1.27.0", Some(44839)),
(unstable, wasm_target_feature, "1.30.0", Some(44839), None), (unstable, wasm_target_feature, "1.30.0", Some(44839)),
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!
// Features are listed in alphabetical order. Tidy will fail if you don't keep it this way. // Features are listed in alphabetical order. Tidy will fail if you don't keep it this way.
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!
@ -327,295 +322,295 @@ declare_features! (
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
/// Allows using the `amdgpu-kernel` ABI. /// Allows using the `amdgpu-kernel` ABI.
(unstable, abi_amdgpu_kernel, "1.29.0", Some(51575), None), (unstable, abi_amdgpu_kernel, "1.29.0", Some(51575)),
/// Allows `extern "avr-interrupt" fn()` and `extern "avr-non-blocking-interrupt" fn()`. /// Allows `extern "avr-interrupt" fn()` and `extern "avr-non-blocking-interrupt" fn()`.
(unstable, abi_avr_interrupt, "1.45.0", Some(69664), None), (unstable, abi_avr_interrupt, "1.45.0", Some(69664)),
/// Allows `extern "C-cmse-nonsecure-call" fn()`. /// Allows `extern "C-cmse-nonsecure-call" fn()`.
(unstable, abi_c_cmse_nonsecure_call, "1.51.0", Some(81391), None), (unstable, abi_c_cmse_nonsecure_call, "1.51.0", Some(81391)),
/// Allows `extern "msp430-interrupt" fn()`. /// Allows `extern "msp430-interrupt" fn()`.
(unstable, abi_msp430_interrupt, "1.16.0", Some(38487), None), (unstable, abi_msp430_interrupt, "1.16.0", Some(38487)),
/// Allows `extern "ptx-*" fn()`. /// Allows `extern "ptx-*" fn()`.
(unstable, abi_ptx, "1.15.0", Some(38788), None), (unstable, abi_ptx, "1.15.0", Some(38788)),
/// Allows `extern "riscv-interrupt-m" fn()` and `extern "riscv-interrupt-s" fn()`. /// Allows `extern "riscv-interrupt-m" fn()` and `extern "riscv-interrupt-s" fn()`.
(unstable, abi_riscv_interrupt, "1.73.0", Some(111889), None), (unstable, abi_riscv_interrupt, "1.73.0", Some(111889)),
/// Allows `extern "x86-interrupt" fn()`. /// Allows `extern "x86-interrupt" fn()`.
(unstable, abi_x86_interrupt, "1.17.0", Some(40180), None), (unstable, abi_x86_interrupt, "1.17.0", Some(40180)),
/// Allows additional const parameter types, such as `&'static str` or user defined types /// Allows additional const parameter types, such as `&'static str` or user defined types
(incomplete, adt_const_params, "1.56.0", Some(95174), None), (incomplete, adt_const_params, "1.56.0", Some(95174)),
/// Allows defining an `#[alloc_error_handler]`. /// Allows defining an `#[alloc_error_handler]`.
(unstable, alloc_error_handler, "1.29.0", Some(51540), None), (unstable, alloc_error_handler, "1.29.0", Some(51540)),
/// Allows trait methods with arbitrary self types. /// Allows trait methods with arbitrary self types.
(unstable, arbitrary_self_types, "1.23.0", Some(44874), None), (unstable, arbitrary_self_types, "1.23.0", Some(44874)),
/// Allows using `const` operands in inline assembly. /// Allows using `const` operands in inline assembly.
(unstable, asm_const, "1.58.0", Some(93332), None), (unstable, asm_const, "1.58.0", Some(93332)),
/// Enables experimental inline assembly support for additional architectures. /// Enables experimental inline assembly support for additional architectures.
(unstable, asm_experimental_arch, "1.58.0", Some(93335), None), (unstable, asm_experimental_arch, "1.58.0", Some(93335)),
/// Allows the `may_unwind` option in inline assembly. /// Allows the `may_unwind` option in inline assembly.
(unstable, asm_unwind, "1.58.0", Some(93334), None), (unstable, asm_unwind, "1.58.0", Some(93334)),
/// Allows users to enforce equality of associated constants `TraitImpl<AssocConst=3>`. /// Allows users to enforce equality of associated constants `TraitImpl<AssocConst=3>`.
(unstable, associated_const_equality, "1.58.0", Some(92827), None), (unstable, associated_const_equality, "1.58.0", Some(92827)),
/// Allows the user of associated type bounds. /// Allows the user of associated type bounds.
(unstable, associated_type_bounds, "1.34.0", Some(52662), None), (unstable, associated_type_bounds, "1.34.0", Some(52662)),
/// Allows associated type defaults. /// Allows associated type defaults.
(unstable, associated_type_defaults, "1.2.0", Some(29661), None), (unstable, associated_type_defaults, "1.2.0", Some(29661)),
/// Allows `async || body` closures. /// Allows `async || body` closures.
(unstable, async_closure, "1.37.0", Some(62290), None), (unstable, async_closure, "1.37.0", Some(62290)),
/// Allows `#[track_caller]` on async functions. /// Allows `#[track_caller]` on async functions.
(unstable, async_fn_track_caller, "1.73.0", Some(110011), None), (unstable, async_fn_track_caller, "1.73.0", Some(110011)),
/// Allows builtin # foo() syntax /// Allows builtin # foo() syntax
(unstable, builtin_syntax, "1.71.0", Some(110680), None), (unstable, builtin_syntax, "1.71.0", Some(110680)),
/// Treat `extern "C"` function as nounwind. /// Treat `extern "C"` function as nounwind.
(unstable, c_unwind, "1.52.0", Some(74990), None), (unstable, c_unwind, "1.52.0", Some(74990)),
/// Allows using C-variadics. /// Allows using C-variadics.
(unstable, c_variadic, "1.34.0", Some(44930), None), (unstable, c_variadic, "1.34.0", Some(44930)),
/// Allows the use of `#[cfg(overflow_checks)` to check if integer overflow behaviour. /// Allows the use of `#[cfg(overflow_checks)` to check if integer overflow behaviour.
(unstable, cfg_overflow_checks, "1.71.0", Some(111466), None), (unstable, cfg_overflow_checks, "1.71.0", Some(111466)),
/// Provides the relocation model information as cfg entry /// Provides the relocation model information as cfg entry
(unstable, cfg_relocation_model, "1.73.0", Some(114929), None), (unstable, cfg_relocation_model, "1.73.0", Some(114929)),
/// Allows the use of `#[cfg(sanitize = "option")]`; set when -Zsanitizer is used. /// Allows the use of `#[cfg(sanitize = "option")]`; set when -Zsanitizer is used.
(unstable, cfg_sanitize, "1.41.0", Some(39699), None), (unstable, cfg_sanitize, "1.41.0", Some(39699)),
/// Allows `cfg(target_abi = "...")`. /// Allows `cfg(target_abi = "...")`.
(unstable, cfg_target_abi, "1.55.0", Some(80970), None), (unstable, cfg_target_abi, "1.55.0", Some(80970)),
/// Allows `cfg(target(abi = "..."))`. /// Allows `cfg(target(abi = "..."))`.
(unstable, cfg_target_compact, "1.63.0", Some(96901), None), (unstable, cfg_target_compact, "1.63.0", Some(96901)),
/// Allows `cfg(target_has_atomic_load_store = "...")`. /// Allows `cfg(target_has_atomic_load_store = "...")`.
(unstable, cfg_target_has_atomic, "1.60.0", Some(94039), None), (unstable, cfg_target_has_atomic, "1.60.0", Some(94039)),
/// Allows `cfg(target_has_atomic_equal_alignment = "...")`. /// Allows `cfg(target_has_atomic_equal_alignment = "...")`.
(unstable, cfg_target_has_atomic_equal_alignment, "1.60.0", Some(93822), None), (unstable, cfg_target_has_atomic_equal_alignment, "1.60.0", Some(93822)),
/// Allows `cfg(target_thread_local)`. /// Allows `cfg(target_thread_local)`.
(unstable, cfg_target_thread_local, "1.7.0", Some(29594), None), (unstable, cfg_target_thread_local, "1.7.0", Some(29594)),
/// Allow conditional compilation depending on rust version /// Allow conditional compilation depending on rust version
(unstable, cfg_version, "1.45.0", Some(64796), None), (unstable, cfg_version, "1.45.0", Some(64796)),
/// Allows to use the `#[cfi_encoding = ""]` attribute. /// Allows to use the `#[cfi_encoding = ""]` attribute.
(unstable, cfi_encoding, "1.71.0", Some(89653), None), (unstable, cfi_encoding, "1.71.0", Some(89653)),
/// Allows `for<...>` on closures and coroutines. /// Allows `for<...>` on closures and coroutines.
(unstable, closure_lifetime_binder, "1.64.0", Some(97362), None), (unstable, closure_lifetime_binder, "1.64.0", Some(97362)),
/// Allows `#[track_caller]` on closures and coroutines. /// Allows `#[track_caller]` on closures and coroutines.
(unstable, closure_track_caller, "1.57.0", Some(87417), None), (unstable, closure_track_caller, "1.57.0", Some(87417)),
/// Allows to use the `#[cmse_nonsecure_entry]` attribute. /// Allows to use the `#[cmse_nonsecure_entry]` attribute.
(unstable, cmse_nonsecure_entry, "1.48.0", Some(75835), None), (unstable, cmse_nonsecure_entry, "1.48.0", Some(75835)),
/// Allows use of the `#[collapse_debuginfo]` attribute. /// Allows use of the `#[collapse_debuginfo]` attribute.
(unstable, collapse_debuginfo, "1.65.0", Some(100758), None), (unstable, collapse_debuginfo, "1.65.0", Some(100758)),
/// Allows `async {}` expressions in const contexts. /// Allows `async {}` expressions in const contexts.
(unstable, const_async_blocks, "1.53.0", Some(85368), None), (unstable, const_async_blocks, "1.53.0", Some(85368)),
/// Allows `const || {}` closures in const contexts. /// Allows `const || {}` closures in const contexts.
(incomplete, const_closures, "1.68.0", Some(106003), None), (incomplete, const_closures, "1.68.0", Some(106003)),
/// Allows the definition of `const extern fn` and `const unsafe extern fn`. /// Allows the definition of `const extern fn` and `const unsafe extern fn`.
(unstable, const_extern_fn, "1.40.0", Some(64926), None), (unstable, const_extern_fn, "1.40.0", Some(64926)),
/// Allows basic arithmetic on floating point types in a `const fn`. /// Allows basic arithmetic on floating point types in a `const fn`.
(unstable, const_fn_floating_point_arithmetic, "1.48.0", Some(57241), None), (unstable, const_fn_floating_point_arithmetic, "1.48.0", Some(57241)),
/// Allows `for _ in _` loops in const contexts. /// Allows `for _ in _` loops in const contexts.
(unstable, const_for, "1.56.0", Some(87575), None), (unstable, const_for, "1.56.0", Some(87575)),
/// Allows using `&mut` in constant functions. /// Allows using `&mut` in constant functions.
(unstable, const_mut_refs, "1.41.0", Some(57349), None), (unstable, const_mut_refs, "1.41.0", Some(57349)),
/// Be more precise when looking for live drops in a const context. /// Be more precise when looking for live drops in a const context.
(unstable, const_precise_live_drops, "1.46.0", Some(73255), None), (unstable, const_precise_live_drops, "1.46.0", Some(73255)),
/// Allows references to types with interior mutability within constants /// Allows references to types with interior mutability within constants
(unstable, const_refs_to_cell, "1.51.0", Some(80384), None), (unstable, const_refs_to_cell, "1.51.0", Some(80384)),
/// Allows `impl const Trait for T` syntax. /// Allows `impl const Trait for T` syntax.
(unstable, const_trait_impl, "1.42.0", Some(67792), None), (unstable, const_trait_impl, "1.42.0", Some(67792)),
/// Allows the `?` operator in const contexts. /// Allows the `?` operator in const contexts.
(unstable, const_try, "1.56.0", Some(74935), None), (unstable, const_try, "1.56.0", Some(74935)),
/// Allows coroutines to be cloned. /// Allows coroutines to be cloned.
(unstable, coroutine_clone, "1.65.0", Some(95360), None), (unstable, coroutine_clone, "1.65.0", Some(95360)),
/// Allows defining coroutines. /// Allows defining coroutines.
(unstable, coroutines, "1.21.0", Some(43122), None), (unstable, coroutines, "1.21.0", Some(43122)),
/// Allows function attribute `#[coverage(on/off)]`, to control coverage /// Allows function attribute `#[coverage(on/off)]`, to control coverage
/// instrumentation of that function. /// instrumentation of that function.
(unstable, coverage_attribute, "1.74.0", Some(84605), None), (unstable, coverage_attribute, "1.74.0", Some(84605)),
/// Allows users to provide classes for fenced code block using `class:classname`. /// Allows users to provide classes for fenced code block using `class:classname`.
(unstable, custom_code_classes_in_docs, "1.74.0", Some(79483), None), (unstable, custom_code_classes_in_docs, "1.74.0", Some(79483)),
/// Allows non-builtin attributes in inner attribute position. /// Allows non-builtin attributes in inner attribute position.
(unstable, custom_inner_attributes, "1.30.0", Some(54726), None), (unstable, custom_inner_attributes, "1.30.0", Some(54726)),
/// Allows custom test frameworks with `#![test_runner]` and `#[test_case]`. /// Allows custom test frameworks with `#![test_runner]` and `#[test_case]`.
(unstable, custom_test_frameworks, "1.30.0", Some(50297), None), (unstable, custom_test_frameworks, "1.30.0", Some(50297)),
/// Allows declarative macros 2.0 (`macro`). /// Allows declarative macros 2.0 (`macro`).
(unstable, decl_macro, "1.17.0", Some(39412), None), (unstable, decl_macro, "1.17.0", Some(39412)),
/// Allows default type parameters to influence type inference. /// Allows default type parameters to influence type inference.
(unstable, default_type_parameter_fallback, "1.3.0", Some(27336), None), (unstable, default_type_parameter_fallback, "1.3.0", Some(27336)),
/// Allows using `#[deprecated_safe]` to deprecate the safeness of a function or trait /// Allows using `#[deprecated_safe]` to deprecate the safeness of a function or trait
(unstable, deprecated_safe, "1.61.0", Some(94978), None), (unstable, deprecated_safe, "1.61.0", Some(94978)),
/// Allows having using `suggestion` in the `#[deprecated]` attribute. /// Allows having using `suggestion` in the `#[deprecated]` attribute.
(unstable, deprecated_suggestion, "1.61.0", Some(94785), None), (unstable, deprecated_suggestion, "1.61.0", Some(94785)),
/// Allows using the `#[diagnostic]` attribute tool namespace /// Allows using the `#[diagnostic]` attribute tool namespace
(unstable, diagnostic_namespace, "1.73.0", Some(111996), None), (unstable, diagnostic_namespace, "1.73.0", Some(111996)),
/// Controls errors in trait implementations. /// Controls errors in trait implementations.
(unstable, do_not_recommend, "1.67.0", Some(51992), None), (unstable, do_not_recommend, "1.67.0", Some(51992)),
/// Tells rustdoc to automatically generate `#[doc(cfg(...))]`. /// Tells rustdoc to automatically generate `#[doc(cfg(...))]`.
(unstable, doc_auto_cfg, "1.58.0", Some(43781), None), (unstable, doc_auto_cfg, "1.58.0", Some(43781)),
/// Allows `#[doc(cfg(...))]`. /// Allows `#[doc(cfg(...))]`.
(unstable, doc_cfg, "1.21.0", Some(43781), None), (unstable, doc_cfg, "1.21.0", Some(43781)),
/// Allows `#[doc(cfg_hide(...))]`. /// Allows `#[doc(cfg_hide(...))]`.
(unstable, doc_cfg_hide, "1.57.0", Some(43781), None), (unstable, doc_cfg_hide, "1.57.0", Some(43781)),
/// Allows `#[doc(masked)]`. /// Allows `#[doc(masked)]`.
(unstable, doc_masked, "1.21.0", Some(44027), None), (unstable, doc_masked, "1.21.0", Some(44027)),
/// Allows `dyn* Trait` objects. /// Allows `dyn* Trait` objects.
(incomplete, dyn_star, "1.65.0", Some(102425), None), (incomplete, dyn_star, "1.65.0", Some(102425)),
// Uses generic effect parameters for ~const bounds // Uses generic effect parameters for ~const bounds
(unstable, effects, "1.72.0", Some(102090), None), (unstable, effects, "1.72.0", Some(102090)),
/// Allows `X..Y` patterns. /// Allows `X..Y` patterns.
(unstable, exclusive_range_pattern, "1.11.0", Some(37854), None), (unstable, exclusive_range_pattern, "1.11.0", Some(37854)),
/// Allows exhaustive pattern matching on types that contain uninhabited types. /// Allows exhaustive pattern matching on types that contain uninhabited types.
(unstable, exhaustive_patterns, "1.13.0", Some(51085), None), (unstable, exhaustive_patterns, "1.13.0", Some(51085)),
/// Allows explicit tail calls via `become` expression. /// Allows explicit tail calls via `become` expression.
(incomplete, explicit_tail_calls, "1.72.0", Some(112788), None), (incomplete, explicit_tail_calls, "1.72.0", Some(112788)),
/// Allows using `efiapi`, `sysv64` and `win64` as calling convention /// Allows using `efiapi`, `sysv64` and `win64` as calling convention
/// for functions with varargs. /// for functions with varargs.
(unstable, extended_varargs_abi_support, "1.65.0", Some(100189), None), (unstable, extended_varargs_abi_support, "1.65.0", Some(100189)),
/// Allows defining `extern type`s. /// Allows defining `extern type`s.
(unstable, extern_types, "1.23.0", Some(43467), None), (unstable, extern_types, "1.23.0", Some(43467)),
/// Allows the use of `#[ffi_const]` on foreign functions. /// Allows the use of `#[ffi_const]` on foreign functions.
(unstable, ffi_const, "1.45.0", Some(58328), None), (unstable, ffi_const, "1.45.0", Some(58328)),
/// Allows the use of `#[ffi_pure]` on foreign functions. /// Allows the use of `#[ffi_pure]` on foreign functions.
(unstable, ffi_pure, "1.45.0", Some(58329), None), (unstable, ffi_pure, "1.45.0", Some(58329)),
/// Allows using `#[ffi_returns_twice]` on foreign functions. /// Allows using `#[ffi_returns_twice]` on foreign functions.
(unstable, ffi_returns_twice, "1.34.0", Some(58314), None), (unstable, ffi_returns_twice, "1.34.0", Some(58314)),
/// Allows using `#[repr(align(...))]` on function items /// Allows using `#[repr(align(...))]` on function items
(unstable, fn_align, "1.53.0", Some(82232), None), (unstable, fn_align, "1.53.0", Some(82232)),
/// Support delegating implementation of functions to other already implemented functions. /// Support delegating implementation of functions to other already implemented functions.
(incomplete, fn_delegation, "CURRENT_RUSTC_VERSION", Some(118212), None), (incomplete, fn_delegation, "CURRENT_RUSTC_VERSION", Some(118212)),
/// Allows defining gen blocks and `gen fn`. /// Allows defining gen blocks and `gen fn`.
(unstable, gen_blocks, "1.75.0", Some(117078), None), (unstable, gen_blocks, "1.75.0", Some(117078)),
/// Infer generic args for both consts and types. /// Infer generic args for both consts and types.
(unstable, generic_arg_infer, "1.55.0", Some(85077), None), (unstable, generic_arg_infer, "1.55.0", Some(85077)),
/// An extension to the `generic_associated_types` feature, allowing incomplete features. /// An extension to the `generic_associated_types` feature, allowing incomplete features.
(incomplete, generic_associated_types_extended, "1.61.0", Some(95451), None), (incomplete, generic_associated_types_extended, "1.61.0", Some(95451)),
/// Allows non-trivial generic constants which have to have wfness manually propagated to callers /// Allows non-trivial generic constants which have to have wfness manually propagated to callers
(incomplete, generic_const_exprs, "1.56.0", Some(76560), None), (incomplete, generic_const_exprs, "1.56.0", Some(76560)),
/// Allows generic parameters and where-clauses on free & associated const items. /// Allows generic parameters and where-clauses on free & associated const items.
(incomplete, generic_const_items, "1.73.0", Some(113521), None), (incomplete, generic_const_items, "1.73.0", Some(113521)),
/// Allows using `..=X` as a patterns in slices. /// Allows using `..=X` as a patterns in slices.
(unstable, half_open_range_patterns_in_slices, "1.66.0", Some(67264), None), (unstable, half_open_range_patterns_in_slices, "1.66.0", Some(67264)),
/// Allows `if let` guard in match arms. /// Allows `if let` guard in match arms.
(unstable, if_let_guard, "1.47.0", Some(51114), None), (unstable, if_let_guard, "1.47.0", Some(51114)),
/// Allows `impl Trait` to be used inside associated types (RFC 2515). /// Allows `impl Trait` to be used inside associated types (RFC 2515).
(unstable, impl_trait_in_assoc_type, "1.70.0", Some(63063), None), (unstable, impl_trait_in_assoc_type, "1.70.0", Some(63063)),
/// Allows `impl Trait` as output type in `Fn` traits in return position of functions. /// Allows `impl Trait` as output type in `Fn` traits in return position of functions.
(unstable, impl_trait_in_fn_trait_return, "1.64.0", Some(99697), None), (unstable, impl_trait_in_fn_trait_return, "1.64.0", Some(99697)),
/// Allows using imported `main` function /// Allows using imported `main` function
(unstable, imported_main, "1.53.0", Some(28937), None), (unstable, imported_main, "1.53.0", Some(28937)),
/// Allows associated types in inherent impls. /// Allows associated types in inherent impls.
(incomplete, inherent_associated_types, "1.52.0", Some(8995), None), (incomplete, inherent_associated_types, "1.52.0", Some(8995)),
/// Allow anonymous constants from an inline `const` block /// Allow anonymous constants from an inline `const` block
(unstable, inline_const, "1.49.0", Some(76001), None), (unstable, inline_const, "1.49.0", Some(76001)),
/// Allow anonymous constants from an inline `const` block in pattern position /// Allow anonymous constants from an inline `const` block in pattern position
(incomplete, inline_const_pat, "1.58.0", Some(76001), None), (incomplete, inline_const_pat, "1.58.0", Some(76001)),
/// Allows using `pointer` and `reference` in intra-doc links /// Allows using `pointer` and `reference` in intra-doc links
(unstable, intra_doc_pointers, "1.51.0", Some(80896), None), (unstable, intra_doc_pointers, "1.51.0", Some(80896)),
// Allows setting the threshold for the `large_assignments` lint. // Allows setting the threshold for the `large_assignments` lint.
(unstable, large_assignments, "1.52.0", Some(83518), None), (unstable, large_assignments, "1.52.0", Some(83518)),
/// Allow to have type alias types for inter-crate use. /// Allow to have type alias types for inter-crate use.
(incomplete, lazy_type_alias, "1.72.0", Some(112792), None), (incomplete, lazy_type_alias, "1.72.0", Some(112792)),
/// Allows `if/while p && let q = r && ...` chains. /// Allows `if/while p && let q = r && ...` chains.
(unstable, let_chains, "1.37.0", Some(53667), None), (unstable, let_chains, "1.37.0", Some(53667)),
/// Allows using `#[link(kind = "link-arg", name = "...")]` /// Allows using `#[link(kind = "link-arg", name = "...")]`
/// to pass custom arguments to the linker. /// to pass custom arguments to the linker.
(unstable, link_arg_attribute, "CURRENT_RUSTC_VERSION", Some(99427), None), (unstable, link_arg_attribute, "CURRENT_RUSTC_VERSION", Some(99427)),
/// Allows using `reason` in lint attributes and the `#[expect(lint)]` lint check. /// Allows using `reason` in lint attributes and the `#[expect(lint)]` lint check.
(unstable, lint_reasons, "1.31.0", Some(54503), None), (unstable, lint_reasons, "1.31.0", Some(54503)),
/// Give access to additional metadata about declarative macro meta-variables. /// Give access to additional metadata about declarative macro meta-variables.
(unstable, macro_metavar_expr, "1.61.0", Some(83527), None), (unstable, macro_metavar_expr, "1.61.0", Some(83527)),
/// Allows `#[marker]` on certain traits allowing overlapping implementations. /// Allows `#[marker]` on certain traits allowing overlapping implementations.
(unstable, marker_trait_attr, "1.30.0", Some(29864), None), (unstable, marker_trait_attr, "1.30.0", Some(29864)),
/// A minimal, sound subset of specialization intended to be used by the /// A minimal, sound subset of specialization intended to be used by the
/// standard library until the soundness issues with specialization /// standard library until the soundness issues with specialization
/// are fixed. /// are fixed.
(unstable, min_specialization, "1.7.0", Some(31844), None), (unstable, min_specialization, "1.7.0", Some(31844)),
/// Allows qualified paths in struct expressions, struct patterns and tuple struct patterns. /// Allows qualified paths in struct expressions, struct patterns and tuple struct patterns.
(unstable, more_qualified_paths, "1.54.0", Some(86935), None), (unstable, more_qualified_paths, "1.54.0", Some(86935)),
/// Allows the `#[must_not_suspend]` attribute. /// Allows the `#[must_not_suspend]` attribute.
(unstable, must_not_suspend, "1.57.0", Some(83310), None), (unstable, must_not_suspend, "1.57.0", Some(83310)),
/// Allows using `#[naked]` on functions. /// Allows using `#[naked]` on functions.
(unstable, naked_functions, "1.9.0", Some(32408), None), (unstable, naked_functions, "1.9.0", Some(32408)),
/// Allows specifying the as-needed link modifier /// Allows specifying the as-needed link modifier
(unstable, native_link_modifiers_as_needed, "1.53.0", Some(81490), None), (unstable, native_link_modifiers_as_needed, "1.53.0", Some(81490)),
/// Allow negative trait implementations. /// Allow negative trait implementations.
(unstable, negative_impls, "1.44.0", Some(68318), None), (unstable, negative_impls, "1.44.0", Some(68318)),
/// Allows the `!` pattern. /// Allows the `!` pattern.
(incomplete, never_patterns, "CURRENT_RUSTC_VERSION", Some(118155), None), (incomplete, never_patterns, "CURRENT_RUSTC_VERSION", Some(118155)),
/// Allows the `!` type. Does not imply 'exhaustive_patterns' (below) any more. /// Allows the `!` type. Does not imply 'exhaustive_patterns' (below) any more.
(unstable, never_type, "1.13.0", Some(35121), None), (unstable, never_type, "1.13.0", Some(35121)),
/// Allows diverging expressions to fall back to `!` rather than `()`. /// Allows diverging expressions to fall back to `!` rather than `()`.
(unstable, never_type_fallback, "1.41.0", Some(65992), None), (unstable, never_type_fallback, "1.41.0", Some(65992)),
/// Allows `#![no_core]`. /// Allows `#![no_core]`.
(unstable, no_core, "1.3.0", Some(29639), None), (unstable, no_core, "1.3.0", Some(29639)),
/// Allows the use of `no_sanitize` attribute. /// Allows the use of `no_sanitize` attribute.
(unstable, no_sanitize, "1.42.0", Some(39699), None), (unstable, no_sanitize, "1.42.0", Some(39699)),
/// Allows using the `non_exhaustive_omitted_patterns` lint. /// Allows using the `non_exhaustive_omitted_patterns` lint.
(unstable, non_exhaustive_omitted_patterns_lint, "1.57.0", Some(89554), None), (unstable, non_exhaustive_omitted_patterns_lint, "1.57.0", Some(89554)),
/// Allows `for<T>` binders in where-clauses /// Allows `for<T>` binders in where-clauses
(incomplete, non_lifetime_binders, "1.69.0", Some(108185), None), (incomplete, non_lifetime_binders, "1.69.0", Some(108185)),
/// Allows making `dyn Trait` well-formed even if `Trait` is not object safe. /// Allows making `dyn Trait` well-formed even if `Trait` is not object safe.
/// In that case, `dyn Trait: Trait` does not hold. Moreover, coercions and /// In that case, `dyn Trait: Trait` does not hold. Moreover, coercions and
/// casts in safe Rust to `dyn Trait` for such a `Trait` is also forbidden. /// casts in safe Rust to `dyn Trait` for such a `Trait` is also forbidden.
(unstable, object_safe_for_dispatch, "1.40.0", Some(43561), None), (unstable, object_safe_for_dispatch, "1.40.0", Some(43561)),
/// Allows using enums in offset_of! /// Allows using enums in offset_of!
(unstable, offset_of_enum, "1.75.0", Some(106655), None), (unstable, offset_of_enum, "1.75.0", Some(106655)),
/// Allows using `#[optimize(X)]`. /// Allows using `#[optimize(X)]`.
(unstable, optimize_attribute, "1.34.0", Some(54882), None), (unstable, optimize_attribute, "1.34.0", Some(54882)),
/// Allows macro attributes on expressions, statements and non-inline modules. /// Allows macro attributes on expressions, statements and non-inline modules.
(unstable, proc_macro_hygiene, "1.30.0", Some(54727), None), (unstable, proc_macro_hygiene, "1.30.0", Some(54727)),
/// Allows `&raw const $place_expr` and `&raw mut $place_expr` expressions. /// Allows `&raw const $place_expr` and `&raw mut $place_expr` expressions.
(unstable, raw_ref_op, "1.41.0", Some(64490), None), (unstable, raw_ref_op, "1.41.0", Some(64490)),
/// Allows using the `#[register_tool]` attribute. /// Allows using the `#[register_tool]` attribute.
(unstable, register_tool, "1.41.0", Some(66079), None), (unstable, register_tool, "1.41.0", Some(66079)),
/// Allows the `#[repr(i128)]` attribute for enums. /// Allows the `#[repr(i128)]` attribute for enums.
(incomplete, repr128, "1.16.0", Some(56071), None), (incomplete, repr128, "1.16.0", Some(56071)),
/// Allows `repr(simd)` and importing the various simd intrinsics. /// Allows `repr(simd)` and importing the various simd intrinsics.
(unstable, repr_simd, "1.4.0", Some(27731), None), (unstable, repr_simd, "1.4.0", Some(27731)),
/// Allows bounding the return type of AFIT/RPITIT. /// Allows bounding the return type of AFIT/RPITIT.
(incomplete, return_type_notation, "1.70.0", Some(109417), None), (incomplete, return_type_notation, "1.70.0", Some(109417)),
/// Allows `extern "rust-cold"`. /// Allows `extern "rust-cold"`.
(unstable, rust_cold_cc, "1.63.0", Some(97544), None), (unstable, rust_cold_cc, "1.63.0", Some(97544)),
/// Allows the use of SIMD types in functions declared in `extern` blocks. /// Allows the use of SIMD types in functions declared in `extern` blocks.
(unstable, simd_ffi, "1.0.0", Some(27731), None), (unstable, simd_ffi, "1.0.0", Some(27731)),
/// Allows specialization of implementations (RFC 1210). /// Allows specialization of implementations (RFC 1210).
(incomplete, specialization, "1.7.0", Some(31844), None), (incomplete, specialization, "1.7.0", Some(31844)),
/// Allows attributes on expressions and non-item statements. /// Allows attributes on expressions and non-item statements.
(unstable, stmt_expr_attributes, "1.6.0", Some(15701), None), (unstable, stmt_expr_attributes, "1.6.0", Some(15701)),
/// Allows lints part of the strict provenance effort. /// Allows lints part of the strict provenance effort.
(unstable, strict_provenance, "1.61.0", Some(95228), None), (unstable, strict_provenance, "1.61.0", Some(95228)),
/// Allows string patterns to dereference values to match them. /// Allows string patterns to dereference values to match them.
(unstable, string_deref_patterns, "1.67.0", Some(87121), None), (unstable, string_deref_patterns, "1.67.0", Some(87121)),
/// Allows the use of `#[target_feature]` on safe functions. /// Allows the use of `#[target_feature]` on safe functions.
(unstable, target_feature_11, "1.45.0", Some(69098), None), (unstable, target_feature_11, "1.45.0", Some(69098)),
/// Allows using `#[thread_local]` on `static` items. /// Allows using `#[thread_local]` on `static` items.
(unstable, thread_local, "1.0.0", Some(29594), None), (unstable, thread_local, "1.0.0", Some(29594)),
/// Allows defining `trait X = A + B;` alias items. /// Allows defining `trait X = A + B;` alias items.
(unstable, trait_alias, "1.24.0", Some(41517), None), (unstable, trait_alias, "1.24.0", Some(41517)),
/// Allows for transmuting between arrays with sizes that contain generic consts. /// Allows for transmuting between arrays with sizes that contain generic consts.
(unstable, transmute_generic_consts, "1.70.0", Some(109929), None), (unstable, transmute_generic_consts, "1.70.0", Some(109929)),
/// Allows #[repr(transparent)] on unions (RFC 2645). /// Allows #[repr(transparent)] on unions (RFC 2645).
(unstable, transparent_unions, "1.37.0", Some(60405), None), (unstable, transparent_unions, "1.37.0", Some(60405)),
/// Allows inconsistent bounds in where clauses. /// Allows inconsistent bounds in where clauses.
(unstable, trivial_bounds, "1.28.0", Some(48214), None), (unstable, trivial_bounds, "1.28.0", Some(48214)),
/// Allows using `try {...}` expressions. /// Allows using `try {...}` expressions.
(unstable, try_blocks, "1.29.0", Some(31436), None), (unstable, try_blocks, "1.29.0", Some(31436)),
/// Allows `impl Trait` to be used inside type aliases (RFC 2515). /// Allows `impl Trait` to be used inside type aliases (RFC 2515).
(unstable, type_alias_impl_trait, "1.38.0", Some(63063), None), (unstable, type_alias_impl_trait, "1.38.0", Some(63063)),
/// Allows the use of type ascription in expressions. /// Allows the use of type ascription in expressions.
(unstable, type_ascription, "1.6.0", Some(23416), None), (unstable, type_ascription, "1.6.0", Some(23416)),
/// Allows creation of instances of a struct by moving fields that have /// Allows creation of instances of a struct by moving fields that have
/// not changed from prior instances of the same struct (RFC #2528) /// not changed from prior instances of the same struct (RFC #2528)
(unstable, type_changing_struct_update, "1.58.0", Some(86555), None), (unstable, type_changing_struct_update, "1.58.0", Some(86555)),
/// Allows using type privacy lints (`private_interfaces`, `private_bounds`, `unnameable_types`). /// Allows using type privacy lints (`private_interfaces`, `private_bounds`, `unnameable_types`).
(unstable, type_privacy_lints, "1.72.0", Some(48054), None), (unstable, type_privacy_lints, "1.72.0", Some(48054)),
/// Enables rustc to generate code that instructs libstd to NOT ignore SIGPIPE. /// Enables rustc to generate code that instructs libstd to NOT ignore SIGPIPE.
(unstable, unix_sigpipe, "1.65.0", Some(97889), None), (unstable, unix_sigpipe, "1.65.0", Some(97889)),
/// Allows unnamed fields of struct and union type /// Allows unnamed fields of struct and union type
(incomplete, unnamed_fields, "1.74.0", Some(49804), None), (incomplete, unnamed_fields, "1.74.0", Some(49804)),
/// Allows unsized fn parameters. /// Allows unsized fn parameters.
(unstable, unsized_fn_params, "1.49.0", Some(48055), None), (unstable, unsized_fn_params, "1.49.0", Some(48055)),
/// Allows unsized rvalues at arguments and parameters. /// Allows unsized rvalues at arguments and parameters.
(incomplete, unsized_locals, "1.30.0", Some(48055), None), (incomplete, unsized_locals, "1.30.0", Some(48055)),
/// Allows unsized tuple coercion. /// Allows unsized tuple coercion.
(unstable, unsized_tuple_coercion, "1.20.0", Some(42877), None), (unstable, unsized_tuple_coercion, "1.20.0", Some(42877)),
/// Allows using the `#[used(linker)]` (or `#[used(compiler)]`) attribute. /// Allows using the `#[used(linker)]` (or `#[used(compiler)]`) attribute.
(unstable, used_with_arg, "1.60.0", Some(93798), None), (unstable, used_with_arg, "1.60.0", Some(93798)),
/// Allows `extern "wasm" fn` /// Allows `extern "wasm" fn`
(unstable, wasm_abi, "1.53.0", Some(83788), None), (unstable, wasm_abi, "1.53.0", Some(83788)),
/// Allows `do yeet` expressions /// Allows `do yeet` expressions
(unstable, yeet_expr, "1.62.0", Some(96373), None), (unstable, yeet_expr, "1.62.0", Some(96373)),
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!
// Features are listed in alphabetical order. Tidy will fail if you don't keep it this way. // Features are listed in alphabetical order. Tidy will fail if you don't keep it this way.
// !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! // !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!! !!!!

View File

@ -1,4 +1,3 @@
use crate::symbol::{sym, Symbol};
use std::fmt; use std::fmt;
use std::str::FromStr; use std::str::FromStr;
@ -58,15 +57,6 @@ impl Edition {
} }
} }
pub fn feature_name(self) -> Symbol {
match self {
Edition::Edition2015 => sym::rust_2015_preview,
Edition::Edition2018 => sym::rust_2018_preview,
Edition::Edition2021 => sym::rust_2021_preview,
Edition::Edition2024 => sym::rust_2024_preview,
}
}
pub fn is_stable(self) -> bool { pub fn is_stable(self) -> bool {
match self { match self {
Edition::Edition2015 => true, Edition::Edition2015 => true,

View File

@ -1350,13 +1350,10 @@ symbols! {
rtm_target_feature, rtm_target_feature,
rust, rust,
rust_2015, rust_2015,
rust_2015_preview,
rust_2018, rust_2018,
rust_2018_preview, rust_2018_preview,
rust_2021, rust_2021,
rust_2021_preview,
rust_2024, rust_2024,
rust_2024_preview,
rust_begin_unwind, rust_begin_unwind,
rust_cold_cc, rust_cold_cc,
rust_eh_catch_typeinfo, rust_eh_catch_typeinfo,

View File

@ -1,5 +1,5 @@
// rustfmt-edition: 2015 // rustfmt-edition: 2015
#![feature(rust_2018_preview, uniform_paths)] #![feature(uniform_paths)]
use futures::prelude::*; use futures::prelude::*;
use http_03::cli::Cli; use http_03::cli::Cli;
use hyper::{service::service_fn_ok, Body, Response, Server}; use hyper::{service::service_fn_ok, Body, Response, Server};

View File

@ -1,5 +1,5 @@
// rustfmt-edition: 2018 // rustfmt-edition: 2018
#![feature(rust_2018_preview, uniform_paths)] #![feature(uniform_paths)]
use futures::prelude::*; use futures::prelude::*;
use http_03::cli::Cli; use http_03::cli::Cli;
use hyper::{service::service_fn_ok, Body, Response, Server}; use hyper::{service::service_fn_ok, Body, Response, Server};

View File

@ -1,5 +1,5 @@
// rustfmt-edition: 2015 // rustfmt-edition: 2015
#![feature(rust_2018_preview, uniform_paths)] #![feature(uniform_paths)]
use futures::prelude::*; use futures::prelude::*;
use http_03::cli::Cli; use http_03::cli::Cli;
use hyper::{service::service_fn_ok, Body, Response, Server}; use hyper::{service::service_fn_ok, Body, Response, Server};

View File

@ -1,5 +1,5 @@
// rustfmt-edition: 2018 // rustfmt-edition: 2018
#![feature(rust_2018_preview, uniform_paths)] #![feature(uniform_paths)]
use ::log::{error, info, log}; use ::log::{error, info, log};
use futures::prelude::*; use futures::prelude::*;
use http_03::cli::Cli; use http_03::cli::Cli;

View File

@ -1,5 +0,0 @@
// check-pass
#![feature(rust_2018_preview)]
fn main() {}

View File

@ -1,7 +0,0 @@
// edition:2018
// check-pass
#![feature(rust_2018_preview)]
//~^ WARN the feature `rust_2018_preview` is included in the Rust 2018 edition
fn main() {}

View File

@ -1,9 +0,0 @@
warning[E0705]: the feature `rust_2018_preview` is included in the Rust 2018 edition
--> $DIR/edition-feature-redundant.rs:4:12
|
LL | #![feature(rust_2018_preview)]
| ^^^^^^^^^^^^^^^^^
warning: 1 warning emitted
For more information about this error, try `rustc --explain E0705`.

View File

@ -1,15 +0,0 @@
// run-pass
#![allow(dead_code)]
#![allow(unused_variables)]
// Checks if the correct registers are being used to pass arguments
// when the sysv64 ABI is specified.
#![feature(rust_2018_preview)]
pub trait Foo {}
// should compile without the dyn trait feature flag
fn foo(x: &dyn Foo) {}
pub fn main() {}

View File

@ -1,10 +0,0 @@
// check-pass
// This is a stub feature that doesn't control anything, so to make tidy happy,
// gate-test-test_2018_feature
#![feature(test_2018_feature)]
//~^ WARN the feature `test_2018_feature` is included in the Rust 2018 edition
#![feature(rust_2018_preview)]
fn main() {}

View File

@ -1,9 +0,0 @@
warning[E0705]: the feature `test_2018_feature` is included in the Rust 2018 edition
--> $DIR/E0705.rs:6:12
|
LL | #![feature(test_2018_feature)]
| ^^^^^^^^^^^^^^^^^
warning: 1 warning emitted
For more information about this error, try `rustc --explain E0705`.

View File

@ -1,8 +1,6 @@
// run-pass // run-pass
// aux-build:custom-attr-only-one-derive.rs // aux-build:custom-attr-only-one-derive.rs
#![feature(rust_2018_preview)]
#[macro_use] #[macro_use]
extern crate custom_attr_only_one_derive; extern crate custom_attr_only_one_derive;

View File

@ -1,6 +1,5 @@
// run-rustfix // run-rustfix
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
mod foo { mod foo {

View File

@ -1,6 +1,5 @@
// run-rustfix // run-rustfix
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
mod foo { mod foo {

View File

@ -1,5 +1,5 @@
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-fully-qualified-paths.rs:19:25 --> $DIR/edition-lint-fully-qualified-paths.rs:18:25
| |
LL | let _: <foo::Baz as ::foo::Foo>::Bar = (); LL | let _: <foo::Baz as ::foo::Foo>::Bar = ();
| ^^^^^^^^^^ help: use `crate`: `crate::foo::Foo` | ^^^^^^^^^^ help: use `crate`: `crate::foo::Foo`
@ -7,13 +7,13 @@ LL | let _: <foo::Baz as ::foo::Foo>::Bar = ();
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018! = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
note: the lint level is defined here note: the lint level is defined here
--> $DIR/edition-lint-fully-qualified-paths.rs:4:9 --> $DIR/edition-lint-fully-qualified-paths.rs:3:9
| |
LL | #![deny(absolute_paths_not_starting_with_crate)] LL | #![deny(absolute_paths_not_starting_with_crate)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-fully-qualified-paths.rs:19:25 --> $DIR/edition-lint-fully-qualified-paths.rs:18:25
| |
LL | let _: <foo::Baz as ::foo::Foo>::Bar = (); LL | let _: <foo::Baz as ::foo::Foo>::Bar = ();
| ^^^^^^^^^^ help: use `crate`: `crate::foo::Foo` | ^^^^^^^^^^ help: use `crate`: `crate::foo::Foo`
@ -23,7 +23,7 @@ LL | let _: <foo::Baz as ::foo::Foo>::Bar = ();
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-fully-qualified-paths.rs:25:13 --> $DIR/edition-lint-fully-qualified-paths.rs:24:13
| |
LL | let _: <::foo::Baz as foo::Foo>::Bar = (); LL | let _: <::foo::Baz as foo::Foo>::Bar = ();
| ^^^^^^^^^^ help: use `crate`: `crate::foo::Baz` | ^^^^^^^^^^ help: use `crate`: `crate::foo::Baz`

View File

@ -1,6 +1,5 @@
// run-rustfix // run-rustfix
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
#![allow(unused_imports)] #![allow(unused_imports)]
#![allow(dead_code)] #![allow(dead_code)]

View File

@ -1,6 +1,5 @@
// run-rustfix // run-rustfix
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
#![allow(unused_imports)] #![allow(unused_imports)]
#![allow(dead_code)] #![allow(dead_code)]

View File

@ -1,5 +1,5 @@
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-nested-empty-paths.rs:17:5 --> $DIR/edition-lint-nested-empty-paths.rs:16:5
| |
LL | use foo::{bar::{baz::{}}}; LL | use foo::{bar::{baz::{}}};
| ^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{bar::{baz::{}}}` | ^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{bar::{baz::{}}}`
@ -7,13 +7,13 @@ LL | use foo::{bar::{baz::{}}};
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018! = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
note: the lint level is defined here note: the lint level is defined here
--> $DIR/edition-lint-nested-empty-paths.rs:4:9 --> $DIR/edition-lint-nested-empty-paths.rs:3:9
| |
LL | #![deny(absolute_paths_not_starting_with_crate)] LL | #![deny(absolute_paths_not_starting_with_crate)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-nested-empty-paths.rs:21:5 --> $DIR/edition-lint-nested-empty-paths.rs:20:5
| |
LL | use foo::{bar::{XX, baz::{}}}; LL | use foo::{bar::{XX, baz::{}}};
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{bar::{XX, baz::{}}}` | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{bar::{XX, baz::{}}}`
@ -22,7 +22,7 @@ LL | use foo::{bar::{XX, baz::{}}};
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-nested-empty-paths.rs:21:5 --> $DIR/edition-lint-nested-empty-paths.rs:20:5
| |
LL | use foo::{bar::{XX, baz::{}}}; LL | use foo::{bar::{XX, baz::{}}};
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{bar::{XX, baz::{}}}` | ^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{bar::{XX, baz::{}}}`
@ -32,7 +32,7 @@ LL | use foo::{bar::{XX, baz::{}}};
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-nested-empty-paths.rs:27:5 --> $DIR/edition-lint-nested-empty-paths.rs:26:5
| |
LL | use foo::{bar::{baz::{}, baz1::{}}}; LL | use foo::{bar::{baz::{}, baz1::{}}};
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{bar::{baz::{}, baz1::{}}}` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{bar::{baz::{}, baz1::{}}}`
@ -41,7 +41,7 @@ LL | use foo::{bar::{baz::{}, baz1::{}}};
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-nested-empty-paths.rs:27:5 --> $DIR/edition-lint-nested-empty-paths.rs:26:5
| |
LL | use foo::{bar::{baz::{}, baz1::{}}}; LL | use foo::{bar::{baz::{}, baz1::{}}};
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{bar::{baz::{}, baz1::{}}}` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{bar::{baz::{}, baz1::{}}}`

View File

@ -1,6 +1,5 @@
// run-rustfix // run-rustfix
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
use crate::foo::{a, b}; use crate::foo::{a, b};

View File

@ -1,6 +1,5 @@
// run-rustfix // run-rustfix
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
use foo::{a, b}; use foo::{a, b};

View File

@ -1,5 +1,5 @@
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-nested-paths.rs:6:5 --> $DIR/edition-lint-nested-paths.rs:5:5
| |
LL | use foo::{a, b}; LL | use foo::{a, b};
| ^^^^^^^^^^^ help: use `crate`: `crate::foo::{a, b}` | ^^^^^^^^^^^ help: use `crate`: `crate::foo::{a, b}`
@ -7,13 +7,13 @@ LL | use foo::{a, b};
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018! = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
note: the lint level is defined here note: the lint level is defined here
--> $DIR/edition-lint-nested-paths.rs:4:9 --> $DIR/edition-lint-nested-paths.rs:3:9
| |
LL | #![deny(absolute_paths_not_starting_with_crate)] LL | #![deny(absolute_paths_not_starting_with_crate)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-nested-paths.rs:6:5 --> $DIR/edition-lint-nested-paths.rs:5:5
| |
LL | use foo::{a, b}; LL | use foo::{a, b};
| ^^^^^^^^^^^ help: use `crate`: `crate::foo::{a, b}` | ^^^^^^^^^^^ help: use `crate`: `crate::foo::{a, b}`
@ -23,7 +23,7 @@ LL | use foo::{a, b};
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-nested-paths.rs:23:13 --> $DIR/edition-lint-nested-paths.rs:22:13
| |
LL | use foo::{self as x, c}; LL | use foo::{self as x, c};
| ^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{self as x, c}` | ^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{self as x, c}`
@ -32,7 +32,7 @@ LL | use foo::{self as x, c};
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-nested-paths.rs:23:13 --> $DIR/edition-lint-nested-paths.rs:22:13
| |
LL | use foo::{self as x, c}; LL | use foo::{self as x, c};
| ^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{self as x, c}` | ^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::{self as x, c}`

View File

@ -1,7 +1,6 @@
// aux-build:edition-lint-paths.rs // aux-build:edition-lint-paths.rs
// run-rustfix // run-rustfix
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
#![allow(unused)] #![allow(unused)]

View File

@ -1,7 +1,6 @@
// aux-build:edition-lint-paths.rs // aux-build:edition-lint-paths.rs
// run-rustfix // run-rustfix
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
#![allow(unused)] #![allow(unused)]

View File

@ -1,5 +1,5 @@
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-paths.rs:12:9 --> $DIR/edition-lint-paths.rs:11:9
| |
LL | use bar::Bar; LL | use bar::Bar;
| ^^^^^^^^ help: use `crate`: `crate::bar::Bar` | ^^^^^^^^ help: use `crate`: `crate::bar::Bar`
@ -7,13 +7,13 @@ LL | use bar::Bar;
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018! = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
note: the lint level is defined here note: the lint level is defined here
--> $DIR/edition-lint-paths.rs:5:9 --> $DIR/edition-lint-paths.rs:4:9
| |
LL | #![deny(absolute_paths_not_starting_with_crate)] LL | #![deny(absolute_paths_not_starting_with_crate)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-paths.rs:19:9 --> $DIR/edition-lint-paths.rs:18:9
| |
LL | use bar; LL | use bar;
| ^^^ help: use `crate`: `crate::bar` | ^^^ help: use `crate`: `crate::bar`
@ -22,7 +22,7 @@ LL | use bar;
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-paths.rs:25:9 --> $DIR/edition-lint-paths.rs:24:9
| |
LL | use {main, Bar as SomethingElse}; LL | use {main, Bar as SomethingElse};
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::{main, Bar as SomethingElse}` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::{main, Bar as SomethingElse}`
@ -31,7 +31,7 @@ LL | use {main, Bar as SomethingElse};
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-paths.rs:25:9 --> $DIR/edition-lint-paths.rs:24:9
| |
LL | use {main, Bar as SomethingElse}; LL | use {main, Bar as SomethingElse};
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::{main, Bar as SomethingElse}` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::{main, Bar as SomethingElse}`
@ -41,7 +41,7 @@ LL | use {main, Bar as SomethingElse};
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-paths.rs:25:9 --> $DIR/edition-lint-paths.rs:24:9
| |
LL | use {main, Bar as SomethingElse}; LL | use {main, Bar as SomethingElse};
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::{main, Bar as SomethingElse}` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::{main, Bar as SomethingElse}`
@ -51,7 +51,7 @@ LL | use {main, Bar as SomethingElse};
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-paths.rs:40:5 --> $DIR/edition-lint-paths.rs:39:5
| |
LL | use bar::Bar; LL | use bar::Bar;
| ^^^^^^^^ help: use `crate`: `crate::bar::Bar` | ^^^^^^^^ help: use `crate`: `crate::bar::Bar`
@ -60,7 +60,7 @@ LL | use bar::Bar;
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-paths.rs:52:9 --> $DIR/edition-lint-paths.rs:51:9
| |
LL | use *; LL | use *;
| ^ help: use `crate`: `crate::*` | ^ help: use `crate`: `crate::*`
@ -69,7 +69,7 @@ LL | use *;
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-paths.rs:57:6 --> $DIR/edition-lint-paths.rs:56:6
| |
LL | impl ::foo::SomeTrait for u32 {} LL | impl ::foo::SomeTrait for u32 {}
| ^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::SomeTrait` | ^^^^^^^^^^^^^^^^ help: use `crate`: `crate::foo::SomeTrait`
@ -78,7 +78,7 @@ LL | impl ::foo::SomeTrait for u32 {}
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/edition-lint-paths.rs:62:13 --> $DIR/edition-lint-paths.rs:61:13
| |
LL | let x = ::bar::Bar; LL | let x = ::bar::Bar;
| ^^^^^^^^^^ help: use `crate`: `crate::bar::Bar` | ^^^^^^^^^^ help: use `crate`: `crate::bar::Bar`

View File

@ -6,7 +6,6 @@
// The "normal case". Ideally we would remove the `extern crate` here, // The "normal case". Ideally we would remove the `extern crate` here,
// but we don't. // but we don't.
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
extern crate edition_lint_paths; extern crate edition_lint_paths;

View File

@ -6,7 +6,6 @@
// The "normal case". Ideally we would remove the `extern crate` here, // The "normal case". Ideally we would remove the `extern crate` here,
// but we don't. // but we don't.
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
extern crate edition_lint_paths; extern crate edition_lint_paths;

View File

@ -6,7 +6,6 @@
// rather than being accessed directly. Unless we rewrite that path, // rather than being accessed directly. Unless we rewrite that path,
// we can't drop the extern crate. // we can't drop the extern crate.
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
extern crate edition_lint_paths; extern crate edition_lint_paths;

View File

@ -6,7 +6,6 @@
// rather than being accessed directly. Unless we rewrite that path, // rather than being accessed directly. Unless we rewrite that path,
// we can't drop the extern crate. // we can't drop the extern crate.
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
extern crate edition_lint_paths; extern crate edition_lint_paths;

View File

@ -4,7 +4,6 @@
// Oddball: crate is renamed, making it harder for us to rewrite // Oddball: crate is renamed, making it harder for us to rewrite
// paths. We don't (and we leave the `extern crate` in place). // paths. We don't (and we leave the `extern crate` in place).
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
extern crate edition_lint_paths as my_crate; extern crate edition_lint_paths as my_crate;

View File

@ -4,7 +4,6 @@
// Oddball: crate is renamed, making it harder for us to rewrite // Oddball: crate is renamed, making it harder for us to rewrite
// paths. We don't (and we leave the `extern crate` in place). // paths. We don't (and we leave the `extern crate` in place).
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
extern crate edition_lint_paths as my_crate; extern crate edition_lint_paths as my_crate;

View File

@ -1,5 +1,5 @@
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/extern-crate-rename.rs:12:5 --> $DIR/extern-crate-rename.rs:11:5
| |
LL | use my_crate::foo; LL | use my_crate::foo;
| ^^^^^^^^^^^^^ help: use `crate`: `crate::my_crate::foo` | ^^^^^^^^^^^^^ help: use `crate`: `crate::my_crate::foo`
@ -7,7 +7,7 @@ LL | use my_crate::foo;
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018! = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
note: the lint level is defined here note: the lint level is defined here
--> $DIR/extern-crate-rename.rs:8:9 --> $DIR/extern-crate-rename.rs:7:9
| |
LL | #![deny(absolute_paths_not_starting_with_crate)] LL | #![deny(absolute_paths_not_starting_with_crate)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -5,7 +5,6 @@
// us to rewrite paths. We don't (and we leave the `extern crate` in // us to rewrite paths. We don't (and we leave the `extern crate` in
// place). // place).
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
mod m { mod m {

View File

@ -5,7 +5,6 @@
// us to rewrite paths. We don't (and we leave the `extern crate` in // us to rewrite paths. We don't (and we leave the `extern crate` in
// place). // place).
#![feature(rust_2018_preview)]
#![deny(absolute_paths_not_starting_with_crate)] #![deny(absolute_paths_not_starting_with_crate)]
mod m { mod m {

View File

@ -1,5 +1,5 @@
error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition error: absolute paths must start with `self`, `super`, `crate`, or an external crate name in the 2018 edition
--> $DIR/extern-crate-submod.rs:19:5 --> $DIR/extern-crate-submod.rs:18:5
| |
LL | use m::edition_lint_paths::foo; LL | use m::edition_lint_paths::foo;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::m::edition_lint_paths::foo` | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `crate`: `crate::m::edition_lint_paths::foo`
@ -7,7 +7,7 @@ LL | use m::edition_lint_paths::foo;
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018! = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
= note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130> = note: for more information, see issue #53130 <https://github.com/rust-lang/rust/issues/53130>
note: the lint level is defined here note: the lint level is defined here
--> $DIR/extern-crate-submod.rs:9:9 --> $DIR/extern-crate-submod.rs:8:9
| |
LL | #![deny(absolute_paths_not_starting_with_crate)] LL | #![deny(absolute_paths_not_starting_with_crate)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -4,8 +4,6 @@
// //
// run-pass // run-pass
#![feature(rust_2018_preview)]
trait A { trait A {
} }

View File

@ -4,8 +4,6 @@
// //
// run-pass // run-pass
#![feature(rust_2018_preview)]
trait A { trait A {
} }

View File

@ -4,7 +4,6 @@
#![crate_type = "proc-macro"] #![crate_type = "proc-macro"]
#![deny(rust_2018_compatibility)] #![deny(rust_2018_compatibility)]
#![feature(rust_2018_preview)]
extern crate proc_macro; extern crate proc_macro;

View File

@ -4,7 +4,6 @@
// rustfix-only-machine-applicable // rustfix-only-machine-applicable
// check-pass // check-pass
#![feature(rust_2018_preview)]
#![warn(rust_2018_compatibility)] #![warn(rust_2018_compatibility)]
extern crate suggestions_not_always_applicable as foo; extern crate suggestions_not_always_applicable as foo;

View File

@ -4,7 +4,6 @@
// rustfix-only-machine-applicable // rustfix-only-machine-applicable
// check-pass // check-pass
#![feature(rust_2018_preview)]
#![warn(rust_2018_compatibility)] #![warn(rust_2018_compatibility)]
extern crate suggestions_not_always_applicable as foo; extern crate suggestions_not_always_applicable as foo;

View File

@ -1,6 +1,5 @@
// run-pass // run-pass
#![feature(rust_2018_preview)]
#![deny(unknown_lints)] #![deny(unknown_lints)]
#[allow(clippy::almost_swapped)] #[allow(clippy::almost_swapped)]