From c1b4cc52c683bc5049ab5763f01ff11b42d3dadb Mon Sep 17 00:00:00 2001 From: mu001999 Date: Thu, 5 Feb 2026 23:16:43 +0800 Subject: [PATCH 1/8] Use TrackedFeatures to track used features --- compiler/rustc_driver_impl/src/lib.rs | 7 +- compiler/rustc_feature/src/lib.rs | 2 +- compiler/rustc_feature/src/unstable.rs | 97 ++++++++++++++++--- compiler/rustc_interface/src/passes.rs | 9 ++ compiler/rustc_middle/src/arena.rs | 1 + compiler/rustc_middle/src/queries.rs | 6 ++ compiler/rustc_middle/src/ty/context.rs | 21 +++- .../src/ty/context/impl_interner.rs | 2 +- compiler/rustc_session/src/session.rs | 5 +- 9 files changed, 130 insertions(+), 20 deletions(-) diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs index a235d3e0aecdd..bb95bd1f93a66 100644 --- a/compiler/rustc_driver_impl/src/lib.rs +++ b/compiler/rustc_driver_impl/src/lib.rs @@ -21,8 +21,8 @@ use std::io::{self, IsTerminal, Read, Write}; use std::panic::{self, PanicHookInfo}; use std::path::{Path, PathBuf}; use std::process::{Command, ExitCode, Stdio, Termination}; -use std::sync::OnceLock; use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{Arc, OnceLock}; use std::time::Instant; use std::{env, str}; @@ -713,7 +713,10 @@ fn print_crate_info( let crate_name = passes::get_crate_name(sess, attrs); let lint_store = crate::unerased_lint_store(sess); let registered_tools = rustc_resolve::registered_tools_ast(sess.dcx(), attrs); - let features = rustc_expand::config::features(sess, attrs, crate_name); + let features = rustc_feature::TrackedFeatures::new( + Arc::clone(&sess.used_features), + rustc_expand::config::features(sess, attrs, crate_name), + ); let lint_levels = rustc_lint::LintLevelsBuilder::crate_root( sess, &features, diff --git a/compiler/rustc_feature/src/lib.rs b/compiler/rustc_feature/src/lib.rs index 619726f0d5d8f..eb4cba1f65dd0 100644 --- a/compiler/rustc_feature/src/lib.rs +++ b/compiler/rustc_feature/src/lib.rs @@ -137,5 +137,5 @@ pub use builtin_attrs::{ pub use removed::REMOVED_LANG_FEATURES; pub use unstable::{ DEPENDENT_FEATURES, EnabledLangFeature, EnabledLibFeature, Features, INCOMPATIBLE_FEATURES, - UNSTABLE_LANG_FEATURES, + TrackedFeatures, UNSTABLE_LANG_FEATURES, }; diff --git a/compiler/rustc_feature/src/unstable.rs b/compiler/rustc_feature/src/unstable.rs index 082558cf9a93f..81598a7c4cb15 100644 --- a/compiler/rustc_feature/src/unstable.rs +++ b/compiler/rustc_feature/src/unstable.rs @@ -1,6 +1,7 @@ //! List of the unstable feature gates. use std::path::PathBuf; +use std::sync::{Arc, Mutex}; use std::time::{SystemTime, UNIX_EPOCH}; use rustc_data_structures::fx::FxHashSet; @@ -35,6 +36,82 @@ macro_rules! status_to_enum { /// /// The former is preferred. `enabled` should only be used when the feature symbol is not a /// constant, e.g. a parameter, or when the feature is a library feature. +/// +/// NOTE: +/// 1. Do NOT use `TrackedFeatures` directly outside of the query system; +/// 2. Do NOT use any other method (e.g. `enabled_features`) to check if a feature is enabled. +/// Only `enabled(&self, feature: Symbol)` and the generated `foo(&self)` methods will record +/// feature usage. Using any other method will silently skip tracking and lead to incorrect +/// "unused features" diagnostics. +#[derive(Clone, Debug)] +pub struct TrackedFeatures { + used_features: Arc>>, + features: Features, +} + +impl TrackedFeatures { + pub fn new(used_features: Arc>>, features: Features) -> Self { + Self { used_features, features } + } + + pub fn unused_features(&self) -> Vec<(Symbol, Span)> { + let used_features = self.used_features.lock().unwrap(); + self.enabled_features_iter_stable_order() + .filter(|(f, _)| !used_features.contains(f)) + .collect() + } + + /// Is the given feature enabled (via `#[feature(...)]`)? + pub fn enabled(&self, feature: Symbol) -> bool { + self.used_features.lock().unwrap().insert(feature); + self.features.enabled(feature) + } + + /// Returns a list of [`EnabledLangFeature`] with info about: + /// + /// - Feature gate name. + /// - The span of the `#[feature]` attribute. + /// - For stable language features, version info for when it was stabilized. + pub fn enabled_lang_features(&self) -> &Vec { + self.features.enabled_lang_features() + } + + pub fn enabled_lib_features(&self) -> &Vec { + self.features.enabled_lib_features() + } + + pub fn enabled_features(&self) -> &FxHashSet { + &self.features.enabled_features() + } + + /// Returns a iterator of enabled features in stable order. + pub fn enabled_features_iter_stable_order( + &self, + ) -> impl Iterator + Clone { + self.features.enabled_features_iter_stable_order() + } + + pub fn dump_feature_usage_metrics( + &self, + metrics_path: PathBuf, + ) -> Result<(), Box> { + self.features.dump_feature_usage_metrics(metrics_path) + } + + /// Some features are known to be incomplete and using them is likely to have + /// unanticipated results, such as compiler crashes. We warn the user about these + /// to alert them. + pub fn incomplete(&self, feature: Symbol) -> bool { + self.features.incomplete(feature) + } + + /// Some features are internal to the compiler and standard library and should not + /// be used in normal projects. We warn the user about these to alert them. + pub fn internal(&self, feature: Symbol) -> bool { + self.features.internal(feature) + } +} + #[derive(Clone, Default, Debug)] pub struct Features { /// `#![feature]` attrs for language features, for error reporting. @@ -89,22 +166,18 @@ impl Features { &self.enabled_lib_features } - pub fn enabled_features(&self) -> &FxHashSet { + fn enabled_features(&self) -> &FxHashSet { &self.enabled_features } - /// Returns a iterator of enabled features in stable order. - pub fn enabled_features_iter_stable_order( - &self, - ) -> impl Iterator + Clone { + fn enabled_features_iter_stable_order(&self) -> impl Iterator + Clone { self.enabled_lang_features .iter() .map(|feat| (feat.gate_name, feat.attr_sp)) .chain(self.enabled_lib_features.iter().map(|feat| (feat.gate_name, feat.attr_sp))) } - /// Is the given feature enabled (via `#[feature(...)]`)? - pub fn enabled(&self, feature: Symbol) -> bool { + fn enabled(&self, feature: Symbol) -> bool { self.enabled_features.contains(&feature) } } @@ -123,17 +196,19 @@ macro_rules! declare_features { }),+ ]; - impl Features { + impl TrackedFeatures { $( pub fn $feature(&self) -> bool { - self.enabled_features.contains(&sym::$feature) + self.enabled(sym::$feature) } )* + } + impl Features { /// Some features are known to be incomplete and using them is likely to have /// unanticipated results, such as compiler crashes. We warn the user about these /// to alert them. - pub fn incomplete(&self, feature: Symbol) -> bool { + fn incomplete(&self, feature: Symbol) -> bool { match feature { $( sym::$feature => status_to_enum!($status) == FeatureStatus::Incomplete, @@ -717,7 +792,7 @@ declare_features! ( ); impl Features { - pub fn dump_feature_usage_metrics( + fn dump_feature_usage_metrics( &self, metrics_path: PathBuf, ) -> Result<(), Box> { diff --git a/compiler/rustc_interface/src/passes.rs b/compiler/rustc_interface/src/passes.rs index a2c11c608330a..85ca1e86d7e64 100644 --- a/compiler/rustc_interface/src/passes.rs +++ b/compiler/rustc_interface/src/passes.rs @@ -875,9 +875,18 @@ pub fn write_interface<'tcx>(tcx: TyCtxt<'tcx>) { } } +pub fn tracked_features_query<'tcx>(tcx: TyCtxt<'tcx>) -> &'tcx rustc_feature::TrackedFeatures { + let features = tcx.features_query(()); + tcx.arena.alloc(rustc_feature::TrackedFeatures::new( + Arc::clone(&tcx.sess.used_features), + features.clone(), + )) +} + pub static DEFAULT_QUERY_PROVIDERS: LazyLock = LazyLock::new(|| { let providers = &mut Providers::default(); providers.queries.analysis = analysis; + providers.queries.tracked_features_query = |tcx, _| tracked_features_query(tcx); providers.queries.hir_crate = rustc_ast_lowering::lower_to_hir; providers.queries.resolver_for_lowering_raw = resolver_for_lowering_raw; providers.queries.stripped_cfg_items = |tcx, _| &tcx.resolutions(()).stripped_cfg_items[..]; diff --git a/compiler/rustc_middle/src/arena.rs b/compiler/rustc_middle/src/arena.rs index 0f254aaa9fa0a..4f0efa82b07bd 100644 --- a/compiler/rustc_middle/src/arena.rs +++ b/compiler/rustc_middle/src/arena.rs @@ -116,6 +116,7 @@ macro_rules! arena_types { [] stripped_cfg_items: rustc_hir::attrs::StrippedCfgItem, [] mod_child: rustc_middle::metadata::ModChild, [] features: rustc_feature::Features, + [] tracked_features: rustc_feature::TrackedFeatures, [decode] specialization_graph: rustc_middle::traits::specialization_graph::Graph, [] crate_inherent_impls: rustc_middle::ty::CrateInherentImpls, [] hir_owner_nodes: rustc_hir::OwnerNodes<'tcx>, diff --git a/compiler/rustc_middle/src/queries.rs b/compiler/rustc_middle/src/queries.rs index 59171f2da4f20..3ccd73f37fb0d 100644 --- a/compiler/rustc_middle/src/queries.rs +++ b/compiler/rustc_middle/src/queries.rs @@ -2608,6 +2608,12 @@ rustc_queries! { query features_query(_: ()) -> &'tcx rustc_feature::Features { feedable + desc { "looking up raw feature gates" } + } + + query tracked_features_query(_: ()) -> &'tcx rustc_feature::TrackedFeatures { + eval_always + no_hash desc { "looking up enabled feature gates" } } diff --git a/compiler/rustc_middle/src/ty/context.rs b/compiler/rustc_middle/src/ty/context.rs index 430890d5a42d8..7e09c8410d556 100644 --- a/compiler/rustc_middle/src/ty/context.rs +++ b/compiler/rustc_middle/src/ty/context.rs @@ -37,7 +37,7 @@ use rustc_hir::definitions::{DefPathData, Definitions, DisambiguatorState}; use rustc_hir::intravisit::VisitorExt; use rustc_hir::lang_items::LangItem; use rustc_hir::limit::Limit; -use rustc_hir::{self as hir, HirId, Node, TraitCandidate, find_attr}; +use rustc_hir::{self as hir, CRATE_HIR_ID, HirId, Node, TraitCandidate, find_attr}; use rustc_index::IndexVec; use rustc_query_system::ich::StableHashingContext; use rustc_serialize::opaque::{FileEncodeResult, FileEncoder}; @@ -110,7 +110,9 @@ impl<'tcx> rustc_type_ir::inherent::Safety> for hir::Safety { } } -impl<'tcx> rustc_type_ir::inherent::Features> for &'tcx rustc_feature::Features { +impl<'tcx> rustc_type_ir::inherent::Features> + for &'tcx rustc_feature::TrackedFeatures +{ fn generic_const_exprs(self) -> bool { self.generic_const_exprs() } @@ -1164,8 +1166,8 @@ impl<'tcx> TyCtxt<'tcx> { ) } - pub fn features(self) -> &'tcx rustc_feature::Features { - self.features_query(()) + pub fn features(self) -> &'tcx rustc_feature::TrackedFeatures { + self.tracked_features_query(()) } pub fn def_key(self, id: impl IntoQueryParam) -> rustc_hir::definitions::DefKey { @@ -1676,6 +1678,17 @@ impl<'tcx> TyCtxt<'tcx> { } pub fn finish(self) { + for (feature, span) in self.features().unused_features() { + self.node_span_lint( + rustc_session::lint::builtin::UNUSED_FEATURES, + CRATE_HIR_ID, + span, + |lint| { + lint.primary_message(format!("feature `{}` is declared but not used", feature)); + }, + ); + } + // We assume that no queries are run past here. If there are new queries // after this point, they'll show up as "" in self-profiling data. self.alloc_self_profile_query_strings(); diff --git a/compiler/rustc_middle/src/ty/context/impl_interner.rs b/compiler/rustc_middle/src/ty/context/impl_interner.rs index 7580cc65d530a..9be8e344b1be7 100644 --- a/compiler/rustc_middle/src/ty/context/impl_interner.rs +++ b/compiler/rustc_middle/src/ty/context/impl_interner.rs @@ -300,7 +300,7 @@ impl<'tcx> Interner for TyCtxt<'tcx> { self.recursion_limit().0 } - type Features = &'tcx rustc_feature::Features; + type Features = &'tcx rustc_feature::TrackedFeatures; fn features(self) -> Self::Features { self.features() diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs index ed37e9e960cd8..419ae05127262 100644 --- a/compiler/rustc_session/src/session.rs +++ b/compiler/rustc_session/src/session.rs @@ -1,8 +1,8 @@ use std::any::Any; use std::path::PathBuf; use std::str::FromStr; -use std::sync::Arc; use std::sync::atomic::AtomicBool; +use std::sync::{Arc, Mutex}; use std::{env, io}; use rand::{RngCore, rng}; @@ -158,6 +158,8 @@ pub struct Session { /// The names of intrinsics that the current codegen backend replaces /// with its own implementations. pub replaced_intrinsics: FxHashSet, + + pub used_features: Arc>>, } #[derive(Clone, Copy)] @@ -1088,6 +1090,7 @@ pub fn build_session( host_filesearch, invocation_temp, replaced_intrinsics: FxHashSet::default(), // filled by `run_compiler` + used_features: Arc::new(Mutex::new(FxHashSet::default())), }; validate_commandline_args_with_session_available(&sess); From fad633de4e63daaf50f44d241105e9d170184c15 Mon Sep 17 00:00:00 2001 From: mu001999 Date: Thu, 5 Feb 2026 23:17:09 +0800 Subject: [PATCH 2/8] Replace Features usages with TrackedFeatures --- compiler/rustc_ast_lowering/src/stability.rs | 16 +++-- .../rustc_ast_passes/src/ast_validation.rs | 6 +- compiler/rustc_ast_passes/src/feature_gate.rs | 16 ++--- .../rustc_attr_parsing/src/attributes/cfg.rs | 10 +-- .../src/attributes/cfg_select.rs | 4 +- .../src/attributes/link_attrs.rs | 6 +- compiler/rustc_attr_parsing/src/interface.rs | 20 +++--- .../rustc_attr_parsing/src/target_checking.rs | 4 +- compiler/rustc_builtin_macros/src/cfg_eval.rs | 4 +- .../src/proc_macro_harness.rs | 4 +- .../src/standard_library_imports.rs | 4 +- .../rustc_builtin_macros/src/test_harness.rs | 12 ++-- compiler/rustc_expand/src/base.rs | 4 +- compiler/rustc_expand/src/config.rs | 4 +- compiler/rustc_expand/src/expand.rs | 6 +- compiler/rustc_expand/src/mbe/macro_rules.rs | 4 +- compiler/rustc_expand/src/mbe/quoted.rs | 16 +++-- compiler/rustc_feature/src/builtin_attrs.rs | 68 +++++++++++-------- compiler/rustc_interface/src/passes.rs | 7 +- compiler/rustc_lint/src/context.rs | 4 +- compiler/rustc_lint/src/early.rs | 4 +- compiler/rustc_lint/src/levels.rs | 10 +-- compiler/rustc_metadata/src/rmeta/encoder.rs | 6 +- 23 files changed, 134 insertions(+), 105 deletions(-) diff --git a/compiler/rustc_ast_lowering/src/stability.rs b/compiler/rustc_ast_lowering/src/stability.rs index d185cc9163eb6..b4035605bd348 100644 --- a/compiler/rustc_ast_lowering/src/stability.rs +++ b/compiler/rustc_ast_lowering/src/stability.rs @@ -1,13 +1,16 @@ use std::fmt; use rustc_abi::ExternAbi; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_session::Session; use rustc_session::parse::feature_err; use rustc_span::symbol::sym; use rustc_span::{Span, Symbol}; -pub(crate) fn enabled_names(features: &rustc_feature::Features, span: Span) -> Vec<&'static str> { +pub(crate) fn enabled_names( + features: &rustc_feature::TrackedFeatures, + span: Span, +) -> Vec<&'static str> { ExternAbi::ALL_VARIANTS .into_iter() .filter(|abi| extern_abi_enabled(features, span, **abi).is_ok()) @@ -16,7 +19,7 @@ pub(crate) fn enabled_names(features: &rustc_feature::Features, span: Span) -> V } pub(crate) fn extern_abi_enabled( - features: &rustc_feature::Features, + features: &rustc_feature::TrackedFeatures, span: Span, abi: ExternAbi, ) -> Result<(), UnstableAbi> { @@ -29,7 +32,12 @@ pub(crate) fn extern_abi_enabled( }) } -pub(crate) fn gate_unstable_abi(sess: &Session, features: &Features, span: Span, abi: ExternAbi) { +pub(crate) fn gate_unstable_abi( + sess: &Session, + features: &TrackedFeatures, + span: Span, + abi: ExternAbi, +) { match extern_abi_enabled(features, span, abi) { Ok(_) => (), Err(unstable_abi) => { diff --git a/compiler/rustc_ast_passes/src/ast_validation.rs b/compiler/rustc_ast_passes/src/ast_validation.rs index b9fb20b68971d..d7d0c350dd46f 100644 --- a/compiler/rustc_ast_passes/src/ast_validation.rs +++ b/compiler/rustc_ast_passes/src/ast_validation.rs @@ -28,7 +28,7 @@ use rustc_ast_pretty::pprust::{self, State}; use rustc_attr_parsing::validate_attr; use rustc_data_structures::fx::FxIndexMap; use rustc_errors::{DiagCtxtHandle, LintBuffer}; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_session::Session; use rustc_session::lint::BuiltinLintDiag; use rustc_session::lint::builtin::{ @@ -67,7 +67,7 @@ impl TraitOrImpl { struct AstValidator<'a> { sess: &'a Session, - features: &'a Features, + features: &'a TrackedFeatures, /// The span of the `extern` in an `extern { ... }` block, if any. extern_mod_span: Option, @@ -1994,7 +1994,7 @@ fn deny_equality_constraints( pub fn check_crate( sess: &Session, - features: &Features, + features: &TrackedFeatures, krate: &Crate, is_sdylib_interface: bool, lints: &mut LintBuffer, diff --git a/compiler/rustc_ast_passes/src/feature_gate.rs b/compiler/rustc_ast_passes/src/feature_gate.rs index 4523b4c14163b..1b86360eb4c2e 100644 --- a/compiler/rustc_ast_passes/src/feature_gate.rs +++ b/compiler/rustc_ast_passes/src/feature_gate.rs @@ -1,7 +1,7 @@ use rustc_ast::visit::{self, AssocCtxt, FnCtxt, FnKind, Visitor}; use rustc_ast::{self as ast, AttrVec, NodeId, PatKind, attr, token}; use rustc_errors::msg; -use rustc_feature::{AttributeGate, BUILTIN_ATTRIBUTE_MAP, BuiltinAttribute, Features}; +use rustc_feature::{AttributeGate, BUILTIN_ATTRIBUTE_MAP, BuiltinAttribute, TrackedFeatures}; use rustc_session::Session; use rustc_session::parse::{feature_err, feature_warn}; use rustc_span::source_map::Spanned; @@ -64,7 +64,7 @@ macro_rules! gate_legacy { }}; } -pub fn check_attribute(attr: &ast::Attribute, sess: &Session, features: &Features) { +pub fn check_attribute(attr: &ast::Attribute, sess: &Session, features: &TrackedFeatures) { PostExpansionVisitor { sess, features }.visit_attribute(attr) } @@ -72,7 +72,7 @@ struct PostExpansionVisitor<'a> { sess: &'a Session, // `sess` contains a `Features`, but this might not be that one. - features: &'a Features, + features: &'a TrackedFeatures, } impl<'a> PostExpansionVisitor<'a> { @@ -456,7 +456,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> { } } -pub fn check_crate(krate: &ast::Crate, sess: &Session, features: &Features) { +pub fn check_crate(krate: &ast::Crate, sess: &Session, features: &TrackedFeatures) { maybe_stage_features(sess, features, krate); check_incompatible_features(sess, features); check_dependent_features(sess, features); @@ -631,7 +631,7 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session, features: &Features) { visit::walk_crate(&mut visitor, krate); } -fn maybe_stage_features(sess: &Session, features: &Features, krate: &ast::Crate) { +fn maybe_stage_features(sess: &Session, features: &TrackedFeatures, krate: &ast::Crate) { // checks if `#![feature]` has been used to enable any feature. if sess.opts.unstable_features.is_nightly_build() { return; @@ -674,7 +674,7 @@ fn maybe_stage_features(sess: &Session, features: &Features, krate: &ast::Crate) assert!(errored); } -fn check_incompatible_features(sess: &Session, features: &Features) { +fn check_incompatible_features(sess: &Session, features: &TrackedFeatures) { let enabled_features = features.enabled_features_iter_stable_order(); for (f1, f2) in rustc_feature::INCOMPATIBLE_FEATURES @@ -690,7 +690,7 @@ fn check_incompatible_features(sess: &Session, features: &Features) { } } -fn check_dependent_features(sess: &Session, features: &Features) { +fn check_dependent_features(sess: &Session, features: &TrackedFeatures) { for &(parent, children) in rustc_feature::DEPENDENT_FEATURES.iter().filter(|(parent, _)| features.enabled(*parent)) { @@ -711,7 +711,7 @@ fn check_dependent_features(sess: &Session, features: &Features) { } } -fn check_new_solver_banned_features(sess: &Session, features: &Features) { +fn check_new_solver_banned_features(sess: &Session, features: &TrackedFeatures) { if !sess.opts.unstable_opts.next_solver.globally { return; } diff --git a/compiler/rustc_attr_parsing/src/attributes/cfg.rs b/compiler/rustc_attr_parsing/src/attributes/cfg.rs index d2f743f6c5d8f..6ed68219b8d22 100644 --- a/compiler/rustc_attr_parsing/src/attributes/cfg.rs +++ b/compiler/rustc_attr_parsing/src/attributes/cfg.rs @@ -5,7 +5,7 @@ use rustc_ast::tokenstream::DelimSpan; use rustc_ast::{AttrItem, Attribute, CRATE_NODE_ID, LitKind, ast, token}; use rustc_errors::{Applicability, PResult, msg}; use rustc_feature::{ - AttrSuggestionStyle, AttributeTemplate, Features, GatedCfg, find_gated_cfg, template, + AttrSuggestionStyle, AttributeTemplate, GatedCfg, TrackedFeatures, find_gated_cfg, template, }; use rustc_hir::attrs::CfgEntry; use rustc_hir::lints::AttributeLintKind; @@ -291,7 +291,7 @@ impl EvalConfigResult { pub fn parse_cfg_attr( cfg_attr: &Attribute, sess: &Session, - features: Option<&Features>, + features: Option<&TrackedFeatures>, ) -> Option<(CfgEntry, Vec<(AttrItem, Span)>)> { match cfg_attr.get_normal_item().args.unparsed_ref().unwrap() { ast::AttrArgs::Delimited(ast::DelimArgs { dspan, delim, tokens }) if !tokens.is_empty() => { @@ -355,7 +355,7 @@ fn check_cfg_attr_bad_delim(psess: &ParseSess, span: DelimSpan, delim: Delimiter fn parse_cfg_attr_internal<'a>( parser: &mut Parser<'a>, sess: &'a Session, - features: Option<&Features>, + features: Option<&TrackedFeatures>, attribute: &Attribute, ) -> PResult<'a, (CfgEntry, Vec<(ast::AttrItem, Span)>)> { // Parse cfg predicate @@ -408,14 +408,14 @@ fn parse_cfg_attr_internal<'a>( Ok((cfg_predicate, expanded_attrs)) } -fn try_gate_cfg(name: Symbol, span: Span, sess: &Session, features: Option<&Features>) { +fn try_gate_cfg(name: Symbol, span: Span, sess: &Session, features: Option<&TrackedFeatures>) { let gate = find_gated_cfg(|sym| sym == name); if let (Some(feats), Some(gated_cfg)) = (features, gate) { gate_cfg(gated_cfg, span, sess, feats); } } -fn gate_cfg(gated_cfg: &GatedCfg, cfg_span: Span, sess: &Session, features: &Features) { +fn gate_cfg(gated_cfg: &GatedCfg, cfg_span: Span, sess: &Session, features: &TrackedFeatures) { let (cfg, feature, has_feature) = gated_cfg; if !has_feature(features) && !cfg_span.allows_unstable(*feature) { let explain = format!("`cfg({cfg})` is experimental and subject to change"); diff --git a/compiler/rustc_attr_parsing/src/attributes/cfg_select.rs b/compiler/rustc_attr_parsing/src/attributes/cfg_select.rs index b6cb5b4504ee1..1f45d28fa5da5 100644 --- a/compiler/rustc_attr_parsing/src/attributes/cfg_select.rs +++ b/compiler/rustc_attr_parsing/src/attributes/cfg_select.rs @@ -2,7 +2,7 @@ use rustc_ast::token::Token; use rustc_ast::tokenstream::TokenStream; use rustc_ast::{AttrStyle, NodeId, token}; use rustc_data_structures::fx::FxHashMap; -use rustc_feature::{AttributeTemplate, Features}; +use rustc_feature::{AttributeTemplate, TrackedFeatures}; use rustc_hir::attrs::CfgEntry; use rustc_hir::{AttrPath, Target}; use rustc_parse::exp; @@ -71,7 +71,7 @@ impl CfgSelectBranches { pub fn parse_cfg_select( p: &mut Parser<'_>, sess: &Session, - features: Option<&Features>, + features: Option<&TrackedFeatures>, lint_node_id: NodeId, ) -> Result { let mut branches = CfgSelectBranches::default(); diff --git a/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs b/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs index 21c05611ce292..568317d97be95 100644 --- a/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs +++ b/compiler/rustc_attr_parsing/src/attributes/link_attrs.rs @@ -1,5 +1,5 @@ use rustc_errors::msg; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_hir::attrs::AttributeKind::{LinkName, LinkOrdinal, LinkSection}; use rustc_hir::attrs::*; use rustc_session::Session; @@ -278,7 +278,7 @@ impl LinkParser { kind: &mut Option, cx: &mut AcceptContext<'_, '_, S>, sess: &Session, - features: &Features, + features: &TrackedFeatures, ) -> bool { if kind.is_some() { cx.duplicate_key(item.span(), sym::kind); @@ -381,7 +381,7 @@ impl LinkParser { cfg: &mut Option, cx: &mut AcceptContext<'_, '_, S>, sess: &Session, - features: &Features, + features: &TrackedFeatures, ) -> bool { if cfg.is_some() { cx.duplicate_key(item.span(), sym::cfg); diff --git a/compiler/rustc_attr_parsing/src/interface.rs b/compiler/rustc_attr_parsing/src/interface.rs index f75f63a0e811a..cbfd7f22710f0 100644 --- a/compiler/rustc_attr_parsing/src/interface.rs +++ b/compiler/rustc_attr_parsing/src/interface.rs @@ -4,7 +4,7 @@ use rustc_ast as ast; use rustc_ast::token::DocFragmentKind; use rustc_ast::{AttrItemKind, AttrStyle, NodeId, Safety}; use rustc_errors::DiagCtxtHandle; -use rustc_feature::{AttributeTemplate, Features}; +use rustc_feature::{AttributeTemplate, TrackedFeatures}; use rustc_hir::attrs::AttributeKind; use rustc_hir::lints::AttributeLintKind; use rustc_hir::{AttrArgs, AttrItem, AttrPath, Attribute, HashIgnoredAttrId, Target}; @@ -22,7 +22,7 @@ use crate::{Early, Late, OmitDoc, ShouldEmit}; /// context, through which all attributes can be lowered. pub struct AttributeParser<'sess, S: Stage = Late> { pub(crate) tools: Vec, - pub(crate) features: Option<&'sess Features>, + pub(crate) features: Option<&'sess TrackedFeatures>, pub(crate) sess: &'sess Session, pub(crate) stage: S, @@ -53,7 +53,7 @@ impl<'sess> AttributeParser<'sess, Early> { sym: Symbol, target_span: Span, target_node_id: NodeId, - features: Option<&'sess Features>, + features: Option<&'sess TrackedFeatures>, ) -> Option { Self::parse_limited_should_emit( sess, @@ -74,7 +74,7 @@ impl<'sess> AttributeParser<'sess, Early> { sym: Symbol, target_span: Span, target_node_id: NodeId, - features: Option<&'sess Features>, + features: Option<&'sess TrackedFeatures>, should_emit: ShouldEmit, ) -> Option { let mut parsed = Self::parse_limited_all( @@ -105,7 +105,7 @@ impl<'sess> AttributeParser<'sess, Early> { target: Target, target_span: Span, target_node_id: NodeId, - features: Option<&'sess Features>, + features: Option<&'sess TrackedFeatures>, emit_errors: ShouldEmit, ) -> Vec { let mut p = @@ -135,7 +135,7 @@ impl<'sess> AttributeParser<'sess, Early> { target_span: Span, target_node_id: NodeId, target: Target, - features: Option<&'sess Features>, + features: Option<&'sess TrackedFeatures>, emit_errors: ShouldEmit, parse_fn: fn(cx: &mut AcceptContext<'_, '_, Early>, item: &ArgParser) -> Option, template: &AttributeTemplate, @@ -185,7 +185,7 @@ impl<'sess> AttributeParser<'sess, Early> { target_span: Span, target_node_id: NodeId, target: Target, - features: Option<&'sess Features>, + features: Option<&'sess TrackedFeatures>, emit_errors: ShouldEmit, args: &I, parse_fn: fn(cx: &mut AcceptContext<'_, '_, Early>, item: &I) -> T, @@ -230,7 +230,7 @@ impl<'sess> AttributeParser<'sess, Early> { impl<'sess, S: Stage> AttributeParser<'sess, S> { pub fn new( sess: &'sess Session, - features: &'sess Features, + features: &'sess TrackedFeatures, tools: Vec, stage: S, ) -> Self { @@ -241,11 +241,11 @@ impl<'sess, S: Stage> AttributeParser<'sess, S> { &self.sess } - pub(crate) fn features(&self) -> &'sess Features { + pub(crate) fn features(&self) -> &'sess TrackedFeatures { self.features.expect("features not available at this point in the compiler") } - pub(crate) fn features_option(&self) -> Option<&'sess Features> { + pub(crate) fn features_option(&self) -> Option<&'sess TrackedFeatures> { self.features } diff --git a/compiler/rustc_attr_parsing/src/target_checking.rs b/compiler/rustc_attr_parsing/src/target_checking.rs index fb005477f0fa1..eb4b45a9773a9 100644 --- a/compiler/rustc_attr_parsing/src/target_checking.rs +++ b/compiler/rustc_attr_parsing/src/target_checking.rs @@ -2,7 +2,7 @@ use std::borrow::Cow; use rustc_ast::AttrStyle; use rustc_errors::DiagArgValue; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_hir::lints::AttributeLintKind; use rustc_hir::{MethodKind, Target}; use rustc_span::sym; @@ -170,7 +170,7 @@ impl<'sess, S: Stage> AttributeParser<'sess, S> { pub(crate) fn allowed_targets_applied( mut allowed_targets: Vec, target: Target, - features: Option<&Features>, + features: Option<&TrackedFeatures>, ) -> (Vec, bool) { // Remove unstable targets from `allowed_targets` if their features are not enabled if let Some(features) = features { diff --git a/compiler/rustc_builtin_macros/src/cfg_eval.rs b/compiler/rustc_builtin_macros/src/cfg_eval.rs index 9f032fa588195..89a634080e917 100644 --- a/compiler/rustc_builtin_macros/src/cfg_eval.rs +++ b/compiler/rustc_builtin_macros/src/cfg_eval.rs @@ -8,7 +8,7 @@ use rustc_errors::PResult; use rustc_expand::base::{Annotatable, ExtCtxt}; use rustc_expand::config::StripUnconfigured; use rustc_expand::configure; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_parse::parser::{AllowConstBlockItems, ForceCollect, Parser}; use rustc_session::Session; use rustc_span::{Span, sym}; @@ -30,7 +30,7 @@ pub(crate) fn expand( pub(crate) fn cfg_eval( sess: &Session, - features: &Features, + features: &TrackedFeatures, annotatable: Annotatable, lint_node_id: NodeId, ) -> Annotatable { diff --git a/compiler/rustc_builtin_macros/src/proc_macro_harness.rs b/compiler/rustc_builtin_macros/src/proc_macro_harness.rs index 24a5d79958c60..3e6fc8765b40c 100644 --- a/compiler/rustc_builtin_macros/src/proc_macro_harness.rs +++ b/compiler/rustc_builtin_macros/src/proc_macro_harness.rs @@ -7,7 +7,7 @@ use rustc_attr_parsing::AttributeParser; use rustc_errors::DiagCtxtHandle; use rustc_expand::base::{ExtCtxt, ResolverExpand}; use rustc_expand::expand::{AstFragment, ExpansionConfig}; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_hir::attrs::AttributeKind; use rustc_session::Session; use rustc_span::hygiene::AstPass; @@ -51,7 +51,7 @@ struct CollectProcMacros<'a> { pub fn inject( krate: &mut ast::Crate, sess: &Session, - features: &Features, + features: &TrackedFeatures, resolver: &mut dyn ResolverExpand, is_proc_macro_crate: bool, has_proc_macro_decls: bool, diff --git a/compiler/rustc_builtin_macros/src/standard_library_imports.rs b/compiler/rustc_builtin_macros/src/standard_library_imports.rs index 9f22d9eacb33c..9659876fc4614 100644 --- a/compiler/rustc_builtin_macros/src/standard_library_imports.rs +++ b/compiler/rustc_builtin_macros/src/standard_library_imports.rs @@ -1,7 +1,7 @@ use rustc_ast::{self as ast, attr}; use rustc_expand::base::{ExtCtxt, ResolverExpand}; use rustc_expand::expand::ExpansionConfig; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_session::Session; use rustc_span::edition::Edition::*; use rustc_span::hygiene::AstPass; @@ -13,7 +13,7 @@ pub fn inject( pre_configured_attrs: &[ast::Attribute], resolver: &mut dyn ResolverExpand, sess: &Session, - features: &Features, + features: &TrackedFeatures, ) -> usize { let orig_num_items = krate.items.len(); let edition = sess.psess.edition; diff --git a/compiler/rustc_builtin_macros/src/test_harness.rs b/compiler/rustc_builtin_macros/src/test_harness.rs index b5d63511fce9b..d4ce496c83790 100644 --- a/compiler/rustc_builtin_macros/src/test_harness.rs +++ b/compiler/rustc_builtin_macros/src/test_harness.rs @@ -11,7 +11,7 @@ use rustc_ast::{ModKind, attr}; use rustc_attr_parsing::AttributeParser; use rustc_expand::base::{ExtCtxt, ResolverExpand}; use rustc_expand::expand::{AstFragment, ExpansionConfig}; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_hir::attrs::AttributeKind; use rustc_session::Session; use rustc_session::lint::builtin::UNNAMEABLE_TEST_ITEMS; @@ -45,7 +45,7 @@ struct TestCtxt<'a> { pub fn inject( krate: &mut ast::Crate, sess: &Session, - features: &Features, + features: &TrackedFeatures, resolver: &mut dyn ResolverExpand, ) { let dcx = sess.dcx(); @@ -225,7 +225,7 @@ fn generate_test_harness( resolver: &mut dyn ResolverExpand, reexport_test_harness_main: Option, krate: &mut ast::Crate, - features: &Features, + features: &TrackedFeatures, panic_strategy: PanicStrategy, test_runner: Option, ) { @@ -387,7 +387,11 @@ fn get_test_name(i: &ast::Item) -> Option { attr::first_attr_value_str_by_name(&i.attrs, sym::rustc_test_marker) } -fn get_test_runner(sess: &Session, features: &Features, krate: &ast::Crate) -> Option { +fn get_test_runner( + sess: &Session, + features: &TrackedFeatures, + krate: &ast::Crate, +) -> Option { match AttributeParser::parse_limited( sess, &krate.attrs, diff --git a/compiler/rustc_expand/src/base.rs b/compiler/rustc_expand/src/base.rs index 5efaea44b3b9d..81084ff3bd0f8 100644 --- a/compiler/rustc_expand/src/base.rs +++ b/compiler/rustc_expand/src/base.rs @@ -14,7 +14,7 @@ use rustc_ast::{self as ast, AttrVec, Attribute, HasAttrs, Item, NodeId, PatKind use rustc_data_structures::fx::{FxHashMap, FxIndexMap}; use rustc_data_structures::sync; use rustc_errors::{BufferedEarlyLint, DiagCtxtHandle, ErrorGuaranteed, PResult}; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_hir as hir; use rustc_hir::attrs::{AttributeKind, CfgEntry, CollapseMacroDebuginfo, Deprecation}; use rustc_hir::def::MacroKinds; @@ -1189,7 +1189,7 @@ pub trait LintStoreExpand { fn pre_expansion_lint( &self, sess: &Session, - features: &Features, + features: &TrackedFeatures, registered_tools: &RegisteredTools, node_id: NodeId, attrs: &[Attribute], diff --git a/compiler/rustc_expand/src/config.rs b/compiler/rustc_expand/src/config.rs index c7d2e273a76fc..813d5c6eb23d6 100644 --- a/compiler/rustc_expand/src/config.rs +++ b/compiler/rustc_expand/src/config.rs @@ -18,7 +18,7 @@ use rustc_data_structures::flat_map_in_place::FlatMapInPlace; use rustc_errors::msg; use rustc_feature::{ ACCEPTED_LANG_FEATURES, EnabledLangFeature, EnabledLibFeature, Features, REMOVED_LANG_FEATURES, - UNSTABLE_LANG_FEATURES, + TrackedFeatures, UNSTABLE_LANG_FEATURES, }; use rustc_hir::Target; use rustc_parse::parser::Recovery; @@ -37,7 +37,7 @@ use crate::errors::{ /// A folder that strips out items that do not belong in the current configuration. pub struct StripUnconfigured<'a> { pub sess: &'a Session, - pub features: Option<&'a Features>, + pub features: Option<&'a TrackedFeatures>, /// If `true`, perform cfg-stripping on attached tokens. /// This is only used for the input to derive macros, /// which needs eager expansion of `cfg` and `cfg_attr` diff --git a/compiler/rustc_expand/src/expand.rs b/compiler/rustc_expand/src/expand.rs index 76a9a6f9d03d9..40fb02c6d8c5d 100644 --- a/compiler/rustc_expand/src/expand.rs +++ b/compiler/rustc_expand/src/expand.rs @@ -20,7 +20,7 @@ use rustc_attr_parsing::{ use rustc_data_structures::flat_map_in_place::FlatMapInPlace; use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_errors::{PResult, msg}; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_hir::Target; use rustc_hir::def::MacroKinds; use rustc_hir::limit::Limit; @@ -2530,7 +2530,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { pub struct ExpansionConfig<'feat> { pub crate_name: Symbol, - pub features: &'feat Features, + pub features: &'feat TrackedFeatures, pub recursion_limit: Limit, pub trace_mac: bool, /// If false, strip `#[test]` nodes @@ -2542,7 +2542,7 @@ pub struct ExpansionConfig<'feat> { } impl ExpansionConfig<'_> { - pub fn default(crate_name: Symbol, features: &Features) -> ExpansionConfig<'_> { + pub fn default(crate_name: Symbol, features: &TrackedFeatures) -> ExpansionConfig<'_> { ExpansionConfig { crate_name, features, diff --git a/compiler/rustc_expand/src/mbe/macro_rules.rs b/compiler/rustc_expand/src/mbe/macro_rules.rs index 7cd96211de508..c296284ce5f98 100644 --- a/compiler/rustc_expand/src/mbe/macro_rules.rs +++ b/compiler/rustc_expand/src/mbe/macro_rules.rs @@ -12,7 +12,7 @@ use rustc_ast::{self as ast, DUMMY_NODE_ID, NodeId, Safety}; use rustc_ast_pretty::pprust; use rustc_data_structures::fx::{FxHashMap, FxIndexMap}; use rustc_errors::{Applicability, Diag, ErrorGuaranteed, MultiSpan}; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_hir as hir; use rustc_hir::attrs::AttributeKind; use rustc_hir::def::MacroKinds; @@ -678,7 +678,7 @@ pub(super) fn try_match_macro_derive<'matcher, T: Tracker<'matcher>>( /// Converts a macro item into a syntax extension. pub fn compile_declarative_macro( sess: &Session, - features: &Features, + features: &TrackedFeatures, macro_def: &ast::MacroDef, ident: Ident, attrs: &[hir::Attribute], diff --git a/compiler/rustc_expand/src/mbe/quoted.rs b/compiler/rustc_expand/src/mbe/quoted.rs index eb874a27cece5..775ae8458ec6f 100644 --- a/compiler/rustc_expand/src/mbe/quoted.rs +++ b/compiler/rustc_expand/src/mbe/quoted.rs @@ -2,7 +2,7 @@ use rustc_ast::token::{self, Delimiter, IdentIsRaw, NonterminalKind, Token}; use rustc_ast::tokenstream::TokenStreamIter; use rustc_ast::{NodeId, tokenstream}; use rustc_ast_pretty::pprust; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_session::Session; use rustc_session::parse::feature_err; use rustc_span::edition::Edition; @@ -62,7 +62,7 @@ fn parse( part: RulePart, sess: &Session, node_id: NodeId, - features: &Features, + features: &TrackedFeatures, edition: Edition, ) -> Vec { // Will contain the final collection of `self::TokenTree` @@ -160,7 +160,7 @@ pub(super) fn parse_one_tt( part: RulePart, sess: &Session, node_id: NodeId, - features: &Features, + features: &TrackedFeatures, edition: Edition, ) -> TokenTree { parse(&tokenstream::TokenStream::new(vec![input]), part, sess, node_id, features, edition) @@ -169,14 +169,18 @@ pub(super) fn parse_one_tt( } /// Asks for the `macro_metavar_expr` feature if it is not enabled -fn maybe_emit_macro_metavar_expr_feature(features: &Features, sess: &Session, span: Span) { +fn maybe_emit_macro_metavar_expr_feature(features: &TrackedFeatures, sess: &Session, span: Span) { if !features.macro_metavar_expr() { let msg = "meta-variable expressions are unstable"; feature_err(sess, sym::macro_metavar_expr, span, msg).emit(); } } -fn maybe_emit_macro_metavar_expr_concat_feature(features: &Features, sess: &Session, span: Span) { +fn maybe_emit_macro_metavar_expr_concat_feature( + features: &TrackedFeatures, + sess: &Session, + span: Span, +) { if !features.macro_metavar_expr_concat() { let msg = "the `concat` meta-variable expression is unstable"; feature_err(sess, sym::macro_metavar_expr_concat, span, msg).emit(); @@ -203,7 +207,7 @@ fn parse_tree<'a>( part: RulePart, sess: &Session, node_id: NodeId, - features: &Features, + features: &TrackedFeatures, edition: Edition, ) -> TokenTree { // Depending on what `tree` is, we could be parsing different parts of a macro diff --git a/compiler/rustc_feature/src/builtin_attrs.rs b/compiler/rustc_feature/src/builtin_attrs.rs index 2c2dae0fef52e..b27674b49de8e 100644 --- a/compiler/rustc_feature/src/builtin_attrs.rs +++ b/compiler/rustc_feature/src/builtin_attrs.rs @@ -11,56 +11,68 @@ use rustc_hir::attrs::EncodeCrossCrate; use rustc_span::edition::Edition; use rustc_span::{Symbol, sym}; -use crate::Features; +use crate::TrackedFeatures; -type GateFn = fn(&Features) -> bool; +type GateFn = fn(&TrackedFeatures) -> bool; pub type GatedCfg = (Symbol, Symbol, GateFn); /// `cfg(...)`'s that are feature gated. const GATED_CFGS: &[GatedCfg] = &[ // (name in cfg, feature, function to check if the feature is enabled) - (sym::overflow_checks, sym::cfg_overflow_checks, Features::cfg_overflow_checks), - (sym::ub_checks, sym::cfg_ub_checks, Features::cfg_ub_checks), - (sym::contract_checks, sym::cfg_contract_checks, Features::cfg_contract_checks), - (sym::target_thread_local, sym::cfg_target_thread_local, Features::cfg_target_thread_local), + (sym::overflow_checks, sym::cfg_overflow_checks, TrackedFeatures::cfg_overflow_checks), + (sym::ub_checks, sym::cfg_ub_checks, TrackedFeatures::cfg_ub_checks), + (sym::contract_checks, sym::cfg_contract_checks, TrackedFeatures::cfg_contract_checks), + ( + sym::target_thread_local, + sym::cfg_target_thread_local, + TrackedFeatures::cfg_target_thread_local, + ), ( sym::target_has_atomic_equal_alignment, sym::cfg_target_has_atomic_equal_alignment, - Features::cfg_target_has_atomic_equal_alignment, + TrackedFeatures::cfg_target_has_atomic_equal_alignment, ), ( sym::target_has_atomic_load_store, sym::cfg_target_has_atomic, - Features::cfg_target_has_atomic, + TrackedFeatures::cfg_target_has_atomic, + ), + (sym::sanitize, sym::cfg_sanitize, TrackedFeatures::cfg_sanitize), + (sym::version, sym::cfg_version, TrackedFeatures::cfg_version), + (sym::relocation_model, sym::cfg_relocation_model, TrackedFeatures::cfg_relocation_model), + ( + sym::sanitizer_cfi_generalize_pointers, + sym::cfg_sanitizer_cfi, + TrackedFeatures::cfg_sanitizer_cfi, + ), + ( + sym::sanitizer_cfi_normalize_integers, + sym::cfg_sanitizer_cfi, + TrackedFeatures::cfg_sanitizer_cfi, ), - (sym::sanitize, sym::cfg_sanitize, Features::cfg_sanitize), - (sym::version, sym::cfg_version, Features::cfg_version), - (sym::relocation_model, sym::cfg_relocation_model, Features::cfg_relocation_model), - (sym::sanitizer_cfi_generalize_pointers, sym::cfg_sanitizer_cfi, Features::cfg_sanitizer_cfi), - (sym::sanitizer_cfi_normalize_integers, sym::cfg_sanitizer_cfi, Features::cfg_sanitizer_cfi), // this is consistent with naming of the compiler flag it's for - (sym::fmt_debug, sym::fmt_debug, Features::fmt_debug), - (sym::emscripten_wasm_eh, sym::cfg_emscripten_wasm_eh, Features::cfg_emscripten_wasm_eh), + (sym::fmt_debug, sym::fmt_debug, TrackedFeatures::fmt_debug), + (sym::emscripten_wasm_eh, sym::cfg_emscripten_wasm_eh, TrackedFeatures::cfg_emscripten_wasm_eh), ( sym::target_has_reliable_f16, sym::cfg_target_has_reliable_f16_f128, - Features::cfg_target_has_reliable_f16_f128, + TrackedFeatures::cfg_target_has_reliable_f16_f128, ), ( sym::target_has_reliable_f16_math, sym::cfg_target_has_reliable_f16_f128, - Features::cfg_target_has_reliable_f16_f128, + TrackedFeatures::cfg_target_has_reliable_f16_f128, ), ( sym::target_has_reliable_f128, sym::cfg_target_has_reliable_f16_f128, - Features::cfg_target_has_reliable_f16_f128, + TrackedFeatures::cfg_target_has_reliable_f16_f128, ), ( sym::target_has_reliable_f128_math, sym::cfg_target_has_reliable_f16_f128, - Features::cfg_target_has_reliable_f16_f128, + TrackedFeatures::cfg_target_has_reliable_f16_f128, ), ]; @@ -105,7 +117,7 @@ pub enum AttributeGate { /// The error message displayed when an attempt is made to use the attribute without its feature gate. message: &'static str, /// Check function to be called during the `PostExpansionVisitor` pass. - check: fn(&Features) -> bool, + check: fn(&TrackedFeatures) -> bool, /// Notes to be displayed when an attempt is made to use the attribute without its feature gate. notes: &'static [&'static str], }, @@ -315,7 +327,7 @@ macro_rules! gated { gate: Gated { feature: sym::$gate, message: $message, - check: Features::$gate, + check: TrackedFeatures::$gate, notes: &[], }, } @@ -331,7 +343,7 @@ macro_rules! gated { gate: Gated { feature: sym::$attr, message: $message, - check: Features::$attr, + check: TrackedFeatures::$attr, notes: &[], }, } @@ -347,7 +359,7 @@ macro_rules! gated { gate: Gated { feature: sym::$gate, message: $message, - check: Features::$gate, + check: TrackedFeatures::$gate, notes: &[], }, } @@ -363,7 +375,7 @@ macro_rules! gated { gate: Gated { feature: sym::$attr, message: $message, - check: Features::$attr, + check: TrackedFeatures::$attr, notes: &[], }, } @@ -396,7 +408,7 @@ macro_rules! rustc_attr { gate: Gated { feature: sym::rustc_attrs, message: "use of an internal attribute", - check: Features::rustc_attrs, + check: TrackedFeatures::rustc_attrs, notes: &[ concat!("the `#[", stringify!($attr), @@ -1330,10 +1342,10 @@ pub static BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ safety: AttributeSafety::Normal, template: template!(NameValueStr: "name"), duplicates: ErrorFollowing, - gate: Gated{ + gate: Gated { feature: sym::rustc_attrs, message: "use of an internal attribute", - check: Features::rustc_attrs, + check: TrackedFeatures::rustc_attrs, notes: &["the `#[rustc_diagnostic_item]` attribute allows the compiler to reference types \ from the standard library for diagnostic purposes"], }, @@ -1581,7 +1593,7 @@ pub static BUILTIN_ATTRIBUTE_MAP: LazyLock> map }); -pub fn is_stable_diagnostic_attribute(sym: Symbol, features: &Features) -> bool { +pub fn is_stable_diagnostic_attribute(sym: Symbol, features: &TrackedFeatures) -> bool { match sym { sym::on_unimplemented | sym::do_not_recommend => true, sym::on_const => features.diagnostic_on_const(), diff --git a/compiler/rustc_interface/src/passes.rs b/compiler/rustc_interface/src/passes.rs index 85ca1e86d7e64..5cc7a2fb56b1a 100644 --- a/compiler/rustc_interface/src/passes.rs +++ b/compiler/rustc_interface/src/passes.rs @@ -16,7 +16,7 @@ use rustc_data_structures::sync::{AppendOnlyIndexVec, FreezeLock, WorkerLocal, p use rustc_data_structures::thousands; use rustc_errors::timings::TimingSection; use rustc_expand::base::{ExtCtxt, LintStoreExpand}; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_fs_util::try_canonicalize; use rustc_hir::attrs::AttributeKind; use rustc_hir::def_id::{LOCAL_CRATE, StableCrateId, StableCrateIdMap}; @@ -84,7 +84,7 @@ pub fn parse<'a>(sess: &'a Session) -> ast::Crate { fn pre_expansion_lint<'a>( sess: &Session, - features: &Features, + features: &TrackedFeatures, lint_store: &LintStore, registered_tools: &RegisteredTools, check_node: impl EarlyCheckNode<'a>, @@ -114,7 +114,7 @@ impl LintStoreExpand for LintStoreExpandImpl<'_> { fn pre_expansion_lint( &self, sess: &Session, - features: &Features, + features: &TrackedFeatures, registered_tools: &RegisteredTools, node_id: ast::NodeId, attrs: &[ast::Attribute], @@ -1027,6 +1027,7 @@ pub fn create_and_enter_global_ctxt FnOnce(TyCtxt<'tcx>) -> T>( let res = f(tcx); // FIXME maybe run finish even when a fatal error occurred? or at least tcx.alloc_self_profile_query_strings()? tcx.finish(); + res }, ) diff --git a/compiler/rustc_lint/src/context.rs b/compiler/rustc_lint/src/context.rs index 19f3a9b4c062e..f40075c27578e 100644 --- a/compiler/rustc_lint/src/context.rs +++ b/compiler/rustc_lint/src/context.rs @@ -12,7 +12,7 @@ use rustc_data_structures::fx::FxIndexMap; use rustc_data_structures::sync; use rustc_data_structures::unord::UnordMap; use rustc_errors::{Diag, LintBuffer, LintDiagnostic, MultiSpan}; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_hir::def::Res; use rustc_hir::def_id::{CrateNum, DefId}; use rustc_hir::definitions::{DefPathData, DisambiguatedDefPathData}; @@ -600,7 +600,7 @@ pub trait LintContext { impl<'a> EarlyContext<'a> { pub(crate) fn new( sess: &'a Session, - features: &'a Features, + features: &'a TrackedFeatures, lint_added_lints: bool, lint_store: &'a LintStore, registered_tools: &'a RegisteredTools, diff --git a/compiler/rustc_lint/src/early.rs b/compiler/rustc_lint/src/early.rs index 0295df2feca56..08173396cf120 100644 --- a/compiler/rustc_lint/src/early.rs +++ b/compiler/rustc_lint/src/early.rs @@ -8,7 +8,7 @@ use rustc_ast::visit::{self as ast_visit, Visitor, walk_list}; use rustc_ast::{self as ast, AttrVec, HasAttrs}; use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_errors::{BufferedEarlyLint, DecorateDiagCompat, LintBuffer}; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_middle::ty::{RegisteredTools, TyCtxt}; use rustc_session::Session; use rustc_session::lint::LintPass; @@ -315,7 +315,7 @@ impl<'a> EarlyCheckNode<'a> for (ast::NodeId, &'a [ast::Attribute], &'a [Box( sess: &Session, tcx: Option>, - features: &Features, + features: &TrackedFeatures, pre_expansion: bool, lint_store: &LintStore, registered_tools: &RegisteredTools, diff --git a/compiler/rustc_lint/src/levels.rs b/compiler/rustc_lint/src/levels.rs index 0481188757129..5f6274b24ac1e 100644 --- a/compiler/rustc_lint/src/levels.rs +++ b/compiler/rustc_lint/src/levels.rs @@ -3,7 +3,7 @@ use rustc_ast_pretty::pprust; use rustc_data_structures::fx::{FxHashSet, FxIndexMap}; use rustc_data_structures::unord::UnordSet; use rustc_errors::{Diag, LintDiagnostic, MultiSpan, msg}; -use rustc_feature::{Features, GateIssue}; +use rustc_feature::{GateIssue, TrackedFeatures}; use rustc_hir::HirId; use rustc_hir::intravisit::{self, Visitor}; use rustc_index::IndexVec; @@ -348,7 +348,7 @@ impl<'tcx> Visitor<'tcx> for LintLevelsBuilder<'_, LintLevelQueryMap<'tcx>> { pub struct LintLevelsBuilder<'s, P> { sess: &'s Session, - features: &'s Features, + features: &'s TrackedFeatures, provider: P, lint_added_lints: bool, store: &'s LintStore, @@ -362,7 +362,7 @@ pub(crate) struct BuilderPush { impl<'s> LintLevelsBuilder<'s, TopDown> { pub(crate) fn new( sess: &'s Session, - features: &'s Features, + features: &'s TrackedFeatures, lint_added_lints: bool, store: &'s LintStore, registered_tools: &'s RegisteredTools, @@ -382,7 +382,7 @@ impl<'s> LintLevelsBuilder<'s, TopDown> { pub fn crate_root( sess: &'s Session, - features: &'s Features, + features: &'s TrackedFeatures, lint_added_lints: bool, store: &'s LintStore, registered_tools: &'s RegisteredTools, @@ -455,7 +455,7 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> { self.sess } - pub(crate) fn features(&self) -> &Features { + pub(crate) fn features(&self) -> &TrackedFeatures { self.features } diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index 3a85b0a050526..d6edc32b00aa2 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -10,7 +10,7 @@ use rustc_data_structures::memmap::{Mmap, MmapMut}; use rustc_data_structures::sync::{par_for_each_in, par_join}; use rustc_data_structures::temp_dir::MaybeTempDir; use rustc_data_structures::thousands::usize_with_underscores; -use rustc_feature::Features; +use rustc_feature::TrackedFeatures; use rustc_hir as hir; use rustc_hir::attrs::{AttributeKind, EncodeCrossCrate}; use rustc_hir::def_id::{CRATE_DEF_ID, CRATE_DEF_INDEX, LOCAL_CRATE, LocalDefId, LocalDefIdSet}; @@ -42,7 +42,7 @@ use crate::rmeta::*; pub(super) struct EncodeContext<'a, 'tcx> { opaque: opaque::FileEncoder, tcx: TyCtxt<'tcx>, - feat: &'tcx rustc_feature::Features, + feat: &'tcx rustc_feature::TrackedFeatures, tables: TableBuilders, lazy_state: LazyState, @@ -848,7 +848,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { struct AnalyzeAttrState<'a> { is_exported: bool, is_doc_hidden: bool, - features: &'a Features, + features: &'a TrackedFeatures, } /// Returns whether an attribute needs to be recorded in metadata, that is, if it's usable and From 44826ad6775cf089ffbcf4fd207a200073f07675 Mon Sep 17 00:00:00 2001 From: mu001999 Date: Sat, 7 Feb 2026 19:17:41 +0800 Subject: [PATCH 3/8] Skip unused restricted_std --- compiler/rustc_feature/src/unstable.rs | 11 ++++++++++- compiler/rustc_lint_defs/src/builtin.rs | 5 ----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/compiler/rustc_feature/src/unstable.rs b/compiler/rustc_feature/src/unstable.rs index 81598a7c4cb15..abe4d02a9af93 100644 --- a/compiler/rustc_feature/src/unstable.rs +++ b/compiler/rustc_feature/src/unstable.rs @@ -57,7 +57,16 @@ impl TrackedFeatures { pub fn unused_features(&self) -> Vec<(Symbol, Span)> { let used_features = self.used_features.lock().unwrap(); self.enabled_features_iter_stable_order() - .filter(|(f, _)| !used_features.contains(f)) + .filter(|(f, _)| { + !used_features.contains(f) + // FIXME: `restricted_std` is used to tell a standard library built + // for a platform that it doesn't know how to support. But it + // could only gate a private mod (see `__restricted_std_workaround`) + // with `cfg(not(restricted_std))`, so it cannot be recorded as used + // in downstream crates. It should never be linted, but should we + // hack this in the linter to ignore it? + && f.as_str() != "restricted_std" + }) .collect() } diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs index 9e80ddbd551f9..004d925cdd13c 100644 --- a/compiler/rustc_lint_defs/src/builtin.rs +++ b/compiler/rustc_lint_defs/src/builtin.rs @@ -1089,11 +1089,6 @@ declare_lint! { /// crate-level [`feature` attributes]. /// /// [`feature` attributes]: https://doc.rust-lang.org/nightly/unstable-book/ - /// - /// Note: This lint is currently not functional, see [issue #44232] for - /// more details. - /// - /// [issue #44232]: https://github.com/rust-lang/rust/issues/44232 pub UNUSED_FEATURES, Warn, "unused features found in crate-level `#[feature]` directives" From bf393e27882f56bfa696b5c1abda235bd47abea5 Mon Sep 17 00:00:00 2001 From: mu001999 Date: Thu, 5 Feb 2026 23:22:09 +0800 Subject: [PATCH 4/8] Add tests for unused-features --- .../unused-language-features.rs | 25 ++++++++++++ .../unused-language-features.stderr | 38 +++++++++++++++++++ .../unused-library-features.rs | 13 +++++++ .../unused-library-features.stderr | 34 +++++++++++++++++ .../unused-features/used-language-features.rs | 30 +++++++++++++++ .../unused-features/used-library-features.rs | 17 +++++++++ 6 files changed, 157 insertions(+) create mode 100644 tests/ui/lint/unused-features/unused-language-features.rs create mode 100644 tests/ui/lint/unused-features/unused-language-features.stderr create mode 100644 tests/ui/lint/unused-features/unused-library-features.rs create mode 100644 tests/ui/lint/unused-features/unused-library-features.stderr create mode 100644 tests/ui/lint/unused-features/used-language-features.rs create mode 100644 tests/ui/lint/unused-features/used-library-features.rs diff --git a/tests/ui/lint/unused-features/unused-language-features.rs b/tests/ui/lint/unused-features/unused-language-features.rs new file mode 100644 index 0000000000000..9334c1df0408a --- /dev/null +++ b/tests/ui/lint/unused-features/unused-language-features.rs @@ -0,0 +1,25 @@ +#![crate_type = "lib"] +#![deny(unused_features)] + +// Unused language features +#![feature(coroutines)] +//~^ ERROR feature `coroutines` is declared but not used +#![feature(coroutine_clone)] +//~^ ERROR feature `coroutine_clone` is declared but not used +#![feature(stmt_expr_attributes)] +//~^ ERROR feature `stmt_expr_attributes` is declared but not used +#![feature(asm_unwind)] +//~^ ERROR feature `asm_unwind` is declared but not used + +// Enabled via cfg_attr, unused +#![cfg_attr(all(), feature(negative_impls))] +//~^ ERROR feature `negative_impls` is declared but not used + +// Not enabled via cfg_attr, so should not warn even if unused +#![cfg_attr(any(), feature(never_type))] + +macro_rules! use_asm_unwind { + () => { + unsafe { std::arch::asm!("", options(may_unwind)) }; + } +} diff --git a/tests/ui/lint/unused-features/unused-language-features.stderr b/tests/ui/lint/unused-features/unused-language-features.stderr new file mode 100644 index 0000000000000..3cede1a6fe726 --- /dev/null +++ b/tests/ui/lint/unused-features/unused-language-features.stderr @@ -0,0 +1,38 @@ +error: feature `coroutines` is declared but not used + --> $DIR/unused-language-features.rs:5:12 + | +LL | #![feature(coroutines)] + | ^^^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/unused-language-features.rs:2:9 + | +LL | #![deny(unused_features)] + | ^^^^^^^^^^^^^^^ + +error: feature `coroutine_clone` is declared but not used + --> $DIR/unused-language-features.rs:7:12 + | +LL | #![feature(coroutine_clone)] + | ^^^^^^^^^^^^^^^ + +error: feature `stmt_expr_attributes` is declared but not used + --> $DIR/unused-language-features.rs:9:12 + | +LL | #![feature(stmt_expr_attributes)] + | ^^^^^^^^^^^^^^^^^^^^ + +error: feature `asm_unwind` is declared but not used + --> $DIR/unused-language-features.rs:11:12 + | +LL | #![feature(asm_unwind)] + | ^^^^^^^^^^ + +error: feature `negative_impls` is declared but not used + --> $DIR/unused-language-features.rs:15:28 + | +LL | #![cfg_attr(all(), feature(negative_impls))] + | ^^^^^^^^^^^^^^ + +error: aborting due to 5 previous errors + diff --git a/tests/ui/lint/unused-features/unused-library-features.rs b/tests/ui/lint/unused-features/unused-library-features.rs new file mode 100644 index 0000000000000..75afd32e56cb3 --- /dev/null +++ b/tests/ui/lint/unused-features/unused-library-features.rs @@ -0,0 +1,13 @@ +#![crate_type = "lib"] +#![deny(unused_features)] + +// Unused library features +#![feature(step_trait)] +//~^ ERROR feature `step_trait` is declared but not used +#![feature(is_sorted)] +//~^ ERROR feature `is_sorted` is declared but not used +//~^^ WARN the feature `is_sorted` has been stable since 1.82.0 and no longer requires an attribute to enable + +// Enabled via cfg_attr, unused +#![cfg_attr(all(), feature(slice_ptr_get))] +//~^ ERROR feature `slice_ptr_get` is declared but not used diff --git a/tests/ui/lint/unused-features/unused-library-features.stderr b/tests/ui/lint/unused-features/unused-library-features.stderr new file mode 100644 index 0000000000000..e259058d6c33b --- /dev/null +++ b/tests/ui/lint/unused-features/unused-library-features.stderr @@ -0,0 +1,34 @@ +warning: the feature `is_sorted` has been stable since 1.82.0 and no longer requires an attribute to enable + --> $DIR/unused-library-features.rs:7:12 + | +LL | #![feature(is_sorted)] + | ^^^^^^^^^ + | + = note: `#[warn(stable_features)]` on by default + +error: feature `step_trait` is declared but not used + --> $DIR/unused-library-features.rs:5:12 + | +LL | #![feature(step_trait)] + | ^^^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/unused-library-features.rs:2:9 + | +LL | #![deny(unused_features)] + | ^^^^^^^^^^^^^^^ + +error: feature `is_sorted` is declared but not used + --> $DIR/unused-library-features.rs:7:12 + | +LL | #![feature(is_sorted)] + | ^^^^^^^^^ + +error: feature `slice_ptr_get` is declared but not used + --> $DIR/unused-library-features.rs:12:28 + | +LL | #![cfg_attr(all(), feature(slice_ptr_get))] + | ^^^^^^^^^^^^^ + +error: aborting due to 3 previous errors; 1 warning emitted + diff --git a/tests/ui/lint/unused-features/used-language-features.rs b/tests/ui/lint/unused-features/used-language-features.rs new file mode 100644 index 0000000000000..dcf7afd24c503 --- /dev/null +++ b/tests/ui/lint/unused-features/used-language-features.rs @@ -0,0 +1,30 @@ +//@ check-pass + +#![crate_type = "lib"] +#![deny(unused_features)] + +// Used language features +#![feature(box_patterns)] +#![feature(if_let_guard)] +#![feature(decl_macro)] +#![cfg_attr(all(), feature(rustc_attrs))] + +pub fn use_box_patterns(b: Box) -> i32 { + let box x = b; + x +} + +pub fn use_if_let_guard(x: Option) -> i32 { + match x { + Some(y) if let 1 = y => 1, + _ => 0, + } +} + +macro m() {} +pub fn use_decl_macro() { + m!(); +} + +#[rustc_dummy] +pub fn use_rustc_attrs() {} diff --git a/tests/ui/lint/unused-features/used-library-features.rs b/tests/ui/lint/unused-features/used-library-features.rs new file mode 100644 index 0000000000000..1747c7741880e --- /dev/null +++ b/tests/ui/lint/unused-features/used-library-features.rs @@ -0,0 +1,17 @@ +//@ check-pass + +#![crate_type = "lib"] +#![deny(unused_features)] + +// Used library features +#![feature(error_iter)] +#![cfg_attr(all(), feature(allocator_api))] + +pub fn use_error_iter(e: &(dyn std::error::Error + 'static)) { + for _ in e.sources() {} +} + +pub fn use_allocator_api() { + use std::alloc::Global; + let _ = Vec::::new_in(Global); +} From 2fd0092d9642110527faa5df20082bb7c860a8c5 Mon Sep 17 00:00:00 2001 From: mu001999 Date: Thu, 12 Feb 2026 11:15:31 +0800 Subject: [PATCH 5/8] Allow unused features in tests --- .../struct_point.rs | 1 + .../change_add_field/struct_point.rs | 1 + tests/incremental/change_crate_dep_kind.rs | 1 + .../change_private_fn/struct_point.rs | 1 + .../change_private_fn_cc/struct_point.rs | 1 + .../struct_point.rs | 1 + .../struct_point.rs | 1 + .../struct_point.rs | 1 + .../struct_point.rs | 1 + tests/ui-fulldeps/rustc_public/check_abi.rs | 1 + .../rustc_public/check_assoc_items.rs | 1 + .../rustc_public/check_coroutine_body.rs | 1 + .../rustc_public/check_crate_defs.rs | 1 + .../ui-fulldeps/rustc_public/check_def_ty.rs | 1 + .../rustc_public/check_instance.rs | 1 + .../rustc_public/check_item_kind.rs | 1 + .../rustc_public/check_trait_queries.rs | 1 + .../rustc_public/check_transform.rs | 1 + .../ui-fulldeps/rustc_public/check_ty_fold.rs | 1 + .../ui-fulldeps/rustc_public/check_variant.rs | 1 + .../rustc_public/closure-generic-body.rs | 1 + .../ui-fulldeps/rustc_public/closure_body.rs | 1 + .../rustc_public/compilation-result.rs | 1 + .../ui-fulldeps/rustc_public/smir_internal.rs | 1 + tests/ui-fulldeps/rustc_public/smir_serde.rs | 1 + .../ui-fulldeps/rustc_public/smir_visitor.rs | 1 + tests/ui/allocator/xcrate-use2.rs | 1 + .../ui/array-slice-vec/array_const_index-2.rs | 1 + .../slice-of-zero-size-elements.rs | 1 + .../associated-types-impl-redirect.rs | 1 + ...iated-types-where-clause-impl-ambiguity.rs | 1 + .../async-drop/async-drop-initial.rs | 1 + tests/ui/backtrace/line-tables-only.rs | 1 + tests/ui/borrowck/fsu-moves-and-copies.rs | 1 + ...uper-let-lifetime-and-drop.borrowck.stderr | 26 ++--- .../borrowck/super-let-lifetime-and-drop.rs | 1 + tests/ui/cfg/cfg_stmt_expr.rs | 1 + tests/ui/cfg/crt-static-off-works.rs | 1 + tests/ui/const-generics/transmute.rs | 1 + tests/ui/consts/const-fn-type-name.rs | 1 + tests/ui/consts/const-fn.rs | 1 + tests/ui/consts/const-ptr-nonnull-rpass.rs | 1 + tests/ui/consts/issue-29914.rs | 1 + tests/ui/consts/try-operator.rs | 1 + .../internal_machinery/lowering/basics.rs | 1 + tests/ui/coroutine/control-flow.rs | 1 + .../missing_coroutine_attr_suggestion.fixed | 1 + .../missing_coroutine_attr_suggestion.rs | 1 + .../missing_coroutine_attr_suggestion.stderr | 2 +- tests/ui/coroutine/non-static-is-unpin.rs | 1 + tests/ui/coroutine/other-attribute-on-gen.rs | 1 + tests/ui/coroutine/pin-box-coroutine.rs | 1 + tests/ui/coroutine/xcrate.rs | 1 + .../drop/drop-order-comparisons.e2021.fixed | 1 + .../drop/drop-order-comparisons.e2021.stderr | 96 +++++++++---------- tests/ui/drop/drop-order-comparisons.rs | 1 + tests/ui/dropck/cleanup-arm-conditional.rs | 1 + .../dynamically-sized-types/dst-coerce-rc.rs | 1 + tests/ui/eii/default/call_default.rs | 1 + tests/ui/eii/default/call_impl.rs | 1 + tests/ui/eii/linking/codegen_cross_crate.rs | 1 + tests/ui/eii/privacy1.rs | 1 + .../enum-discriminant/discriminant_value.rs | 1 + tests/ui/extern/extern-prelude-core.rs | 1 + ...re-gate-explicit-extern-abis.current.fixed | 1 + ...e-gate-explicit-extern-abis.current.stderr | 6 +- ...explicit-extern-abis.current_feature.fixed | 1 + ...xplicit-extern-abis.current_feature.stderr | 6 +- ...ure-gate-explicit-extern-abis.future.fixed | 1 + ...re-gate-explicit-extern-abis.future.stderr | 6 +- ...explicit-extern-abis.future_feature.stderr | 6 +- .../feature-gate-explicit-extern-abis.rs | 1 + tests/ui/float/classify-runtime-const.rs | 1 + tests/ui/float/conv-bits-runtime-const.rs | 1 + tests/ui/fmt/format-macro-no-std.rs | 1 + .../parallel-codegen-closures.rs | 1 + .../half-open-range-pats-semantics.rs | 1 + tests/ui/hygiene/xcrate.rs | 1 + tests/ui/impl-trait/example-calendar.rs | 1 + .../ui/inference/iterator-sum-array-15673.rs | 1 + tests/ui/intrinsics/intrinsic-alignment.rs | 1 + tests/ui/io-checks/write-macro-error.rs | 1 + tests/ui/issues/issue-21634.rs | 1 + tests/ui/issues/issue-29663.rs | 1 + .../iterators/iter-cloned-type-inference.rs | 1 + .../iterator-type-inference-sum-15673.rs | 1 + .../linkage-attr/raw-dylib/elf/as_needed.rs | 1 + .../lint-expr-stmt-attrs-for-early-lints.rs | 1 + tests/ui/lint/lint-unknown-feature.rs | 1 + ...necessary-qualification-issue-121331.fixed | 1 + ...-unnecessary-qualification-issue-121331.rs | 1 + ...ecessary-qualification-issue-121331.stderr | 4 +- .../unused/unused_attributes-must_use.fixed | 1 + .../lint/unused/unused_attributes-must_use.rs | 1 + .../unused/unused_attributes-must_use.stderr | 62 ++++++------ tests/ui/lowering/issue-96847.rs | 1 + tests/ui/lowering/issue-96847.stderr | 2 +- .../metavar_cross_edition_recursive_macros.rs | 1 + .../ui/macros/parse-complex-macro-invoc-op.rs | 1 + .../all-expr-kinds.rs | 1 + .../all-not-available-cases.rs | 1 + ...errors-does-not-create-unnecessary-code.rs | 1 + ...ptures-does-not-create-unnecessary-code.rs | 1 + .../feature-gate-generic_assert.rs | 1 + tests/ui/macros/stringify.rs | 1 + tests/ui/match/match-float.rs | 1 + .../method-normalize-bounds-issue-20604.rs | 1 + .../supertrait-shadowing/out-of-scope.rs | 1 + tests/ui/mir/mir_fat_ptr_drop.rs | 1 + tests/ui/nll/issue-48623-coroutine.rs | 1 + tests/ui/nll/issue-48623-coroutine.stderr | 2 +- .../no_std/no-core-with-explicit-std-core.rs | 1 + .../ui/overloaded/overloaded-calls-simple.rs | 1 + .../panics/panic-handler-chain-update-hook.rs | 1 + tests/ui/panics/panic-handler-chain.rs | 1 + tests/ui/panics/panic-handler-flail-wildly.rs | 1 + tests/ui/panics/panic-handler-set-twice.rs | 1 + .../regions-bound-lists-feature-gate-2.rs | 1 + .../regions-bound-lists-feature-gate.rs | 1 + tests/ui/repr/align-with-extern-c-fn.rs | 1 + tests/ui/sanitizer/memory-passing.rs | 1 + .../monomorphize-shuffle-index.generic.stderr | 2 +- tests/ui/simd/monomorphize-shuffle-index.rs | 1 + tests/ui/simd/target-feature-mixup.rs | 1 + tests/ui/structs-enums/rec-align-u32.rs | 1 + tests/ui/structs-enums/rec-align-u64.rs | 1 + .../target-feature-detection.rs | 1 + tests/ui/threads-sendsync/tls-init-on-init.rs | 1 + tests/ui/threads-sendsync/tls-try-with.rs | 1 + tests/ui/traits/alias/import-cross-crate.rs | 1 + .../overlap-permitted-for-marker-traits.rs | 1 + tests/ui/type/typeid-consistency.rs | 1 + .../typeck/type-name-intrinsic-usage-61894.rs | 1 + tests/ui/use/use.rs | 1 + 134 files changed, 232 insertions(+), 110 deletions(-) diff --git a/tests/incremental/add_private_fn_at_krate_root_cc/struct_point.rs b/tests/incremental/add_private_fn_at_krate_root_cc/struct_point.rs index 0367af8d53b8d..ef02b2165576e 100644 --- a/tests/incremental/add_private_fn_at_krate_root_cc/struct_point.rs +++ b/tests/incremental/add_private_fn_at_krate_root_cc/struct_point.rs @@ -11,6 +11,7 @@ #![feature(rustc_attrs)] #![feature(stmt_expr_attributes)] #![allow(dead_code)] +#![allow(unused_features)] #![crate_type = "rlib"] #![rustc_partition_reused(module="struct_point-fn_calls_methods_in_same_impl", cfg="cfail2")] diff --git a/tests/incremental/change_add_field/struct_point.rs b/tests/incremental/change_add_field/struct_point.rs index fb363c9ce496f..6c39b502df0f4 100644 --- a/tests/incremental/change_add_field/struct_point.rs +++ b/tests/incremental/change_add_field/struct_point.rs @@ -11,6 +11,7 @@ #![feature(rustc_attrs)] #![feature(stmt_expr_attributes)] #![allow(dead_code)] +#![allow(unused_features)] #![crate_type = "rlib"] // These are expected to require codegen. diff --git a/tests/incremental/change_crate_dep_kind.rs b/tests/incremental/change_crate_dep_kind.rs index 4fd0c345aad21..815fcdea6c746 100644 --- a/tests/incremental/change_crate_dep_kind.rs +++ b/tests/incremental/change_crate_dep_kind.rs @@ -8,6 +8,7 @@ //@ build-pass (FIXME(62277): could be check-pass?) //@ ignore-backends: gcc +#![allow(unused_features)] #![feature(panic_unwind)] // Turn the panic_unwind crate from an explicit into an implicit query: diff --git a/tests/incremental/change_private_fn/struct_point.rs b/tests/incremental/change_private_fn/struct_point.rs index cce26fa7a3e6e..2fcc144a9cfa6 100644 --- a/tests/incremental/change_private_fn/struct_point.rs +++ b/tests/incremental/change_private_fn/struct_point.rs @@ -9,6 +9,7 @@ #![feature(rustc_attrs)] #![feature(stmt_expr_attributes)] #![allow(dead_code)] +#![allow(unused_features)] #![crate_type = "rlib"] #![rustc_partition_codegened(module="struct_point-point", cfg="cfail2")] diff --git a/tests/incremental/change_private_fn_cc/struct_point.rs b/tests/incremental/change_private_fn_cc/struct_point.rs index 87392ca857ed7..3e4c7515ceedd 100644 --- a/tests/incremental/change_private_fn_cc/struct_point.rs +++ b/tests/incremental/change_private_fn_cc/struct_point.rs @@ -11,6 +11,7 @@ #![feature(rustc_attrs)] #![feature(stmt_expr_attributes)] #![allow(dead_code)] +#![allow(unused_features)] #![rustc_partition_reused(module="struct_point-fn_calls_methods_in_same_impl", cfg="cfail2")] #![rustc_partition_reused(module="struct_point-fn_calls_methods_in_another_impl", cfg="cfail2")] diff --git a/tests/incremental/change_private_impl_method/struct_point.rs b/tests/incremental/change_private_impl_method/struct_point.rs index dc0ba82c0a311..a85672b5e1029 100644 --- a/tests/incremental/change_private_impl_method/struct_point.rs +++ b/tests/incremental/change_private_impl_method/struct_point.rs @@ -9,6 +9,7 @@ #![feature(rustc_attrs)] #![feature(stmt_expr_attributes)] #![allow(dead_code)] +#![allow(unused_features)] #![crate_type = "rlib"] #![rustc_partition_codegened(module="struct_point-point", cfg="cfail2")] diff --git a/tests/incremental/change_private_impl_method_cc/struct_point.rs b/tests/incremental/change_private_impl_method_cc/struct_point.rs index eb51af7209495..00a641c17e00f 100644 --- a/tests/incremental/change_private_impl_method_cc/struct_point.rs +++ b/tests/incremental/change_private_impl_method_cc/struct_point.rs @@ -11,6 +11,7 @@ #![feature(rustc_attrs)] #![feature(stmt_expr_attributes)] #![allow(dead_code)] +#![allow(unused_features)] #![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] #![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] diff --git a/tests/incremental/change_pub_inherent_method_body/struct_point.rs b/tests/incremental/change_pub_inherent_method_body/struct_point.rs index b8e06d070a3c7..8a1358b2ebc86 100644 --- a/tests/incremental/change_pub_inherent_method_body/struct_point.rs +++ b/tests/incremental/change_pub_inherent_method_body/struct_point.rs @@ -9,6 +9,7 @@ #![feature(rustc_attrs)] #![feature(stmt_expr_attributes)] #![allow(dead_code)] +#![allow(unused_features)] #![rustc_partition_codegened(module="struct_point-point", cfg="cfail2")] diff --git a/tests/incremental/change_pub_inherent_method_sig/struct_point.rs b/tests/incremental/change_pub_inherent_method_sig/struct_point.rs index 3672ec268010e..981ce9872b7ae 100644 --- a/tests/incremental/change_pub_inherent_method_sig/struct_point.rs +++ b/tests/incremental/change_pub_inherent_method_sig/struct_point.rs @@ -9,6 +9,7 @@ #![feature(rustc_attrs)] #![feature(stmt_expr_attributes)] #![allow(dead_code)] +#![allow(unused_features)] // These are expected to require codegen. #![rustc_partition_codegened(module="struct_point-point", cfg="cfail2")] diff --git a/tests/ui-fulldeps/rustc_public/check_abi.rs b/tests/ui-fulldeps/rustc_public/check_abi.rs index 8e97b773db567..3733471fcbc97 100644 --- a/tests/ui-fulldeps/rustc_public/check_abi.rs +++ b/tests/ui-fulldeps/rustc_public/check_abi.rs @@ -5,6 +5,7 @@ //@ ignore-cross-compile //@ ignore-remote +#![allow(unused_features)] #![feature(rustc_private)] #![feature(ascii_char, ascii_char_variants)] diff --git a/tests/ui-fulldeps/rustc_public/check_assoc_items.rs b/tests/ui-fulldeps/rustc_public/check_assoc_items.rs index ee0efd083588a..a1865225308c0 100644 --- a/tests/ui-fulldeps/rustc_public/check_assoc_items.rs +++ b/tests/ui-fulldeps/rustc_public/check_assoc_items.rs @@ -7,6 +7,7 @@ //@ ignore-remote //@ edition: 2021 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_middle; diff --git a/tests/ui-fulldeps/rustc_public/check_coroutine_body.rs b/tests/ui-fulldeps/rustc_public/check_coroutine_body.rs index f988452fd52ba..b889858fa4e6d 100644 --- a/tests/ui-fulldeps/rustc_public/check_coroutine_body.rs +++ b/tests/ui-fulldeps/rustc_public/check_coroutine_body.rs @@ -6,6 +6,7 @@ //@ ignore-remote //@ edition: 2024 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_middle; diff --git a/tests/ui-fulldeps/rustc_public/check_crate_defs.rs b/tests/ui-fulldeps/rustc_public/check_crate_defs.rs index 2b6a2ff8199ce..d2215abdc9748 100644 --- a/tests/ui-fulldeps/rustc_public/check_crate_defs.rs +++ b/tests/ui-fulldeps/rustc_public/check_crate_defs.rs @@ -5,6 +5,7 @@ //@ ignore-cross-compile //@ ignore-remote +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_hir; diff --git a/tests/ui-fulldeps/rustc_public/check_def_ty.rs b/tests/ui-fulldeps/rustc_public/check_def_ty.rs index 19ea731834b70..30104a71c7dfd 100644 --- a/tests/ui-fulldeps/rustc_public/check_def_ty.rs +++ b/tests/ui-fulldeps/rustc_public/check_def_ty.rs @@ -7,6 +7,7 @@ //@ ignore-remote //@ edition: 2021 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_middle; diff --git a/tests/ui-fulldeps/rustc_public/check_instance.rs b/tests/ui-fulldeps/rustc_public/check_instance.rs index defea9d2f54bb..e2d11f92d4d86 100644 --- a/tests/ui-fulldeps/rustc_public/check_instance.rs +++ b/tests/ui-fulldeps/rustc_public/check_instance.rs @@ -6,6 +6,7 @@ //@ ignore-remote //@ edition: 2021 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_middle; diff --git a/tests/ui-fulldeps/rustc_public/check_item_kind.rs b/tests/ui-fulldeps/rustc_public/check_item_kind.rs index b75ac70d86e3c..c3f06b159b9fe 100644 --- a/tests/ui-fulldeps/rustc_public/check_item_kind.rs +++ b/tests/ui-fulldeps/rustc_public/check_item_kind.rs @@ -6,6 +6,7 @@ //@ ignore-remote //@ edition: 2021 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_middle; diff --git a/tests/ui-fulldeps/rustc_public/check_trait_queries.rs b/tests/ui-fulldeps/rustc_public/check_trait_queries.rs index 44b7275a3df60..82552565cfe95 100644 --- a/tests/ui-fulldeps/rustc_public/check_trait_queries.rs +++ b/tests/ui-fulldeps/rustc_public/check_trait_queries.rs @@ -6,6 +6,7 @@ //@ ignore-remote //@ edition: 2021 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_middle; diff --git a/tests/ui-fulldeps/rustc_public/check_transform.rs b/tests/ui-fulldeps/rustc_public/check_transform.rs index f8aa40e474468..5444429f79d24 100644 --- a/tests/ui-fulldeps/rustc_public/check_transform.rs +++ b/tests/ui-fulldeps/rustc_public/check_transform.rs @@ -5,6 +5,7 @@ //@ ignore-cross-compile //@ ignore-remote +#![allow(unused_features)] #![feature(rustc_private)] #![feature(ascii_char, ascii_char_variants)] diff --git a/tests/ui-fulldeps/rustc_public/check_ty_fold.rs b/tests/ui-fulldeps/rustc_public/check_ty_fold.rs index 9ac7f14570e57..03d0992febeb1 100644 --- a/tests/ui-fulldeps/rustc_public/check_ty_fold.rs +++ b/tests/ui-fulldeps/rustc_public/check_ty_fold.rs @@ -7,6 +7,7 @@ //@ ignore-remote //@ edition: 2021 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_middle; diff --git a/tests/ui-fulldeps/rustc_public/check_variant.rs b/tests/ui-fulldeps/rustc_public/check_variant.rs index 54ae8b8f83b97..6845631f79bf7 100644 --- a/tests/ui-fulldeps/rustc_public/check_variant.rs +++ b/tests/ui-fulldeps/rustc_public/check_variant.rs @@ -7,6 +7,7 @@ //@ ignore-remote //@ edition: 2024 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_middle; diff --git a/tests/ui-fulldeps/rustc_public/closure-generic-body.rs b/tests/ui-fulldeps/rustc_public/closure-generic-body.rs index a328bc396c544..284b9202600f6 100644 --- a/tests/ui-fulldeps/rustc_public/closure-generic-body.rs +++ b/tests/ui-fulldeps/rustc_public/closure-generic-body.rs @@ -6,6 +6,7 @@ //@ ignore-remote //@ edition: 2021 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_middle; diff --git a/tests/ui-fulldeps/rustc_public/closure_body.rs b/tests/ui-fulldeps/rustc_public/closure_body.rs index 880d7dde34b68..04c2d5bf79f00 100644 --- a/tests/ui-fulldeps/rustc_public/closure_body.rs +++ b/tests/ui-fulldeps/rustc_public/closure_body.rs @@ -6,6 +6,7 @@ //@ ignore-remote //@ edition: 2021 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_middle; diff --git a/tests/ui-fulldeps/rustc_public/compilation-result.rs b/tests/ui-fulldeps/rustc_public/compilation-result.rs index 351ca2c8295f4..758731e063e3b 100644 --- a/tests/ui-fulldeps/rustc_public/compilation-result.rs +++ b/tests/ui-fulldeps/rustc_public/compilation-result.rs @@ -6,6 +6,7 @@ //@ ignore-remote //@ edition: 2021 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_middle; diff --git a/tests/ui-fulldeps/rustc_public/smir_internal.rs b/tests/ui-fulldeps/rustc_public/smir_internal.rs index 98335da19dbde..12bf49ed5c8a4 100644 --- a/tests/ui-fulldeps/rustc_public/smir_internal.rs +++ b/tests/ui-fulldeps/rustc_public/smir_internal.rs @@ -7,6 +7,7 @@ //@ ignore-remote //@ edition: 2021 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_driver; diff --git a/tests/ui-fulldeps/rustc_public/smir_serde.rs b/tests/ui-fulldeps/rustc_public/smir_serde.rs index 6a345023de171..3afaf40a6026b 100644 --- a/tests/ui-fulldeps/rustc_public/smir_serde.rs +++ b/tests/ui-fulldeps/rustc_public/smir_serde.rs @@ -6,6 +6,7 @@ //@ ignore-remote //@ edition: 2021 +#![allow(unused_features)] #![feature(rustc_private)] diff --git a/tests/ui-fulldeps/rustc_public/smir_visitor.rs b/tests/ui-fulldeps/rustc_public/smir_visitor.rs index 1ea2ab6f560ff..6ee76fb9c3101 100644 --- a/tests/ui-fulldeps/rustc_public/smir_visitor.rs +++ b/tests/ui-fulldeps/rustc_public/smir_visitor.rs @@ -6,6 +6,7 @@ //@ ignore-remote //@ edition: 2021 +#![allow(unused_features)] #![feature(rustc_private)] extern crate rustc_middle; diff --git a/tests/ui/allocator/xcrate-use2.rs b/tests/ui/allocator/xcrate-use2.rs index a48b0beeb07e3..d7758a2820ef2 100644 --- a/tests/ui/allocator/xcrate-use2.rs +++ b/tests/ui/allocator/xcrate-use2.rs @@ -5,6 +5,7 @@ //@ aux-build:helper.rs //@ no-prefer-dynamic +#![allow(unused_features)] #![feature(allocator_api)] extern crate custom; diff --git a/tests/ui/array-slice-vec/array_const_index-2.rs b/tests/ui/array-slice-vec/array_const_index-2.rs index 30338e0ab87cd..c7ad374103446 100644 --- a/tests/ui/array-slice-vec/array_const_index-2.rs +++ b/tests/ui/array-slice-vec/array_const_index-2.rs @@ -1,6 +1,7 @@ //@ run-pass #![allow(dead_code)] #![allow(stable_features)] +#![allow(unused_features)] #![feature(const_indexing)] diff --git a/tests/ui/array-slice-vec/slice-of-zero-size-elements.rs b/tests/ui/array-slice-vec/slice-of-zero-size-elements.rs index 7aa8a251fec5e..8fff4b6576641 100644 --- a/tests/ui/array-slice-vec/slice-of-zero-size-elements.rs +++ b/tests/ui/array-slice-vec/slice-of-zero-size-elements.rs @@ -1,5 +1,6 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] //@ compile-flags: -C debug-assertions diff --git a/tests/ui/associated-types/associated-types-impl-redirect.rs b/tests/ui/associated-types/associated-types-impl-redirect.rs index 64cae31e5693b..0cc2a9611b6cb 100644 --- a/tests/ui/associated-types/associated-types-impl-redirect.rs +++ b/tests/ui/associated-types/associated-types-impl-redirect.rs @@ -3,6 +3,7 @@ #![allow(dead_code)] #![allow(unused_mut)] #![allow(unused_imports)] +#![allow(unused_features)] // Test how resolving a projection interacts with inference. In this // case, we were eagerly unifying the type variable for the iterator // type with `I` from the where clause, ignoring the in-scope `impl` diff --git a/tests/ui/associated-types/associated-types-where-clause-impl-ambiguity.rs b/tests/ui/associated-types/associated-types-where-clause-impl-ambiguity.rs index 0de7617943c65..c01e85955bdd1 100644 --- a/tests/ui/associated-types/associated-types-where-clause-impl-ambiguity.rs +++ b/tests/ui/associated-types/associated-types-where-clause-impl-ambiguity.rs @@ -2,6 +2,7 @@ //@ run-pass #![allow(dead_code)] #![allow(unused_imports)] +#![allow(unused_features)] // Test how resolving a projection interacts with inference. In this // case, we were eagerly unifying the type variable for the iterator // type with `I` from the where clause, ignoring the in-scope `impl` diff --git a/tests/ui/async-await/async-drop/async-drop-initial.rs b/tests/ui/async-await/async-drop/async-drop-initial.rs index cd33c143fba01..0bab10e12fcef 100644 --- a/tests/ui/async-await/async-drop/async-drop-initial.rs +++ b/tests/ui/async-await/async-drop/async-drop-initial.rs @@ -7,6 +7,7 @@ #![feature(async_drop, impl_trait_in_assoc_type)] #![allow(incomplete_features, dead_code)] +#![allow(unused_features)] //@ edition: 2021 diff --git a/tests/ui/backtrace/line-tables-only.rs b/tests/ui/backtrace/line-tables-only.rs index 7dac41119a324..d9439f277f88a 100644 --- a/tests/ui/backtrace/line-tables-only.rs +++ b/tests/ui/backtrace/line-tables-only.rs @@ -19,6 +19,7 @@ //@ aux-build: line-tables-only-helper.rs #![feature(backtrace_frames)] +#![allow(unused_features)] extern crate line_tables_only_helper; diff --git a/tests/ui/borrowck/fsu-moves-and-copies.rs b/tests/ui/borrowck/fsu-moves-and-copies.rs index 397e4199bc054..073728a02b9e3 100644 --- a/tests/ui/borrowck/fsu-moves-and-copies.rs +++ b/tests/ui/borrowck/fsu-moves-and-copies.rs @@ -2,6 +2,7 @@ #![allow(non_camel_case_types)] #![allow(stable_features)] +#![allow(unused_features)] // Issue 4691: Ensure that functional-struct-updates operates // correctly and moves rather than copy when appropriate. diff --git a/tests/ui/borrowck/super-let-lifetime-and-drop.borrowck.stderr b/tests/ui/borrowck/super-let-lifetime-and-drop.borrowck.stderr index 7fe0b47ed5741..47142bac1abec 100644 --- a/tests/ui/borrowck/super-let-lifetime-and-drop.borrowck.stderr +++ b/tests/ui/borrowck/super-let-lifetime-and-drop.borrowck.stderr @@ -1,5 +1,5 @@ error[E0506]: cannot assign to `x` because it is borrowed - --> $DIR/super-let-lifetime-and-drop.rs:30:28 + --> $DIR/super-let-lifetime-and-drop.rs:31:28 | LL | super let b = DropMe(&mut x); | ------ `x` is borrowed here @@ -11,7 +11,7 @@ LL | } | - borrow might be used here, when `b` is dropped and runs the `Drop` code for type `DropMe` error[E0506]: cannot assign to `x` because it is borrowed - --> $DIR/super-let-lifetime-and-drop.rs:46:28 + --> $DIR/super-let-lifetime-and-drop.rs:47:28 | LL | super let b = &DropMe(&mut x); | -------------- @@ -26,7 +26,7 @@ LL | } | - ... and the borrow might be used here, when that temporary is dropped and runs the `Drop` code for type `DropMe` error[E0506]: cannot assign to `x` because it is borrowed - --> $DIR/super-let-lifetime-and-drop.rs:64:32 + --> $DIR/super-let-lifetime-and-drop.rs:65:32 | LL | super let b = identity(&DropMe(&mut x)); | -------------- @@ -40,7 +40,7 @@ LL | }; | - ... and the borrow might be used here, when that temporary is dropped and runs the `Drop` code for type `DropMe` error[E0506]: cannot assign to `x` because it is borrowed - --> $DIR/super-let-lifetime-and-drop.rs:87:36 + --> $DIR/super-let-lifetime-and-drop.rs:88:36 | LL | super let b = identity(&DropMe(&mut x)); | -------------- @@ -55,7 +55,7 @@ LL | )); | - ... and the borrow might be used here, when that temporary is dropped and runs the `Drop` code for type `DropMe` error[E0506]: cannot assign to `x` because it is borrowed - --> $DIR/super-let-lifetime-and-drop.rs:107:28 + --> $DIR/super-let-lifetime-and-drop.rs:108:28 | LL | super let b = DropMe(&mut x); | ------ `x` is borrowed here @@ -67,7 +67,7 @@ LL | } | - borrow might be used here, when `b` is dropped and runs the `Drop` code for type `DropMe` error[E0506]: cannot assign to `x` because it is borrowed - --> $DIR/super-let-lifetime-and-drop.rs:125:28 + --> $DIR/super-let-lifetime-and-drop.rs:126:28 | LL | super let b = DropMe(&mut x); | ------ `x` is borrowed here @@ -79,7 +79,7 @@ LL | } | - borrow might be used here, when `b` is dropped and runs the `Drop` code for type `DropMe` error[E0506]: cannot assign to `x` because it is borrowed - --> $DIR/super-let-lifetime-and-drop.rs:143:28 + --> $DIR/super-let-lifetime-and-drop.rs:144:28 | LL | super let b = DropMe(&mut x); | ------ `x` is borrowed here @@ -91,7 +91,7 @@ LL | } | - borrow might be used here, when `b` is dropped and runs the `Drop` code for type `DropMe` error[E0506]: cannot assign to `x` because it is borrowed - --> $DIR/super-let-lifetime-and-drop.rs:159:28 + --> $DIR/super-let-lifetime-and-drop.rs:160:28 | LL | b = DropMe(&mut x); | ------ `x` is borrowed here @@ -102,7 +102,7 @@ LL | drop(a); | - borrow later used here error[E0716]: temporary value dropped while borrowed - --> $DIR/super-let-lifetime-and-drop.rs:172:33 + --> $DIR/super-let-lifetime-and-drop.rs:173:33 | LL | #[cfg(borrowck)] { a = &String::from("asdf"); }; | ^^^^^^^^^^^^^^^^^^^^- temporary value is freed at the end of this statement @@ -115,7 +115,7 @@ LL | let _ = a; = note: consider using a `let` binding to create a longer lived value error[E0506]: cannot assign to `x` because it is borrowed - --> $DIR/super-let-lifetime-and-drop.rs:206:28 + --> $DIR/super-let-lifetime-and-drop.rs:207:28 | LL | super let d = &DropMe(&mut x); | -------------- @@ -130,7 +130,7 @@ LL | } | - ... and the borrow might be used here, when that temporary is dropped and runs the `Drop` code for type `DropMe` error[E0506]: cannot assign to `x` because it is borrowed - --> $DIR/super-let-lifetime-and-drop.rs:227:32 + --> $DIR/super-let-lifetime-and-drop.rs:228:32 | LL | super let d = identity(&DropMe(&mut x)); | -------------- @@ -145,7 +145,7 @@ LL | }; | - ... and the borrow might be used here, when that temporary is dropped and runs the `Drop` code for type `DropMe` error[E0506]: cannot assign to `x` because it is borrowed - --> $DIR/super-let-lifetime-and-drop.rs:246:28 + --> $DIR/super-let-lifetime-and-drop.rs:247:28 | LL | super let b = DropMe(&mut x); | ------ `x` is borrowed here @@ -157,7 +157,7 @@ LL | } | - borrow might be used here, when `b` is dropped and runs the `Drop` code for type `DropMe` error[E0506]: cannot assign to `x` because it is borrowed - --> $DIR/super-let-lifetime-and-drop.rs:263:28 + --> $DIR/super-let-lifetime-and-drop.rs:264:28 | LL | let dropme = Some(DropMe(&mut x)); | ------ `x` is borrowed here diff --git a/tests/ui/borrowck/super-let-lifetime-and-drop.rs b/tests/ui/borrowck/super-let-lifetime-and-drop.rs index 380470f792fe1..61ef59bb6b261 100644 --- a/tests/ui/borrowck/super-let-lifetime-and-drop.rs +++ b/tests/ui/borrowck/super-let-lifetime-and-drop.rs @@ -7,6 +7,7 @@ //@ [borrowck] check-fail #![allow(dropping_references)] +#![allow(unused_features)] #![feature(super_let, stmt_expr_attributes)] use std::convert::identity; diff --git a/tests/ui/cfg/cfg_stmt_expr.rs b/tests/ui/cfg/cfg_stmt_expr.rs index 361b159a354fd..dc4968e08f645 100644 --- a/tests/ui/cfg/cfg_stmt_expr.rs +++ b/tests/ui/cfg/cfg_stmt_expr.rs @@ -2,6 +2,7 @@ #![allow(dead_code)] #![allow(unused_mut)] #![allow(unused_variables)] +#![allow(unused_features)] #![deny(non_snake_case)] #![feature(stmt_expr_attributes)] diff --git a/tests/ui/cfg/crt-static-off-works.rs b/tests/ui/cfg/crt-static-off-works.rs index 1d77dba24b1cd..476913ef14f40 100644 --- a/tests/ui/cfg/crt-static-off-works.rs +++ b/tests/ui/cfg/crt-static-off-works.rs @@ -1,6 +1,7 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] //@ compile-flags:-C target-feature=-crt-static -Z unstable-options //@ ignore-musl - requires changing the linker which is hard diff --git a/tests/ui/const-generics/transmute.rs b/tests/ui/const-generics/transmute.rs index e8ab8637932dd..a112fc2c51019 100644 --- a/tests/ui/const-generics/transmute.rs +++ b/tests/ui/const-generics/transmute.rs @@ -2,6 +2,7 @@ #![feature(generic_const_exprs)] #![feature(transmute_generic_consts)] #![allow(incomplete_features)] +#![allow(unused_features)] fn ident(v: [[u32; H]; W]) -> [[u32; H]; W] { unsafe { diff --git a/tests/ui/consts/const-fn-type-name.rs b/tests/ui/consts/const-fn-type-name.rs index 733ab79b7cdb8..583c077f0cebd 100644 --- a/tests/ui/consts/const-fn-type-name.rs +++ b/tests/ui/consts/const-fn-type-name.rs @@ -3,6 +3,7 @@ #![feature(core_intrinsics)] #![feature(const_type_name)] #![allow(dead_code)] +#![allow(unused_features)] const fn type_name_wrapper(_: &T) -> &'static str { const { core::intrinsics::type_name::() } diff --git a/tests/ui/consts/const-fn.rs b/tests/ui/consts/const-fn.rs index aa9c478ea6330..78dcbd9f59ba6 100644 --- a/tests/ui/consts/const-fn.rs +++ b/tests/ui/consts/const-fn.rs @@ -1,5 +1,6 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] // A very basic test of const fn functionality. diff --git a/tests/ui/consts/const-ptr-nonnull-rpass.rs b/tests/ui/consts/const-ptr-nonnull-rpass.rs index 48ad72df63091..111bd620ae01a 100644 --- a/tests/ui/consts/const-ptr-nonnull-rpass.rs +++ b/tests/ui/consts/const-ptr-nonnull-rpass.rs @@ -1,4 +1,5 @@ //@ run-pass +#![allow(unused_features)] #![feature(ptr_internals, test)] diff --git a/tests/ui/consts/issue-29914.rs b/tests/ui/consts/issue-29914.rs index 7897733c72389..d8d05c96a0adb 100644 --- a/tests/ui/consts/issue-29914.rs +++ b/tests/ui/consts/issue-29914.rs @@ -1,5 +1,6 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] #![feature(const_indexing)] diff --git a/tests/ui/consts/try-operator.rs b/tests/ui/consts/try-operator.rs index cd0bf8ea57167..455b284182f2c 100644 --- a/tests/ui/consts/try-operator.rs +++ b/tests/ui/consts/try-operator.rs @@ -1,5 +1,6 @@ //@ ignore-backends: gcc //@ run-pass +#![allow(unused_features)] #![feature(try_trait_v2)] #![feature(const_trait_impl)] diff --git a/tests/ui/contracts/internal_machinery/lowering/basics.rs b/tests/ui/contracts/internal_machinery/lowering/basics.rs index 7b3a769af8258..00d83efb4ddca 100644 --- a/tests/ui/contracts/internal_machinery/lowering/basics.rs +++ b/tests/ui/contracts/internal_machinery/lowering/basics.rs @@ -1,4 +1,5 @@ //@ run-pass +#![allow(unused_features)] #![expect(incomplete_features)] #![feature(contracts, cfg_contract_checks, contracts_internals, core_intrinsics)] diff --git a/tests/ui/coroutine/control-flow.rs b/tests/ui/coroutine/control-flow.rs index f64b6f7388366..63b03cf5f0797 100644 --- a/tests/ui/coroutine/control-flow.rs +++ b/tests/ui/coroutine/control-flow.rs @@ -2,6 +2,7 @@ //@ revisions: default nomiropt //@[nomiropt]compile-flags: -Z mir-opt-level=0 +#![allow(unused_features)] #![feature(coroutines, coroutine_trait, stmt_expr_attributes)] diff --git a/tests/ui/coroutine/missing_coroutine_attr_suggestion.fixed b/tests/ui/coroutine/missing_coroutine_attr_suggestion.fixed index 128f09a118439..72a7b141342c2 100644 --- a/tests/ui/coroutine/missing_coroutine_attr_suggestion.fixed +++ b/tests/ui/coroutine/missing_coroutine_attr_suggestion.fixed @@ -1,5 +1,6 @@ //@ run-rustfix +#![allow(unused_features)] #![feature(coroutines, gen_blocks, stmt_expr_attributes)] fn main() { diff --git a/tests/ui/coroutine/missing_coroutine_attr_suggestion.rs b/tests/ui/coroutine/missing_coroutine_attr_suggestion.rs index dc95259149609..7836afbe36830 100644 --- a/tests/ui/coroutine/missing_coroutine_attr_suggestion.rs +++ b/tests/ui/coroutine/missing_coroutine_attr_suggestion.rs @@ -1,5 +1,6 @@ //@ run-rustfix +#![allow(unused_features)] #![feature(coroutines, gen_blocks, stmt_expr_attributes)] fn main() { diff --git a/tests/ui/coroutine/missing_coroutine_attr_suggestion.stderr b/tests/ui/coroutine/missing_coroutine_attr_suggestion.stderr index 8d92471a361cd..ea346d4b4e07e 100644 --- a/tests/ui/coroutine/missing_coroutine_attr_suggestion.stderr +++ b/tests/ui/coroutine/missing_coroutine_attr_suggestion.stderr @@ -1,5 +1,5 @@ error: `yield` can only be used in `#[coroutine]` closures, or `gen` blocks - --> $DIR/missing_coroutine_attr_suggestion.rs:6:16 + --> $DIR/missing_coroutine_attr_suggestion.rs:7:16 | LL | let _ = || yield; | ^^^^^ diff --git a/tests/ui/coroutine/non-static-is-unpin.rs b/tests/ui/coroutine/non-static-is-unpin.rs index b28bf1977145b..8a89e0242e8b8 100644 --- a/tests/ui/coroutine/non-static-is-unpin.rs +++ b/tests/ui/coroutine/non-static-is-unpin.rs @@ -3,6 +3,7 @@ //@[next] compile-flags: -Znext-solver //@ run-pass +#![allow(unused_features)] #![feature(coroutines, coroutine_trait, stmt_expr_attributes)] #![allow(dropping_copy_types)] diff --git a/tests/ui/coroutine/other-attribute-on-gen.rs b/tests/ui/coroutine/other-attribute-on-gen.rs index 5f4584ee0226e..cdbc50dc7a962 100644 --- a/tests/ui/coroutine/other-attribute-on-gen.rs +++ b/tests/ui/coroutine/other-attribute-on-gen.rs @@ -5,6 +5,7 @@ #![feature(stmt_expr_attributes)] #![feature(async_iterator)] #![allow(dead_code)] +#![allow(unused_features)] // make sure that other attributes e.g. `optimize` can be applied to gen blocks and functions diff --git a/tests/ui/coroutine/pin-box-coroutine.rs b/tests/ui/coroutine/pin-box-coroutine.rs index d030f3ef214d1..58a3dff8f0c1c 100644 --- a/tests/ui/coroutine/pin-box-coroutine.rs +++ b/tests/ui/coroutine/pin-box-coroutine.rs @@ -1,5 +1,6 @@ //@ run-pass +#![allow(unused_features)] #![feature(coroutines, coroutine_trait, stmt_expr_attributes)] use std::ops::Coroutine; diff --git a/tests/ui/coroutine/xcrate.rs b/tests/ui/coroutine/xcrate.rs index 406152a0bf10c..573ccc088f477 100644 --- a/tests/ui/coroutine/xcrate.rs +++ b/tests/ui/coroutine/xcrate.rs @@ -3,6 +3,7 @@ //@ aux-build:xcrate.rs #![feature(coroutines, coroutine_trait)] +#![allow(unused_features)] extern crate xcrate; diff --git a/tests/ui/drop/drop-order-comparisons.e2021.fixed b/tests/ui/drop/drop-order-comparisons.e2021.fixed index b0f6eb93f70f7..44163517c1129 100644 --- a/tests/ui/drop/drop-order-comparisons.e2021.fixed +++ b/tests/ui/drop/drop-order-comparisons.e2021.fixed @@ -26,6 +26,7 @@ //@ [e2021] rustfix-only-machine-applicable //@ [e2024] edition: 2024 //@ run-pass +#![allow(unused_features)] #![feature(if_let_guard)] #![cfg_attr(e2021, warn(rust_2024_compatibility))] diff --git a/tests/ui/drop/drop-order-comparisons.e2021.stderr b/tests/ui/drop/drop-order-comparisons.e2021.stderr index d928403d2e34b..273a0a5b76e60 100644 --- a/tests/ui/drop/drop-order-comparisons.e2021.stderr +++ b/tests/ui/drop/drop-order-comparisons.e2021.stderr @@ -1,5 +1,5 @@ warning: relative drop order changing in Rust 2024 - --> $DIR/drop-order-comparisons.rs:79:9 + --> $DIR/drop-order-comparisons.rs:80:9 | LL | _ = ({ | _________- @@ -29,35 +29,35 @@ LL | | }, e.mark(3), e.ok(4)); = warning: this changes meaning in Rust 2024 = note: for more information, see note: `#3` invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: `#1` invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: `_v` invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: `#2` invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: most of the time, changing drop order is harmless; inspect the `impl Drop`s for side effects like releasing locks or sending messages note: the lint level is defined here - --> $DIR/drop-order-comparisons.rs:31:25 + --> $DIR/drop-order-comparisons.rs:32:25 | LL | #![cfg_attr(e2021, warn(rust_2024_compatibility))] | ^^^^^^^^^^^^^^^^^^^^^^^ = note: `#[warn(tail_expr_drop_order)]` implied by `#[warn(rust_2024_compatibility)]` warning: relative drop order changing in Rust 2024 - --> $DIR/drop-order-comparisons.rs:103:45 + --> $DIR/drop-order-comparisons.rs:104:45 | LL | _ = ({ | _________- @@ -77,19 +77,19 @@ LL | | }, e.mark(1), e.ok(4)); = warning: this changes meaning in Rust 2024 = note: for more information, see note: `#2` invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: `#1` invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: most of the time, changing drop order is harmless; inspect the `impl Drop`s for side effects like releasing locks or sending messages warning: relative drop order changing in Rust 2024 - --> $DIR/drop-order-comparisons.rs:103:19 + --> $DIR/drop-order-comparisons.rs:104:19 | LL | _ = ({ | _________- @@ -109,19 +109,19 @@ LL | | }, e.mark(1), e.ok(4)); = warning: this changes meaning in Rust 2024 = note: for more information, see note: `#2` invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: `#1` invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: most of the time, changing drop order is harmless; inspect the `impl Drop`s for side effects like releasing locks or sending messages warning: relative drop order changing in Rust 2024 - --> $DIR/drop-order-comparisons.rs:224:24 + --> $DIR/drop-order-comparisons.rs:225:24 | LL | _ = ({ | _________- @@ -141,19 +141,19 @@ LL | | }, e.mark(2), e.ok(3)); = warning: this changes meaning in Rust 2024 = note: for more information, see note: `#2` invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: `#1` invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: most of the time, changing drop order is harmless; inspect the `impl Drop`s for side effects like releasing locks or sending messages warning: relative drop order changing in Rust 2024 - --> $DIR/drop-order-comparisons.rs:250:24 + --> $DIR/drop-order-comparisons.rs:251:24 | LL | _ = ({ | _________- @@ -173,19 +173,19 @@ LL | | }, e.mark(2), e.ok(3)); = warning: this changes meaning in Rust 2024 = note: for more information, see note: `#2` invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: `#1` invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: most of the time, changing drop order is harmless; inspect the `impl Drop`s for side effects like releasing locks or sending messages warning: `if let` assigns a shorter lifetime since Edition 2024 - --> $DIR/drop-order-comparisons.rs:126:13 + --> $DIR/drop-order-comparisons.rs:127:13 | LL | _ = (if let Ok(_) = e.ok(4).as_ref() { | ^^^^^^^^^^^^-------^^^^^^^^^ @@ -195,12 +195,12 @@ LL | _ = (if let Ok(_) = e.ok(4).as_ref() { = warning: this changes meaning in Rust 2024 = note: for more information, see note: value invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: the value is now dropped here in Edition 2024 - --> $DIR/drop-order-comparisons.rs:130:5 + --> $DIR/drop-order-comparisons.rs:131:5 | LL | }, e.mark(2), e.ok(3)); | ^ @@ -215,7 +215,7 @@ LL ~ } _ => {}}, e.mark(2), e.ok(3)); | warning: `if let` assigns a shorter lifetime since Edition 2024 - --> $DIR/drop-order-comparisons.rs:148:13 + --> $DIR/drop-order-comparisons.rs:149:13 | LL | _ = (if let Ok(_) = e.err(4).as_ref() {} else { | ^^^^^^^^^^^^--------^^^^^^^^^ @@ -225,12 +225,12 @@ LL | _ = (if let Ok(_) = e.err(4).as_ref() {} else { = warning: this changes meaning in Rust 2024 = note: for more information, see note: value invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: the value is now dropped here in Edition 2024 - --> $DIR/drop-order-comparisons.rs:148:44 + --> $DIR/drop-order-comparisons.rs:149:44 | LL | _ = (if let Ok(_) = e.err(4).as_ref() {} else { | ^ @@ -244,7 +244,7 @@ LL ~ }}, e.mark(2), e.ok(3)); | warning: `if let` assigns a shorter lifetime since Edition 2024 - --> $DIR/drop-order-comparisons.rs:250:12 + --> $DIR/drop-order-comparisons.rs:251:12 | LL | if let Ok(_) = e.err(4).as_ref() {} else { | ^^^^^^^^^^^^--------^^^^^^^^^ @@ -254,12 +254,12 @@ LL | if let Ok(_) = e.err(4).as_ref() {} else { = warning: this changes meaning in Rust 2024 = note: for more information, see note: value invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: the value is now dropped here in Edition 2024 - --> $DIR/drop-order-comparisons.rs:250:43 + --> $DIR/drop-order-comparisons.rs:251:43 | LL | if let Ok(_) = e.err(4).as_ref() {} else { | ^ @@ -273,7 +273,7 @@ LL ~ }} | warning: `if let` assigns a shorter lifetime since Edition 2024 - --> $DIR/drop-order-comparisons.rs:321:12 + --> $DIR/drop-order-comparisons.rs:322:12 | LL | if let true = e.err(9).is_ok() {} else { | ^^^^^^^^^^^--------^^^^^^^^ @@ -283,12 +283,12 @@ LL | if let true = e.err(9).is_ok() {} else { = warning: this changes meaning in Rust 2024 = note: for more information, see note: value invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: the value is now dropped here in Edition 2024 - --> $DIR/drop-order-comparisons.rs:321:41 + --> $DIR/drop-order-comparisons.rs:322:41 | LL | if let true = e.err(9).is_ok() {} else { | ^ @@ -302,7 +302,7 @@ LL ~ }}}}}}}}}; | warning: `if let` assigns a shorter lifetime since Edition 2024 - --> $DIR/drop-order-comparisons.rs:324:12 + --> $DIR/drop-order-comparisons.rs:325:12 | LL | if let Ok(_v) = e.err(8) {} else { | ^^^^^^^^^^^^^-------- @@ -312,12 +312,12 @@ LL | if let Ok(_v) = e.err(8) {} else { = warning: this changes meaning in Rust 2024 = note: for more information, see note: value invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: the value is now dropped here in Edition 2024 - --> $DIR/drop-order-comparisons.rs:324:35 + --> $DIR/drop-order-comparisons.rs:325:35 | LL | if let Ok(_v) = e.err(8) {} else { | ^ @@ -331,7 +331,7 @@ LL ~ }}}}}}}}}; | warning: `if let` assigns a shorter lifetime since Edition 2024 - --> $DIR/drop-order-comparisons.rs:327:12 + --> $DIR/drop-order-comparisons.rs:328:12 | LL | if let Ok(_) = e.err(7) {} else { | ^^^^^^^^^^^^-------- @@ -341,12 +341,12 @@ LL | if let Ok(_) = e.err(7) {} else { = warning: this changes meaning in Rust 2024 = note: for more information, see note: value invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: the value is now dropped here in Edition 2024 - --> $DIR/drop-order-comparisons.rs:327:34 + --> $DIR/drop-order-comparisons.rs:328:34 | LL | if let Ok(_) = e.err(7) {} else { | ^ @@ -360,7 +360,7 @@ LL ~ }}}}}}}}}; | warning: `if let` assigns a shorter lifetime since Edition 2024 - --> $DIR/drop-order-comparisons.rs:330:12 + --> $DIR/drop-order-comparisons.rs:331:12 | LL | if let Ok(_) = e.err(6).as_ref() {} else { | ^^^^^^^^^^^^--------^^^^^^^^^ @@ -370,12 +370,12 @@ LL | if let Ok(_) = e.err(6).as_ref() {} else { = warning: this changes meaning in Rust 2024 = note: for more information, see note: value invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: the value is now dropped here in Edition 2024 - --> $DIR/drop-order-comparisons.rs:330:43 + --> $DIR/drop-order-comparisons.rs:331:43 | LL | if let Ok(_) = e.err(6).as_ref() {} else { | ^ @@ -389,7 +389,7 @@ LL ~ }}}}}}}}}; | warning: `if let` assigns a shorter lifetime since Edition 2024 - --> $DIR/drop-order-comparisons.rs:334:12 + --> $DIR/drop-order-comparisons.rs:335:12 | LL | if let Ok(_v) = e.err(5) {} else { | ^^^^^^^^^^^^^-------- @@ -399,12 +399,12 @@ LL | if let Ok(_v) = e.err(5) {} else { = warning: this changes meaning in Rust 2024 = note: for more information, see note: value invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: the value is now dropped here in Edition 2024 - --> $DIR/drop-order-comparisons.rs:334:35 + --> $DIR/drop-order-comparisons.rs:335:35 | LL | if let Ok(_v) = e.err(5) {} else { | ^ @@ -418,7 +418,7 @@ LL ~ }}}}}}}}}; | warning: `if let` assigns a shorter lifetime since Edition 2024 - --> $DIR/drop-order-comparisons.rs:337:12 + --> $DIR/drop-order-comparisons.rs:338:12 | LL | if let Ok(_) = e.err(4) {} else { | ^^^^^^^^^^^^-------- @@ -428,12 +428,12 @@ LL | if let Ok(_) = e.err(4) {} else { = warning: this changes meaning in Rust 2024 = note: for more information, see note: value invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: the value is now dropped here in Edition 2024 - --> $DIR/drop-order-comparisons.rs:337:34 + --> $DIR/drop-order-comparisons.rs:338:34 | LL | if let Ok(_) = e.err(4) {} else { | ^ @@ -447,7 +447,7 @@ LL ~ }}}}}}}}}; | warning: `if let` assigns a shorter lifetime since Edition 2024 - --> $DIR/drop-order-comparisons.rs:373:12 + --> $DIR/drop-order-comparisons.rs:374:12 | LL | if let Ok(_) = e.err(4).as_ref() {} else { | ^^^^^^^^^^^^--------^^^^^^^^^ @@ -457,12 +457,12 @@ LL | if let Ok(_) = e.err(4).as_ref() {} else { = warning: this changes meaning in Rust 2024 = note: for more information, see note: value invokes this custom destructor - --> $DIR/drop-order-comparisons.rs:504:1 + --> $DIR/drop-order-comparisons.rs:505:1 | LL | impl<'b> Drop for LogDrop<'b> { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: the value is now dropped here in Edition 2024 - --> $DIR/drop-order-comparisons.rs:373:43 + --> $DIR/drop-order-comparisons.rs:374:43 | LL | if let Ok(_) = e.err(4).as_ref() {} else { | ^ diff --git a/tests/ui/drop/drop-order-comparisons.rs b/tests/ui/drop/drop-order-comparisons.rs index 257c0c14ecfa2..0eb68381c7f01 100644 --- a/tests/ui/drop/drop-order-comparisons.rs +++ b/tests/ui/drop/drop-order-comparisons.rs @@ -26,6 +26,7 @@ //@ [e2021] rustfix-only-machine-applicable //@ [e2024] edition: 2024 //@ run-pass +#![allow(unused_features)] #![feature(if_let_guard)] #![cfg_attr(e2021, warn(rust_2024_compatibility))] diff --git a/tests/ui/dropck/cleanup-arm-conditional.rs b/tests/ui/dropck/cleanup-arm-conditional.rs index 31331f24d6f6b..3dccebec19763 100644 --- a/tests/ui/dropck/cleanup-arm-conditional.rs +++ b/tests/ui/dropck/cleanup-arm-conditional.rs @@ -2,6 +2,7 @@ #![allow(stable_features)] #![allow(unused_imports)] +#![allow(unused_features)] // Test that cleanup scope for temporaries created in a match // arm is confined to the match arm itself. diff --git a/tests/ui/dynamically-sized-types/dst-coerce-rc.rs b/tests/ui/dynamically-sized-types/dst-coerce-rc.rs index 5ec7853a8e822..28b12f19fb5b3 100644 --- a/tests/ui/dynamically-sized-types/dst-coerce-rc.rs +++ b/tests/ui/dynamically-sized-types/dst-coerce-rc.rs @@ -1,6 +1,7 @@ //@ run-pass #![allow(unused_variables)] #![allow(stable_features)] +#![allow(unused_features)] // Test a very simple custom DST coercion. #![feature(core, rc_weak)] diff --git a/tests/ui/eii/default/call_default.rs b/tests/ui/eii/default/call_default.rs index b479baa804449..33fbf38b174eb 100644 --- a/tests/ui/eii/default/call_default.rs +++ b/tests/ui/eii/default/call_default.rs @@ -17,6 +17,7 @@ //@ ignore-macos // Tests EIIs with default implementations. // When there's no explicit declaration, the default should be called from the declaring crate. +#![allow(unused_features)] #![feature(extern_item_impls)] extern crate decl_with_default; diff --git a/tests/ui/eii/default/call_impl.rs b/tests/ui/eii/default/call_impl.rs index 94b2aa552a1e1..2787ffabef083 100644 --- a/tests/ui/eii/default/call_impl.rs +++ b/tests/ui/eii/default/call_impl.rs @@ -9,6 +9,7 @@ // Tests EIIs with default implementations. // When an explicit implementation is given in one dependency, and the declaration is in another, // the explicit implementation is preferred. +#![allow(unused_features)] #![feature(extern_item_impls)] extern crate decl_with_default; diff --git a/tests/ui/eii/linking/codegen_cross_crate.rs b/tests/ui/eii/linking/codegen_cross_crate.rs index 4016712e7504a..d444908487c23 100644 --- a/tests/ui/eii/linking/codegen_cross_crate.rs +++ b/tests/ui/eii/linking/codegen_cross_crate.rs @@ -6,6 +6,7 @@ // FIXME: linking on windows (speciifcally mingw) not yet supported, see tracking issue #125418 //@ ignore-windows // Tests whether calling EIIs works with the declaration in another crate. +#![allow(unused_features)] #![feature(extern_item_impls)] extern crate codegen_cross_crate_other_crate as codegen; diff --git a/tests/ui/eii/privacy1.rs b/tests/ui/eii/privacy1.rs index 72aec83d2cee0..e9f3ebb3ee283 100644 --- a/tests/ui/eii/privacy1.rs +++ b/tests/ui/eii/privacy1.rs @@ -5,6 +5,7 @@ // FIXME: linking on windows (specifically mingw) not yet supported, see tracking issue #125418 //@ ignore-windows // Tests whether re-exports work. +#![allow(unused_features)] #![feature(extern_item_impls)] extern crate other_crate_privacy1 as codegen; diff --git a/tests/ui/enum-discriminant/discriminant_value.rs b/tests/ui/enum-discriminant/discriminant_value.rs index 0d6b9166c26a3..50df86bbd2855 100644 --- a/tests/ui/enum-discriminant/discriminant_value.rs +++ b/tests/ui/enum-discriminant/discriminant_value.rs @@ -1,5 +1,6 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] #![feature(core, core_intrinsics)] extern crate core; diff --git a/tests/ui/extern/extern-prelude-core.rs b/tests/ui/extern/extern-prelude-core.rs index 5108c02517c3d..c5e557206de41 100644 --- a/tests/ui/extern/extern-prelude-core.rs +++ b/tests/ui/extern/extern-prelude-core.rs @@ -1,4 +1,5 @@ //@ run-pass +#![allow(unused_features)] #![feature(lang_items)] #![no_std] diff --git a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current.fixed b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current.fixed index 525f78d162fc0..e2304b875978e 100644 --- a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current.fixed +++ b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current.fixed @@ -20,6 +20,7 @@ //@ [future_feature] edition: future //@ [future_feature] compile-flags: -Z unstable-options +#![allow(unused_features)] #![cfg_attr(future_feature, feature(explicit_extern_abis))] #![cfg_attr(current_feature, feature(explicit_extern_abis))] diff --git a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current.stderr b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current.stderr index cf927807c7c3c..1a51bd0a07c70 100644 --- a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current.stderr +++ b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current.stderr @@ -1,5 +1,5 @@ warning: `extern` declarations without an explicit ABI are deprecated - --> $DIR/feature-gate-explicit-extern-abis.rs:27:1 + --> $DIR/feature-gate-explicit-extern-abis.rs:28:1 | LL | extern fn _foo() {} | ^^^^^^ help: explicitly specify the "C" ABI: `extern "C"` @@ -7,13 +7,13 @@ LL | extern fn _foo() {} = note: `#[warn(missing_abi)]` on by default warning: `extern` declarations without an explicit ABI are deprecated - --> $DIR/feature-gate-explicit-extern-abis.rs:33:8 + --> $DIR/feature-gate-explicit-extern-abis.rs:34:8 | LL | unsafe extern fn _bar() {} | ^^^^^^ help: explicitly specify the "C" ABI: `extern "C"` warning: `extern` declarations without an explicit ABI are deprecated - --> $DIR/feature-gate-explicit-extern-abis.rs:39:8 + --> $DIR/feature-gate-explicit-extern-abis.rs:40:8 | LL | unsafe extern {} | ^^^^^^ help: explicitly specify the "C" ABI: `extern "C"` diff --git a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current_feature.fixed b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current_feature.fixed index 525f78d162fc0..e2304b875978e 100644 --- a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current_feature.fixed +++ b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current_feature.fixed @@ -20,6 +20,7 @@ //@ [future_feature] edition: future //@ [future_feature] compile-flags: -Z unstable-options +#![allow(unused_features)] #![cfg_attr(future_feature, feature(explicit_extern_abis))] #![cfg_attr(current_feature, feature(explicit_extern_abis))] diff --git a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current_feature.stderr b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current_feature.stderr index cf927807c7c3c..1a51bd0a07c70 100644 --- a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current_feature.stderr +++ b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.current_feature.stderr @@ -1,5 +1,5 @@ warning: `extern` declarations without an explicit ABI are deprecated - --> $DIR/feature-gate-explicit-extern-abis.rs:27:1 + --> $DIR/feature-gate-explicit-extern-abis.rs:28:1 | LL | extern fn _foo() {} | ^^^^^^ help: explicitly specify the "C" ABI: `extern "C"` @@ -7,13 +7,13 @@ LL | extern fn _foo() {} = note: `#[warn(missing_abi)]` on by default warning: `extern` declarations without an explicit ABI are deprecated - --> $DIR/feature-gate-explicit-extern-abis.rs:33:8 + --> $DIR/feature-gate-explicit-extern-abis.rs:34:8 | LL | unsafe extern fn _bar() {} | ^^^^^^ help: explicitly specify the "C" ABI: `extern "C"` warning: `extern` declarations without an explicit ABI are deprecated - --> $DIR/feature-gate-explicit-extern-abis.rs:39:8 + --> $DIR/feature-gate-explicit-extern-abis.rs:40:8 | LL | unsafe extern {} | ^^^^^^ help: explicitly specify the "C" ABI: `extern "C"` diff --git a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.future.fixed b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.future.fixed index 525f78d162fc0..e2304b875978e 100644 --- a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.future.fixed +++ b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.future.fixed @@ -20,6 +20,7 @@ //@ [future_feature] edition: future //@ [future_feature] compile-flags: -Z unstable-options +#![allow(unused_features)] #![cfg_attr(future_feature, feature(explicit_extern_abis))] #![cfg_attr(current_feature, feature(explicit_extern_abis))] diff --git a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.future.stderr b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.future.stderr index cf927807c7c3c..1a51bd0a07c70 100644 --- a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.future.stderr +++ b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.future.stderr @@ -1,5 +1,5 @@ warning: `extern` declarations without an explicit ABI are deprecated - --> $DIR/feature-gate-explicit-extern-abis.rs:27:1 + --> $DIR/feature-gate-explicit-extern-abis.rs:28:1 | LL | extern fn _foo() {} | ^^^^^^ help: explicitly specify the "C" ABI: `extern "C"` @@ -7,13 +7,13 @@ LL | extern fn _foo() {} = note: `#[warn(missing_abi)]` on by default warning: `extern` declarations without an explicit ABI are deprecated - --> $DIR/feature-gate-explicit-extern-abis.rs:33:8 + --> $DIR/feature-gate-explicit-extern-abis.rs:34:8 | LL | unsafe extern fn _bar() {} | ^^^^^^ help: explicitly specify the "C" ABI: `extern "C"` warning: `extern` declarations without an explicit ABI are deprecated - --> $DIR/feature-gate-explicit-extern-abis.rs:39:8 + --> $DIR/feature-gate-explicit-extern-abis.rs:40:8 | LL | unsafe extern {} | ^^^^^^ help: explicitly specify the "C" ABI: `extern "C"` diff --git a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.future_feature.stderr b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.future_feature.stderr index 096a6f4341699..8804c4a459bff 100644 --- a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.future_feature.stderr +++ b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.future_feature.stderr @@ -1,5 +1,5 @@ error: `extern` declarations without an explicit ABI are disallowed - --> $DIR/feature-gate-explicit-extern-abis.rs:27:1 + --> $DIR/feature-gate-explicit-extern-abis.rs:28:1 | LL | extern fn _foo() {} | ^^^^^^ help: specify an ABI: `extern ""` @@ -7,7 +7,7 @@ LL | extern fn _foo() {} = help: prior to Rust 2024, a default ABI was inferred error: `extern` declarations without an explicit ABI are disallowed - --> $DIR/feature-gate-explicit-extern-abis.rs:33:8 + --> $DIR/feature-gate-explicit-extern-abis.rs:34:8 | LL | unsafe extern fn _bar() {} | ^^^^^^ help: specify an ABI: `extern ""` @@ -15,7 +15,7 @@ LL | unsafe extern fn _bar() {} = help: prior to Rust 2024, a default ABI was inferred error: `extern` declarations without an explicit ABI are disallowed - --> $DIR/feature-gate-explicit-extern-abis.rs:39:8 + --> $DIR/feature-gate-explicit-extern-abis.rs:40:8 | LL | unsafe extern {} | ^^^^^^ help: specify an ABI: `extern ""` diff --git a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.rs b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.rs index 379c45f589907..0eb5d1ce71aee 100644 --- a/tests/ui/feature-gates/feature-gate-explicit-extern-abis.rs +++ b/tests/ui/feature-gates/feature-gate-explicit-extern-abis.rs @@ -20,6 +20,7 @@ //@ [future_feature] edition: future //@ [future_feature] compile-flags: -Z unstable-options +#![allow(unused_features)] #![cfg_attr(future_feature, feature(explicit_extern_abis))] #![cfg_attr(current_feature, feature(explicit_extern_abis))] diff --git a/tests/ui/float/classify-runtime-const.rs b/tests/ui/float/classify-runtime-const.rs index ca852ea2468bc..5ddb4c060a47f 100644 --- a/tests/ui/float/classify-runtime-const.rs +++ b/tests/ui/float/classify-runtime-const.rs @@ -6,6 +6,7 @@ // This tests the float classification functions, for regular runtime code and for const evaluation. +#![allow(unused_features)] #![feature(f16)] #![feature(f128)] diff --git a/tests/ui/float/conv-bits-runtime-const.rs b/tests/ui/float/conv-bits-runtime-const.rs index 1373001b74dab..be03322a7c7ce 100644 --- a/tests/ui/float/conv-bits-runtime-const.rs +++ b/tests/ui/float/conv-bits-runtime-const.rs @@ -7,6 +7,7 @@ #![feature(f128)] #![feature(cfg_target_has_reliable_f16_f128)] #![allow(unused_macro_rules)] +#![allow(unused_features)] // expect the unexpected (`target_has_reliable_*` are not "known" configs since they are unstable) #![expect(unexpected_cfgs)] diff --git a/tests/ui/fmt/format-macro-no-std.rs b/tests/ui/fmt/format-macro-no-std.rs index d096b4de01390..f06f8c6558791 100644 --- a/tests/ui/fmt/format-macro-no-std.rs +++ b/tests/ui/fmt/format-macro-no-std.rs @@ -4,6 +4,7 @@ //@ ignore-emscripten no no_std executables //@ ignore-wasm different `main` convention +#![allow(unused_features)] #![feature(lang_items)] #![no_std] #![no_main] diff --git a/tests/ui/functions-closures/parallel-codegen-closures.rs b/tests/ui/functions-closures/parallel-codegen-closures.rs index 1842ac4db6060..084785497e76b 100644 --- a/tests/ui/functions-closures/parallel-codegen-closures.rs +++ b/tests/ui/functions-closures/parallel-codegen-closures.rs @@ -8,6 +8,7 @@ //@ compile-flags: -C codegen_units=2 +#![allow(unused_features)] #![feature(iter_arith)] mod a { diff --git a/tests/ui/half-open-range-patterns/half-open-range-pats-semantics.rs b/tests/ui/half-open-range-patterns/half-open-range-pats-semantics.rs index df1b9e164c768..d264d7c2f4370 100644 --- a/tests/ui/half-open-range-patterns/half-open-range-pats-semantics.rs +++ b/tests/ui/half-open-range-patterns/half-open-range-pats-semantics.rs @@ -5,6 +5,7 @@ // via `.contains(...)` and make sure the dynamic semantics match. #![allow(unreachable_patterns)] +#![allow(unused_features)] #![feature(cfg_target_has_reliable_f16_f128)] #![feature(f128)] #![feature(f16)] diff --git a/tests/ui/hygiene/xcrate.rs b/tests/ui/hygiene/xcrate.rs index 0dd9136e4d562..b10c61b78d36f 100644 --- a/tests/ui/hygiene/xcrate.rs +++ b/tests/ui/hygiene/xcrate.rs @@ -3,6 +3,7 @@ //@ aux-build:xcrate.rs +#![allow(unused_features)] #![feature(decl_macro)] extern crate xcrate; diff --git a/tests/ui/impl-trait/example-calendar.rs b/tests/ui/impl-trait/example-calendar.rs index c3c01f0103669..dd1ab7fcf4deb 100644 --- a/tests/ui/impl-trait/example-calendar.rs +++ b/tests/ui/impl-trait/example-calendar.rs @@ -1,5 +1,6 @@ //@ run-pass +#![allow(unused_features)] #![feature(fn_traits, step_trait, unboxed_closures, diff --git a/tests/ui/inference/iterator-sum-array-15673.rs b/tests/ui/inference/iterator-sum-array-15673.rs index c3d94415affda..2571bffaeacd6 100644 --- a/tests/ui/inference/iterator-sum-array-15673.rs +++ b/tests/ui/inference/iterator-sum-array-15673.rs @@ -2,6 +2,7 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] #![feature(iter_arith)] diff --git a/tests/ui/intrinsics/intrinsic-alignment.rs b/tests/ui/intrinsics/intrinsic-alignment.rs index 5fee6b0b39783..30dc144c704cf 100644 --- a/tests/ui/intrinsics/intrinsic-alignment.rs +++ b/tests/ui/intrinsics/intrinsic-alignment.rs @@ -1,5 +1,6 @@ //@ run-pass +#![allow(unused_features)] #![feature(core_intrinsics, rustc_attrs)] #[cfg(any( diff --git a/tests/ui/io-checks/write-macro-error.rs b/tests/ui/io-checks/write-macro-error.rs index 857ea0024e16c..47f3344fab46e 100644 --- a/tests/ui/io-checks/write-macro-error.rs +++ b/tests/ui/io-checks/write-macro-error.rs @@ -4,6 +4,7 @@ //@ run-pass //@ needs-unwind +#![allow(unused_features)] #![feature(io_error_uncategorized)] use std::fmt; diff --git a/tests/ui/issues/issue-21634.rs b/tests/ui/issues/issue-21634.rs index 270a893474adf..982d506a479df 100644 --- a/tests/ui/issues/issue-21634.rs +++ b/tests/ui/issues/issue-21634.rs @@ -1,5 +1,6 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] #![feature(cfg_target_feature)] diff --git a/tests/ui/issues/issue-29663.rs b/tests/ui/issues/issue-29663.rs index ed512f14f4ced..94219cd0f4195 100644 --- a/tests/ui/issues/issue-29663.rs +++ b/tests/ui/issues/issue-29663.rs @@ -1,5 +1,6 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] // write_volatile causes an LLVM assert with composite types #![feature(volatile)] diff --git a/tests/ui/iterators/iter-cloned-type-inference.rs b/tests/ui/iterators/iter-cloned-type-inference.rs index 10f9558811887..fdb5d4939064b 100644 --- a/tests/ui/iterators/iter-cloned-type-inference.rs +++ b/tests/ui/iterators/iter-cloned-type-inference.rs @@ -1,5 +1,6 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] // Test to see that the element type of .cloned() can be inferred // properly. Previously this would fail to deduce the type of `sum`. diff --git a/tests/ui/iterators/iterator-type-inference-sum-15673.rs b/tests/ui/iterators/iterator-type-inference-sum-15673.rs index aee027927f2f7..fbe77ad236b21 100644 --- a/tests/ui/iterators/iterator-type-inference-sum-15673.rs +++ b/tests/ui/iterators/iterator-type-inference-sum-15673.rs @@ -1,6 +1,7 @@ // https://github.com/rust-lang/rust/issues/15673 //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] #![feature(iter_arith)] diff --git a/tests/ui/linkage-attr/raw-dylib/elf/as_needed.rs b/tests/ui/linkage-attr/raw-dylib/elf/as_needed.rs index 48ca39300f41c..5149f677ff896 100644 --- a/tests/ui/linkage-attr/raw-dylib/elf/as_needed.rs +++ b/tests/ui/linkage-attr/raw-dylib/elf/as_needed.rs @@ -14,6 +14,7 @@ //@ [merge_4] run-pass #![allow(incomplete_features)] +#![allow(unused_features)] #![feature(raw_dylib_elf)] #![feature(native_link_modifiers_as_needed)] diff --git a/tests/ui/lint/lint-expr-stmt-attrs-for-early-lints.rs b/tests/ui/lint/lint-expr-stmt-attrs-for-early-lints.rs index eb110869e44e8..2ea3aaa65bd13 100644 --- a/tests/ui/lint/lint-expr-stmt-attrs-for-early-lints.rs +++ b/tests/ui/lint/lint-expr-stmt-attrs-for-early-lints.rs @@ -1,5 +1,6 @@ //@ run-pass +#![allow(unused_features)] #![feature(stmt_expr_attributes)] #![deny(unused_parens)] diff --git a/tests/ui/lint/lint-unknown-feature.rs b/tests/ui/lint/lint-unknown-feature.rs index 188617467974e..d8a0da950f6d7 100644 --- a/tests/ui/lint/lint-unknown-feature.rs +++ b/tests/ui/lint/lint-unknown-feature.rs @@ -3,6 +3,7 @@ #![warn(unused_features)] #![allow(stable_features)] +#![allow(unused_features)] // FIXME(#44232) we should warn that this isn't used. #![feature(rust1)] diff --git a/tests/ui/lint/unnecessary-qualification/lint-unnecessary-qualification-issue-121331.fixed b/tests/ui/lint/unnecessary-qualification/lint-unnecessary-qualification-issue-121331.fixed index d554bbfcc98c9..001c880d85860 100644 --- a/tests/ui/lint/unnecessary-qualification/lint-unnecessary-qualification-issue-121331.fixed +++ b/tests/ui/lint/unnecessary-qualification/lint-unnecessary-qualification-issue-121331.fixed @@ -2,6 +2,7 @@ //@ edition:2021 #![deny(unused_qualifications)] #![deny(unused_imports)] +#![allow(unused_features)] #![feature(coroutines, coroutine_trait)] use std::ops::{ diff --git a/tests/ui/lint/unnecessary-qualification/lint-unnecessary-qualification-issue-121331.rs b/tests/ui/lint/unnecessary-qualification/lint-unnecessary-qualification-issue-121331.rs index 4d79f5ab74530..4fc575cd1c1c5 100644 --- a/tests/ui/lint/unnecessary-qualification/lint-unnecessary-qualification-issue-121331.rs +++ b/tests/ui/lint/unnecessary-qualification/lint-unnecessary-qualification-issue-121331.rs @@ -2,6 +2,7 @@ //@ edition:2021 #![deny(unused_qualifications)] #![deny(unused_imports)] +#![allow(unused_features)] #![feature(coroutines, coroutine_trait)] use std::ops::{ diff --git a/tests/ui/lint/unnecessary-qualification/lint-unnecessary-qualification-issue-121331.stderr b/tests/ui/lint/unnecessary-qualification/lint-unnecessary-qualification-issue-121331.stderr index 52ed13ea150d7..b6f8513a9b33c 100644 --- a/tests/ui/lint/unnecessary-qualification/lint-unnecessary-qualification-issue-121331.stderr +++ b/tests/ui/lint/unnecessary-qualification/lint-unnecessary-qualification-issue-121331.stderr @@ -1,5 +1,5 @@ error: unused import: `*` - --> $DIR/lint-unnecessary-qualification-issue-121331.rs:9:28 + --> $DIR/lint-unnecessary-qualification-issue-121331.rs:10:28 | LL | CoroutineState::{self, *}, | ^ @@ -11,7 +11,7 @@ LL | #![deny(unused_imports)] | ^^^^^^^^^^^^^^ error: unnecessary qualification - --> $DIR/lint-unnecessary-qualification-issue-121331.rs:37:5 + --> $DIR/lint-unnecessary-qualification-issue-121331.rs:38:5 | LL | foo::bar(); | ^^^^^^^^ diff --git a/tests/ui/lint/unused/unused_attributes-must_use.fixed b/tests/ui/lint/unused/unused_attributes-must_use.fixed index fa596da95ccd1..8bfe3e044cb06 100644 --- a/tests/ui/lint/unused/unused_attributes-must_use.fixed +++ b/tests/ui/lint/unused/unused_attributes-must_use.fixed @@ -1,6 +1,7 @@ //@ run-rustfix #![allow(dead_code, path_statements)] +#![allow(unused_features)] #![deny(unused_attributes, unused_must_use)] #![feature(asm_experimental_arch, stmt_expr_attributes, trait_alias)] diff --git a/tests/ui/lint/unused/unused_attributes-must_use.rs b/tests/ui/lint/unused/unused_attributes-must_use.rs index 3e72dd1e43833..c4e39ebdb01ec 100644 --- a/tests/ui/lint/unused/unused_attributes-must_use.rs +++ b/tests/ui/lint/unused/unused_attributes-must_use.rs @@ -1,6 +1,7 @@ //@ run-rustfix #![allow(dead_code, path_statements)] +#![allow(unused_features)] #![deny(unused_attributes, unused_must_use)] #![feature(asm_experimental_arch, stmt_expr_attributes, trait_alias)] diff --git a/tests/ui/lint/unused/unused_attributes-must_use.stderr b/tests/ui/lint/unused/unused_attributes-must_use.stderr index 3fc340b5188f7..0ba8f42327832 100644 --- a/tests/ui/lint/unused/unused_attributes-must_use.stderr +++ b/tests/ui/lint/unused/unused_attributes-must_use.stderr @@ -1,5 +1,5 @@ error: `#[must_use]` attribute cannot be used on macro calls - --> $DIR/unused_attributes-must_use.rs:68:1 + --> $DIR/unused_attributes-must_use.rs:69:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -7,13 +7,13 @@ LL | #[must_use] = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! = help: `#[must_use]` can be applied to data types, functions, and traits note: the lint level is defined here - --> $DIR/unused_attributes-must_use.rs:4:9 + --> $DIR/unused_attributes-must_use.rs:5:9 | LL | #![deny(unused_attributes, unused_must_use)] | ^^^^^^^^^^^^^^^^^ error: `#[must_use]` attribute cannot be used on extern crates - --> $DIR/unused_attributes-must_use.rs:7:1 + --> $DIR/unused_attributes-must_use.rs:8:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -22,7 +22,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on modules - --> $DIR/unused_attributes-must_use.rs:11:1 + --> $DIR/unused_attributes-must_use.rs:12:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -31,7 +31,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on use statements - --> $DIR/unused_attributes-must_use.rs:15:1 + --> $DIR/unused_attributes-must_use.rs:16:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -40,7 +40,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on constants - --> $DIR/unused_attributes-must_use.rs:19:1 + --> $DIR/unused_attributes-must_use.rs:20:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -49,7 +49,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on statics - --> $DIR/unused_attributes-must_use.rs:22:1 + --> $DIR/unused_attributes-must_use.rs:23:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -58,7 +58,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on inherent impl blocks - --> $DIR/unused_attributes-must_use.rs:40:1 + --> $DIR/unused_attributes-must_use.rs:41:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -67,7 +67,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on foreign modules - --> $DIR/unused_attributes-must_use.rs:55:1 + --> $DIR/unused_attributes-must_use.rs:56:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -76,7 +76,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on foreign statics - --> $DIR/unused_attributes-must_use.rs:59:5 + --> $DIR/unused_attributes-must_use.rs:60:5 | LL | #[must_use] | ^^^^^^^^^^^ @@ -85,7 +85,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on type aliases - --> $DIR/unused_attributes-must_use.rs:73:1 + --> $DIR/unused_attributes-must_use.rs:74:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -94,7 +94,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on type parameters - --> $DIR/unused_attributes-must_use.rs:77:8 + --> $DIR/unused_attributes-must_use.rs:78:8 | LL | fn qux<#[must_use] T>(_: T) {} | ^^^^^^^^^^^ @@ -103,7 +103,7 @@ LL | fn qux<#[must_use] T>(_: T) {} = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on associated consts - --> $DIR/unused_attributes-must_use.rs:82:5 + --> $DIR/unused_attributes-must_use.rs:83:5 | LL | #[must_use] | ^^^^^^^^^^^ @@ -112,7 +112,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on associated types - --> $DIR/unused_attributes-must_use.rs:85:5 + --> $DIR/unused_attributes-must_use.rs:86:5 | LL | #[must_use] | ^^^^^^^^^^^ @@ -121,7 +121,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on trait impl blocks - --> $DIR/unused_attributes-must_use.rs:95:1 + --> $DIR/unused_attributes-must_use.rs:96:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -130,7 +130,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on trait methods in impl blocks - --> $DIR/unused_attributes-must_use.rs:100:5 + --> $DIR/unused_attributes-must_use.rs:101:5 | LL | #[must_use] | ^^^^^^^^^^^ @@ -139,7 +139,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, foreign functions, functions, inherent methods, provided trait methods, required trait methods, and traits error: `#[must_use]` attribute cannot be used on trait aliases - --> $DIR/unused_attributes-must_use.rs:107:1 + --> $DIR/unused_attributes-must_use.rs:108:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -148,7 +148,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on macro defs - --> $DIR/unused_attributes-must_use.rs:111:1 + --> $DIR/unused_attributes-must_use.rs:112:1 | LL | #[must_use] | ^^^^^^^^^^^ @@ -157,7 +157,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on statements - --> $DIR/unused_attributes-must_use.rs:120:5 + --> $DIR/unused_attributes-must_use.rs:121:5 | LL | #[must_use] | ^^^^^^^^^^^ @@ -166,7 +166,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on closures - --> $DIR/unused_attributes-must_use.rs:125:13 + --> $DIR/unused_attributes-must_use.rs:126:13 | LL | let x = #[must_use] | ^^^^^^^^^^^ @@ -175,7 +175,7 @@ LL | let x = #[must_use] = help: `#[must_use]` can be applied to data types, foreign functions, functions, methods, and traits error: `#[must_use]` attribute cannot be used on match arms - --> $DIR/unused_attributes-must_use.rs:148:9 + --> $DIR/unused_attributes-must_use.rs:149:9 | LL | #[must_use] | ^^^^^^^^^^^ @@ -184,7 +184,7 @@ LL | #[must_use] = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on struct fields - --> $DIR/unused_attributes-must_use.rs:157:28 + --> $DIR/unused_attributes-must_use.rs:158:28 | LL | let s = PatternField { #[must_use] foo: 123 }; | ^^^^^^^^^^^ @@ -193,7 +193,7 @@ LL | let s = PatternField { #[must_use] foo: 123 }; = help: `#[must_use]` can be applied to data types, functions, and traits error: `#[must_use]` attribute cannot be used on pattern fields - --> $DIR/unused_attributes-must_use.rs:159:24 + --> $DIR/unused_attributes-must_use.rs:160:24 | LL | let PatternField { #[must_use] foo } = s; | ^^^^^^^^^^^ @@ -202,13 +202,13 @@ LL | let PatternField { #[must_use] foo } = s; = help: `#[must_use]` can be applied to data types, functions, and traits error: unused `X` that must be used - --> $DIR/unused_attributes-must_use.rs:130:5 + --> $DIR/unused_attributes-must_use.rs:131:5 | LL | X; | ^ | note: the lint level is defined here - --> $DIR/unused_attributes-must_use.rs:4:28 + --> $DIR/unused_attributes-must_use.rs:5:28 | LL | #![deny(unused_attributes, unused_must_use)] | ^^^^^^^^^^^^^^^ @@ -218,7 +218,7 @@ LL | let _ = X; | +++++++ error: unused `Y` that must be used - --> $DIR/unused_attributes-must_use.rs:131:5 + --> $DIR/unused_attributes-must_use.rs:132:5 | LL | Y::Z; | ^^^^ @@ -229,7 +229,7 @@ LL | let _ = Y::Z; | +++++++ error: unused `U` that must be used - --> $DIR/unused_attributes-must_use.rs:132:5 + --> $DIR/unused_attributes-must_use.rs:133:5 | LL | U { unit: () }; | ^^^^^^^^^^^^^^ @@ -240,7 +240,7 @@ LL | let _ = U { unit: () }; | +++++++ error: unused return value of `U::method` that must be used - --> $DIR/unused_attributes-must_use.rs:133:5 + --> $DIR/unused_attributes-must_use.rs:134:5 | LL | U::method(); | ^^^^^^^^^^^ @@ -251,7 +251,7 @@ LL | let _ = U::method(); | +++++++ error: unused return value of `foo` that must be used - --> $DIR/unused_attributes-must_use.rs:134:5 + --> $DIR/unused_attributes-must_use.rs:135:5 | LL | foo(); | ^^^^^ @@ -262,7 +262,7 @@ LL | let _ = foo(); | +++++++ error: unused return value of `foreign_foo` that must be used - --> $DIR/unused_attributes-must_use.rs:137:9 + --> $DIR/unused_attributes-must_use.rs:138:9 | LL | foreign_foo(); | ^^^^^^^^^^^^^ @@ -273,7 +273,7 @@ LL | let _ = foreign_foo(); | +++++++ error: unused return value of `Use::get_four` that must be used - --> $DIR/unused_attributes-must_use.rs:145:5 + --> $DIR/unused_attributes-must_use.rs:146:5 | LL | ().get_four(); | ^^^^^^^^^^^^^ diff --git a/tests/ui/lowering/issue-96847.rs b/tests/ui/lowering/issue-96847.rs index a1fd105d9dd4a..35d11dc64b5b6 100644 --- a/tests/ui/lowering/issue-96847.rs +++ b/tests/ui/lowering/issue-96847.rs @@ -3,6 +3,7 @@ // Test that this doesn't abort during AST lowering. In #96847 it did abort // because the attribute was being lowered twice. +#![allow(unused_features)] #![feature(stmt_expr_attributes)] #![feature(lang_items)] diff --git a/tests/ui/lowering/issue-96847.stderr b/tests/ui/lowering/issue-96847.stderr index 2cded32f9fb86..2fa5ef05621e1 100644 --- a/tests/ui/lowering/issue-96847.stderr +++ b/tests/ui/lowering/issue-96847.stderr @@ -1,5 +1,5 @@ error[E0522]: definition of an unknown lang item: `foo` - --> $DIR/issue-96847.rs:11:9 + --> $DIR/issue-96847.rs:12:9 | LL | #![lang="foo"] | ^^^^^^^^^^^^^^ definition of unknown lang item `foo` diff --git a/tests/ui/macros/metavar_cross_edition_recursive_macros.rs b/tests/ui/macros/metavar_cross_edition_recursive_macros.rs index ae1bc00236f0f..26bb29465bf49 100644 --- a/tests/ui/macros/metavar_cross_edition_recursive_macros.rs +++ b/tests/ui/macros/metavar_cross_edition_recursive_macros.rs @@ -8,6 +8,7 @@ #![feature(macro_metavar_expr)] #![allow(incomplete_features)] +#![allow(unused_features)] extern crate metavar_2018; diff --git a/tests/ui/macros/parse-complex-macro-invoc-op.rs b/tests/ui/macros/parse-complex-macro-invoc-op.rs index 27ead36f69d8c..f11f4291b47cd 100644 --- a/tests/ui/macros/parse-complex-macro-invoc-op.rs +++ b/tests/ui/macros/parse-complex-macro-invoc-op.rs @@ -3,6 +3,7 @@ #![allow(dead_code)] #![allow(unused_assignments)] #![allow(unused_variables)] +#![allow(unused_features)] #![allow(stable_features)] #![allow(dropping_copy_types)] diff --git a/tests/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs b/tests/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs index de7dbb9052edb..2d1272741484e 100644 --- a/tests/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs +++ b/tests/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs @@ -5,6 +5,7 @@ //@ needs-unwind Asserting on contents of error message #![allow(path_statements, unused_allocation)] +#![allow(unused_features)] #![feature(core_intrinsics, generic_assert)] macro_rules! test { diff --git a/tests/ui/macros/rfc-2011-nicer-assert-messages/all-not-available-cases.rs b/tests/ui/macros/rfc-2011-nicer-assert-messages/all-not-available-cases.rs index 1600fd0af3f30..763ac9a461dd4 100644 --- a/tests/ui/macros/rfc-2011-nicer-assert-messages/all-not-available-cases.rs +++ b/tests/ui/macros/rfc-2011-nicer-assert-messages/all-not-available-cases.rs @@ -4,6 +4,7 @@ //@ run-pass //@ needs-unwind Asserting on contents of error message +#![allow(unused_features)] #![feature(core_intrinsics, generic_assert)] extern crate common; diff --git a/tests/ui/macros/rfc-2011-nicer-assert-messages/assert-with-custom-errors-does-not-create-unnecessary-code.rs b/tests/ui/macros/rfc-2011-nicer-assert-messages/assert-with-custom-errors-does-not-create-unnecessary-code.rs index 2a27164f9cba2..d6dc99fde9a5b 100644 --- a/tests/ui/macros/rfc-2011-nicer-assert-messages/assert-with-custom-errors-does-not-create-unnecessary-code.rs +++ b/tests/ui/macros/rfc-2011-nicer-assert-messages/assert-with-custom-errors-does-not-create-unnecessary-code.rs @@ -3,6 +3,7 @@ //@ compile-flags: --test -Zpanic_abort_tests //@ run-pass +#![allow(unused_features)] #![feature(core_intrinsics, generic_assert)] #[should_panic(expected = "Custom user message")] diff --git a/tests/ui/macros/rfc-2011-nicer-assert-messages/assert-without-captures-does-not-create-unnecessary-code.rs b/tests/ui/macros/rfc-2011-nicer-assert-messages/assert-without-captures-does-not-create-unnecessary-code.rs index 6e5f8d6cd12d4..f5d5f1e471c78 100644 --- a/tests/ui/macros/rfc-2011-nicer-assert-messages/assert-without-captures-does-not-create-unnecessary-code.rs +++ b/tests/ui/macros/rfc-2011-nicer-assert-messages/assert-without-captures-does-not-create-unnecessary-code.rs @@ -3,6 +3,7 @@ //@ run-pass //@ needs-unwind Asserting on contents of error message +#![allow(unused_features)] #![feature(core_intrinsics, generic_assert)] extern crate common; diff --git a/tests/ui/macros/rfc-2011-nicer-assert-messages/feature-gate-generic_assert.rs b/tests/ui/macros/rfc-2011-nicer-assert-messages/feature-gate-generic_assert.rs index 254d59076e531..a687c6ed2c7f8 100644 --- a/tests/ui/macros/rfc-2011-nicer-assert-messages/feature-gate-generic_assert.rs +++ b/tests/ui/macros/rfc-2011-nicer-assert-messages/feature-gate-generic_assert.rs @@ -4,6 +4,7 @@ // ignore-tidy-linelength //@ run-pass +#![allow(unused_features)] #![feature(core_intrinsics, generic_assert)] use std::fmt::{Debug, Formatter}; diff --git a/tests/ui/macros/stringify.rs b/tests/ui/macros/stringify.rs index 0367b8c2d023c..942f54f905845 100644 --- a/tests/ui/macros/stringify.rs +++ b/tests/ui/macros/stringify.rs @@ -3,6 +3,7 @@ //@ compile-flags: --test #![allow(incomplete_features)] +#![allow(unused_features)] #![feature(auto_traits)] #![feature(box_patterns)] #![feature(const_block_items)] diff --git a/tests/ui/match/match-float.rs b/tests/ui/match/match-float.rs index 279bb5927ac45..ef6e78c61667b 100644 --- a/tests/ui/match/match-float.rs +++ b/tests/ui/match/match-float.rs @@ -2,6 +2,7 @@ //@ compile-flags: --check-cfg=cfg(target_has_reliable_f16,target_has_reliable_f128) // Makes sure we use `==` (not bitwise) semantics for float comparison. +#![allow(unused_features)] #![feature(cfg_target_has_reliable_f16_f128)] #![feature(f128)] #![feature(f16)] diff --git a/tests/ui/methods/method-normalize-bounds-issue-20604.rs b/tests/ui/methods/method-normalize-bounds-issue-20604.rs index ea18fe14d157a..f710411a6451d 100644 --- a/tests/ui/methods/method-normalize-bounds-issue-20604.rs +++ b/tests/ui/methods/method-normalize-bounds-issue-20604.rs @@ -10,6 +10,7 @@ // type projection. +#![allow(unused_features)] #![feature(associated_types)] trait Hasher { diff --git a/tests/ui/methods/supertrait-shadowing/out-of-scope.rs b/tests/ui/methods/supertrait-shadowing/out-of-scope.rs index bd263be59cc7d..395376d496061 100644 --- a/tests/ui/methods/supertrait-shadowing/out-of-scope.rs +++ b/tests/ui/methods/supertrait-shadowing/out-of-scope.rs @@ -3,6 +3,7 @@ #![feature(supertrait_item_shadowing)] #![allow(dead_code)] +#![allow(unused_features)] mod out_of_scope { pub trait Subtrait: super::Supertrait { diff --git a/tests/ui/mir/mir_fat_ptr_drop.rs b/tests/ui/mir/mir_fat_ptr_drop.rs index ff6a0d70881f3..adfe81647dc64 100644 --- a/tests/ui/mir/mir_fat_ptr_drop.rs +++ b/tests/ui/mir/mir_fat_ptr_drop.rs @@ -1,6 +1,7 @@ //@ run-pass #![allow(unused_variables)] #![allow(stable_features)] +#![allow(unused_features)] // test that ordinary fat pointer operations work. diff --git a/tests/ui/nll/issue-48623-coroutine.rs b/tests/ui/nll/issue-48623-coroutine.rs index 63348a2047c07..f18d6469c66c2 100644 --- a/tests/ui/nll/issue-48623-coroutine.rs +++ b/tests/ui/nll/issue-48623-coroutine.rs @@ -1,6 +1,7 @@ //@ run-pass #![allow(path_statements)] #![allow(dead_code)] +#![allow(unused_features)] #![feature(coroutines, coroutine_trait)] diff --git a/tests/ui/nll/issue-48623-coroutine.stderr b/tests/ui/nll/issue-48623-coroutine.stderr index 2862d7b2a2f05..837730d7d5d12 100644 --- a/tests/ui/nll/issue-48623-coroutine.stderr +++ b/tests/ui/nll/issue-48623-coroutine.stderr @@ -1,5 +1,5 @@ warning: unused coroutine that must be used - --> $DIR/issue-48623-coroutine.rs:15:18 + --> $DIR/issue-48623-coroutine.rs:16:18 | LL | #[coroutine] move || { d; yield; &mut *r }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/ui/no_std/no-core-with-explicit-std-core.rs b/tests/ui/no_std/no-core-with-explicit-std-core.rs index 3940bcb3aa4fb..b3ae9c580f449 100644 --- a/tests/ui/no_std/no-core-with-explicit-std-core.rs +++ b/tests/ui/no_std/no-core-with-explicit-std-core.rs @@ -7,6 +7,7 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] #![feature(no_core, core)] #![no_core] diff --git a/tests/ui/overloaded/overloaded-calls-simple.rs b/tests/ui/overloaded/overloaded-calls-simple.rs index 34b674357d89c..955aba7fef653 100644 --- a/tests/ui/overloaded/overloaded-calls-simple.rs +++ b/tests/ui/overloaded/overloaded-calls-simple.rs @@ -1,5 +1,6 @@ //@ run-pass +#![allow(unused_features)] #![feature(lang_items, unboxed_closures, fn_traits)] struct S1 { diff --git a/tests/ui/panics/panic-handler-chain-update-hook.rs b/tests/ui/panics/panic-handler-chain-update-hook.rs index 2ae79ad236ef2..22349247b8592 100644 --- a/tests/ui/panics/panic-handler-chain-update-hook.rs +++ b/tests/ui/panics/panic-handler-chain-update-hook.rs @@ -1,6 +1,7 @@ //@ run-pass //@ needs-unwind #![allow(stable_features)] +#![allow(unused_features)] //@ needs-threads //@ ignore-backends: gcc diff --git a/tests/ui/panics/panic-handler-chain.rs b/tests/ui/panics/panic-handler-chain.rs index cc591c1d9992d..24b05771e9920 100644 --- a/tests/ui/panics/panic-handler-chain.rs +++ b/tests/ui/panics/panic-handler-chain.rs @@ -3,6 +3,7 @@ //@ needs-threads //@ ignore-backends: gcc #![allow(stable_features)] +#![allow(unused_features)] #![feature(std_panic)] diff --git a/tests/ui/panics/panic-handler-flail-wildly.rs b/tests/ui/panics/panic-handler-flail-wildly.rs index d5f5195d38121..e064e625dcbd1 100644 --- a/tests/ui/panics/panic-handler-flail-wildly.rs +++ b/tests/ui/panics/panic-handler-flail-wildly.rs @@ -3,6 +3,7 @@ #![allow(stable_features)] #![allow(unused_must_use)] +#![allow(unused_features)] //@ needs-threads //@ ignore-backends: gcc diff --git a/tests/ui/panics/panic-handler-set-twice.rs b/tests/ui/panics/panic-handler-set-twice.rs index ca4ed65f5683d..6d90037bf0122 100644 --- a/tests/ui/panics/panic-handler-set-twice.rs +++ b/tests/ui/panics/panic-handler-set-twice.rs @@ -2,6 +2,7 @@ //@ needs-unwind #![allow(unused_variables)] #![allow(stable_features)] +#![allow(unused_features)] #![feature(std_panic)] diff --git a/tests/ui/regions/regions-bound-lists-feature-gate-2.rs b/tests/ui/regions/regions-bound-lists-feature-gate-2.rs index f4f27a4456dfb..4408615b8e4a5 100644 --- a/tests/ui/regions/regions-bound-lists-feature-gate-2.rs +++ b/tests/ui/regions/regions-bound-lists-feature-gate-2.rs @@ -1,6 +1,7 @@ //@ run-pass #![allow(dead_code)] #![allow(stable_features)] +#![allow(unused_features)] #![feature(issue_5723_bootstrap)] diff --git a/tests/ui/regions/regions-bound-lists-feature-gate.rs b/tests/ui/regions/regions-bound-lists-feature-gate.rs index 1bc2b7dd03efc..5ae3fc34cb7c2 100644 --- a/tests/ui/regions/regions-bound-lists-feature-gate.rs +++ b/tests/ui/regions/regions-bound-lists-feature-gate.rs @@ -2,6 +2,7 @@ #![allow(dead_code)] #![allow(unused_variables)] #![allow(stable_features)] +#![allow(unused_features)] #![feature(issue_5723_bootstrap)] diff --git a/tests/ui/repr/align-with-extern-c-fn.rs b/tests/ui/repr/align-with-extern-c-fn.rs index 4d17d1e8816f2..43d3dbf67a227 100644 --- a/tests/ui/repr/align-with-extern-c-fn.rs +++ b/tests/ui/repr/align-with-extern-c-fn.rs @@ -2,6 +2,7 @@ #![allow(stable_features)] #![allow(unused_variables)] +#![allow(unused_features)] // #45662 diff --git a/tests/ui/sanitizer/memory-passing.rs b/tests/ui/sanitizer/memory-passing.rs index 6ac41b178fe7f..28aa0ce28f593 100644 --- a/tests/ui/sanitizer/memory-passing.rs +++ b/tests/ui/sanitizer/memory-passing.rs @@ -15,6 +15,7 @@ #![feature(core_intrinsics)] #![allow(invalid_value)] +#![allow(unused_features)] #![no_main] use std::hint::black_box; diff --git a/tests/ui/simd/monomorphize-shuffle-index.generic.stderr b/tests/ui/simd/monomorphize-shuffle-index.generic.stderr index c82adbf8d4c58..45c95c5c7c3bc 100644 --- a/tests/ui/simd/monomorphize-shuffle-index.generic.stderr +++ b/tests/ui/simd/monomorphize-shuffle-index.generic.stderr @@ -1,5 +1,5 @@ error: overly complex generic constant - --> $DIR/monomorphize-shuffle-index.rs:37:51 + --> $DIR/monomorphize-shuffle-index.rs:38:51 | LL | return simd_shuffle_const_generic::<_, _, { &Self::I.0 }>(a, b); | ^^----------^^ diff --git a/tests/ui/simd/monomorphize-shuffle-index.rs b/tests/ui/simd/monomorphize-shuffle-index.rs index ba952cdb0dc60..31700c54f2e32 100644 --- a/tests/ui/simd/monomorphize-shuffle-index.rs +++ b/tests/ui/simd/monomorphize-shuffle-index.rs @@ -11,6 +11,7 @@ generic_const_exprs )] #![allow(incomplete_features)] +#![allow(unused_features)] #[path = "../../auxiliary/minisimd.rs"] mod minisimd; diff --git a/tests/ui/simd/target-feature-mixup.rs b/tests/ui/simd/target-feature-mixup.rs index 014a9966f5cbd..84bcd5521a467 100644 --- a/tests/ui/simd/target-feature-mixup.rs +++ b/tests/ui/simd/target-feature-mixup.rs @@ -2,6 +2,7 @@ #![allow(unused_variables)] #![allow(stable_features)] #![allow(overflowing_literals)] +#![allow(unused_features)] //@ needs-subprocess //@ ignore-fuchsia must translate zircon signal to SIGILL, FIXME (#58590) diff --git a/tests/ui/structs-enums/rec-align-u32.rs b/tests/ui/structs-enums/rec-align-u32.rs index 058f06732b927..0045cfac07f3f 100644 --- a/tests/ui/structs-enums/rec-align-u32.rs +++ b/tests/ui/structs-enums/rec-align-u32.rs @@ -1,6 +1,7 @@ //@ run-pass #![allow(dead_code)] #![allow(unused_unsafe)] +#![allow(unused_features)] // Issue #2303 #![feature(core_intrinsics, rustc_attrs)] diff --git a/tests/ui/structs-enums/rec-align-u64.rs b/tests/ui/structs-enums/rec-align-u64.rs index 41b196dc5c222..9e3ab05fa87e1 100644 --- a/tests/ui/structs-enums/rec-align-u64.rs +++ b/tests/ui/structs-enums/rec-align-u64.rs @@ -1,6 +1,7 @@ //@ run-pass #![allow(dead_code)] #![allow(unused_unsafe)] +#![allow(unused_features)] // Issue #2303 diff --git a/tests/ui/target-feature/target-feature-detection.rs b/tests/ui/target-feature/target-feature-detection.rs index 41fc246913125..6fae84724b8c7 100644 --- a/tests/ui/target-feature/target-feature-detection.rs +++ b/tests/ui/target-feature/target-feature-detection.rs @@ -5,6 +5,7 @@ //@ ignore-i586 (no SSE2) #![allow(stable_features)] +#![allow(unused_features)] #![feature(cfg_target_feature)] fn main() { diff --git a/tests/ui/threads-sendsync/tls-init-on-init.rs b/tests/ui/threads-sendsync/tls-init-on-init.rs index 1cae19aae86c7..80071d8094431 100644 --- a/tests/ui/threads-sendsync/tls-init-on-init.rs +++ b/tests/ui/threads-sendsync/tls-init-on-init.rs @@ -1,5 +1,6 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] //@ needs-threads #![feature(thread_local_try_with)] diff --git a/tests/ui/threads-sendsync/tls-try-with.rs b/tests/ui/threads-sendsync/tls-try-with.rs index 04071e77daa48..6e7077d350bf5 100644 --- a/tests/ui/threads-sendsync/tls-try-with.rs +++ b/tests/ui/threads-sendsync/tls-try-with.rs @@ -1,5 +1,6 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] //@ needs-threads #![feature(thread_local_try_with)] diff --git a/tests/ui/traits/alias/import-cross-crate.rs b/tests/ui/traits/alias/import-cross-crate.rs index 65e7c90965b85..b8d7e471dce9e 100644 --- a/tests/ui/traits/alias/import-cross-crate.rs +++ b/tests/ui/traits/alias/import-cross-crate.rs @@ -1,6 +1,7 @@ //@ run-pass //@ aux-build:greeter.rs +#![allow(unused_features)] #![feature(trait_alias)] extern crate greeter; diff --git a/tests/ui/traits/overlap-permitted-for-marker-traits.rs b/tests/ui/traits/overlap-permitted-for-marker-traits.rs index c05e5fddae635..ad249059e877b 100644 --- a/tests/ui/traits/overlap-permitted-for-marker-traits.rs +++ b/tests/ui/traits/overlap-permitted-for-marker-traits.rs @@ -3,6 +3,7 @@ // that is, traits without items. In this case, a type `T` is // `MyMarker` if it is either `Debug` or `Display`. +#![allow(unused_features)] #![feature(marker_trait_attr)] #![feature(negative_impls)] diff --git a/tests/ui/type/typeid-consistency.rs b/tests/ui/type/typeid-consistency.rs index 67ee1b6d839ab..50efea0a01786 100644 --- a/tests/ui/type/typeid-consistency.rs +++ b/tests/ui/type/typeid-consistency.rs @@ -3,6 +3,7 @@ //@ run-pass #![allow(deprecated)] +#![allow(unused_features)] #![feature(core_intrinsics)] //@ aux-build:typeid-consistency-aux1.rs diff --git a/tests/ui/typeck/type-name-intrinsic-usage-61894.rs b/tests/ui/typeck/type-name-intrinsic-usage-61894.rs index 8131bb273909d..b1a7206f20669 100644 --- a/tests/ui/typeck/type-name-intrinsic-usage-61894.rs +++ b/tests/ui/typeck/type-name-intrinsic-usage-61894.rs @@ -1,6 +1,7 @@ // https://github.com/rust-lang/rust/issues/61894 //@ run-pass +#![allow(unused_features)] #![feature(core_intrinsics)] use std::any::type_name; diff --git a/tests/ui/use/use.rs b/tests/ui/use/use.rs index 25b8e529c432a..52f304dab8cb2 100644 --- a/tests/ui/use/use.rs +++ b/tests/ui/use/use.rs @@ -1,6 +1,7 @@ //@ run-pass #![allow(stable_features)] +#![allow(unused_features)] #![allow(unused_imports)] #![feature(no_core, core)] From b4288147d6f653c7c6ecb5358108a95fc4bf89d8 Mon Sep 17 00:00:00 2001 From: mu001999 Date: Thu, 12 Feb 2026 11:35:58 +0800 Subject: [PATCH 6/8] Allow unused features in tools --- src/tools/miri/src/lib.rs | 1 + src/tools/rust-analyzer/crates/proc-macro-api/src/lib.rs | 2 +- src/tools/rust-analyzer/crates/proc-macro-srv/src/lib.rs | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/tools/miri/src/lib.rs b/src/tools/miri/src/lib.rs index 5722969a31bf9..267e1f84afca5 100644 --- a/src/tools/miri/src/lib.rs +++ b/src/tools/miri/src/lib.rs @@ -41,6 +41,7 @@ clippy::len_zero, // We are not implementing queries here so it's fine rustc::potential_query_instability, + unused_features, )] #![warn( rust_2018_idioms, diff --git a/src/tools/rust-analyzer/crates/proc-macro-api/src/lib.rs b/src/tools/rust-analyzer/crates/proc-macro-api/src/lib.rs index e4b121b033d34..51f9647d0bf52 100644 --- a/src/tools/rust-analyzer/crates/proc-macro-api/src/lib.rs +++ b/src/tools/rust-analyzer/crates/proc-macro-api/src/lib.rs @@ -10,7 +10,7 @@ feature = "sysroot-abi", feature(proc_macro_internals, proc_macro_diagnostic, proc_macro_span) )] -#![allow(internal_features)] +#![allow(internal_features, unused_features)] #![cfg_attr(feature = "in-rust-tree", feature(rustc_private))] #[cfg(feature = "in-rust-tree")] diff --git a/src/tools/rust-analyzer/crates/proc-macro-srv/src/lib.rs b/src/tools/rust-analyzer/crates/proc-macro-srv/src/lib.rs index c548dc620ad13..1c3b63a113042 100644 --- a/src/tools/rust-analyzer/crates/proc-macro-srv/src/lib.rs +++ b/src/tools/rust-analyzer/crates/proc-macro-srv/src/lib.rs @@ -18,7 +18,8 @@ internal_features, clippy::disallowed_types, clippy::print_stderr, - unused_crate_dependencies + unused_crate_dependencies, + unused_features )] #![deny(deprecated_safe, clippy::undocumented_unsafe_blocks)] From 74da246e4ca06285ac900688f0e8bf4b6071b6c4 Mon Sep 17 00:00:00 2001 From: mu001999 Date: Fri, 13 Feb 2026 03:02:50 +0800 Subject: [PATCH 7/8] Bless incremental tests --- .../struct_point.rs | 10 ++--- .../change_add_field/struct_point.rs | 2 +- .../change_implementation_cross_crate/main.rs | 2 +- .../change_private_fn/struct_point.rs | 12 +++--- .../change_private_fn_cc/struct_point.rs | 10 ++--- .../struct_point.rs | 10 ++--- .../struct_point.rs | 10 ++--- .../struct_point.rs | 10 ++--- .../struct_point.rs | 8 ++-- .../change_symbol_export_status.rs | 8 ++-- tests/incremental/const-generic-type-cycle.rs | 1 - .../hygiene/load_cached_hygiene.rs | 2 +- tests/incremental/issue-35593.rs | 2 +- tests/incremental/issue-38222.rs | 4 +- tests/incremental/krate-inherent.rs | 2 +- tests/incremental/krate-inlined.rs | 2 +- tests/incremental/lto-in-linker.rs | 2 +- tests/incremental/remapped_paths_cc/main.rs | 6 +-- .../remove-private-item-cross-crate/main.rs | 2 +- tests/incremental/rlib-lto.rs | 2 +- tests/incremental/spans_in_type_debuginfo.rs | 4 +- tests/incremental/spike.rs | 4 +- .../thinlto/cgu_keeps_identical_fn.rs | 40 +++++++++---------- 23 files changed, 77 insertions(+), 78 deletions(-) diff --git a/tests/incremental/add_private_fn_at_krate_root_cc/struct_point.rs b/tests/incremental/add_private_fn_at_krate_root_cc/struct_point.rs index ef02b2165576e..57996cfc8d968 100644 --- a/tests/incremental/add_private_fn_at_krate_root_cc/struct_point.rs +++ b/tests/incremental/add_private_fn_at_krate_root_cc/struct_point.rs @@ -14,11 +14,11 @@ #![allow(unused_features)] #![crate_type = "rlib"] -#![rustc_partition_reused(module="struct_point-fn_calls_methods_in_same_impl", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_calls_free_fn", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_methods_in_same_impl", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_free_fn", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] extern crate point; diff --git a/tests/incremental/change_add_field/struct_point.rs b/tests/incremental/change_add_field/struct_point.rs index 6c39b502df0f4..d6f38c2caf9b9 100644 --- a/tests/incremental/change_add_field/struct_point.rs +++ b/tests/incremental/change_add_field/struct_point.rs @@ -23,7 +23,7 @@ #![rustc_partition_codegened(module="struct_point-fn_read_field", cfg="cfail2")] #![rustc_partition_codegened(module="struct_point-fn_write_field", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-call_fn_with_type_in_body", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-call_fn_with_type_in_body", cfg="cfail2")] pub mod point { #[cfg(cfail1)] diff --git a/tests/incremental/change_implementation_cross_crate/main.rs b/tests/incremental/change_implementation_cross_crate/main.rs index 5c3b0815115c9..002180b484b58 100644 --- a/tests/incremental/change_implementation_cross_crate/main.rs +++ b/tests/incremental/change_implementation_cross_crate/main.rs @@ -8,7 +8,7 @@ #![feature(rustc_attrs)] #![crate_type = "bin"] -#![rustc_partition_reused(module = "main", cfg = "rpass2")] +// #![rustc_partition_reused(module = "main", cfg = "rpass2")] extern crate a; diff --git a/tests/incremental/change_private_fn/struct_point.rs b/tests/incremental/change_private_fn/struct_point.rs index 2fcc144a9cfa6..6d8a151916d58 100644 --- a/tests/incremental/change_private_fn/struct_point.rs +++ b/tests/incremental/change_private_fn/struct_point.rs @@ -14,11 +14,11 @@ #![rustc_partition_codegened(module="struct_point-point", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_calls_methods_in_same_impl", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_calls_methods_in_another_impl", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_methods_in_same_impl", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_methods_in_another_impl", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] pub mod point { pub struct Point { @@ -57,7 +57,7 @@ pub mod fn_calls_methods_in_same_impl { // (not just marked green) - for example, `DeadVisitor` // always runs during compilation as a "pass", and loads // the typeck results for bodies. - #[rustc_clean(cfg="cfail2", loaded_from_disk="typeck")] + // #[rustc_clean(cfg="cfail2", loaded_from_disk="typeck")] pub fn check() { let x = Point { x: 2.0, y: 2.0 }; x.distance_from_origin(); diff --git a/tests/incremental/change_private_fn_cc/struct_point.rs b/tests/incremental/change_private_fn_cc/struct_point.rs index 3e4c7515ceedd..ee970ee3292a6 100644 --- a/tests/incremental/change_private_fn_cc/struct_point.rs +++ b/tests/incremental/change_private_fn_cc/struct_point.rs @@ -13,11 +13,11 @@ #![allow(dead_code)] #![allow(unused_features)] -#![rustc_partition_reused(module="struct_point-fn_calls_methods_in_same_impl", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_calls_methods_in_another_impl", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_methods_in_same_impl", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_methods_in_another_impl", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] extern crate point; diff --git a/tests/incremental/change_private_impl_method/struct_point.rs b/tests/incremental/change_private_impl_method/struct_point.rs index a85672b5e1029..8fcd3f44ed3c4 100644 --- a/tests/incremental/change_private_impl_method/struct_point.rs +++ b/tests/incremental/change_private_impl_method/struct_point.rs @@ -14,11 +14,11 @@ #![rustc_partition_codegened(module="struct_point-point", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_calls_methods_in_same_impl", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_calls_methods_in_another_impl", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_methods_in_same_impl", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_methods_in_another_impl", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] pub mod point { pub struct Point { diff --git a/tests/incremental/change_private_impl_method_cc/struct_point.rs b/tests/incremental/change_private_impl_method_cc/struct_point.rs index 00a641c17e00f..94dd88208a19c 100644 --- a/tests/incremental/change_private_impl_method_cc/struct_point.rs +++ b/tests/incremental/change_private_impl_method_cc/struct_point.rs @@ -13,12 +13,12 @@ #![allow(dead_code)] #![allow(unused_features)] -#![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_calls_methods_in_same_impl", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_calls_methods_in_another_impl", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_methods_in_same_impl", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_methods_in_another_impl", cfg="cfail2")] extern crate point; diff --git a/tests/incremental/change_pub_inherent_method_body/struct_point.rs b/tests/incremental/change_pub_inherent_method_body/struct_point.rs index 8a1358b2ebc86..1e6003a0cf046 100644 --- a/tests/incremental/change_pub_inherent_method_body/struct_point.rs +++ b/tests/incremental/change_pub_inherent_method_body/struct_point.rs @@ -13,11 +13,11 @@ #![rustc_partition_codegened(module="struct_point-point", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_calls_changed_method", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_calls_another_method", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_changed_method", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_another_method", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] pub mod point { pub struct Point { diff --git a/tests/incremental/change_pub_inherent_method_sig/struct_point.rs b/tests/incremental/change_pub_inherent_method_sig/struct_point.rs index 981ce9872b7ae..6d74ea15b63f2 100644 --- a/tests/incremental/change_pub_inherent_method_sig/struct_point.rs +++ b/tests/incremental/change_pub_inherent_method_sig/struct_point.rs @@ -15,10 +15,10 @@ #![rustc_partition_codegened(module="struct_point-point", cfg="cfail2")] #![rustc_partition_codegened(module="struct_point-fn_calls_changed_method", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_calls_another_method", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] -#![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_calls_another_method", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_make_struct", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_read_field", cfg="cfail2")] +// #![rustc_partition_reused(module="struct_point-fn_write_field", cfg="cfail2")] pub mod point { pub struct Point { diff --git a/tests/incremental/change_symbol_export_status.rs b/tests/incremental/change_symbol_export_status.rs index 37f8b9b52e5f9..f60a6dfccd83e 100644 --- a/tests/incremental/change_symbol_export_status.rs +++ b/tests/incremental/change_symbol_export_status.rs @@ -5,10 +5,10 @@ //@ ignore-backends: gcc #![feature(rustc_attrs)] -#![rustc_partition_reused(module = "change_symbol_export_status-mod1", cfg = "rpass2")] -#![rustc_partition_reused(module = "change_symbol_export_status-mod2", cfg = "rpass2")] -#![rustc_partition_reused(module = "change_symbol_export_status-mod1", cfg = "rpass4")] -#![rustc_partition_reused(module = "change_symbol_export_status-mod2", cfg = "rpass4")] +// #![rustc_partition_reused(module = "change_symbol_export_status-mod1", cfg = "rpass2")] +// #![rustc_partition_reused(module = "change_symbol_export_status-mod2", cfg = "rpass2")] +// #![rustc_partition_reused(module = "change_symbol_export_status-mod1", cfg = "rpass4")] +// #![rustc_partition_reused(module = "change_symbol_export_status-mod2", cfg = "rpass4")] // This test case makes sure that a change in symbol visibility is detected by // our dependency tracking. We do this by changing a module's visibility to diff --git a/tests/incremental/const-generic-type-cycle.rs b/tests/incremental/const-generic-type-cycle.rs index 5bcbc1d5dafef..902dcd59f4819 100644 --- a/tests/incremental/const-generic-type-cycle.rs +++ b/tests/incremental/const-generic-type-cycle.rs @@ -13,7 +13,6 @@ trait Bar {} #[cfg(cfail)] trait Bar {} //[cfail]~^ ERROR cycle detected when computing type of `Bar::N` -//[cfail]~| ERROR cycle detected when computing type of `Bar::N` //[cfail]~| ERROR `(dyn Bar<{ 2 + 1 }> + 'static)` is forbidden as the type of a const generic parameter trait BB = Bar<{ 2 + 1 }>; diff --git a/tests/incremental/hygiene/load_cached_hygiene.rs b/tests/incremental/hygiene/load_cached_hygiene.rs index 84f91e7ecdec5..ce3047ebba3ae 100644 --- a/tests/incremental/hygiene/load_cached_hygiene.rs +++ b/tests/incremental/hygiene/load_cached_hygiene.rs @@ -24,7 +24,7 @@ #![feature(rustc_attrs)] -#![rustc_partition_reused(module="load_cached_hygiene-call_unchanged_function", cfg="rpass2")] +// #![rustc_partition_reused(module="load_cached_hygiene-call_unchanged_function", cfg="rpass2")] #![rustc_partition_codegened(module="load_cached_hygiene-call_changed_function", cfg="rpass2")] diff --git a/tests/incremental/issue-35593.rs b/tests/incremental/issue-35593.rs index 522c88b9894ad..53d8a6bbc5354 100644 --- a/tests/incremental/issue-35593.rs +++ b/tests/incremental/issue-35593.rs @@ -6,7 +6,7 @@ //@ ignore-backends: gcc #![feature(rustc_attrs)] -#![rustc_partition_reused(module="issue_35593", cfg="rpass2")] +// #![rustc_partition_reused(module="issue_35593", cfg="rpass2")] fn main() { println!("hello world"); diff --git a/tests/incremental/issue-38222.rs b/tests/incremental/issue-38222.rs index 0aecd1e1f98a9..48e9e3a58e868 100644 --- a/tests/incremental/issue-38222.rs +++ b/tests/incremental/issue-38222.rs @@ -5,10 +5,10 @@ //@ compile-flags: -Z query-dep-graph #![feature(rustc_attrs)] -#![rustc_partition_reused(module = "issue_38222-mod1", cfg = "rpass2")] +// #![rustc_partition_reused(module = "issue_38222-mod1", cfg = "rpass2")] // If codegen had added a dependency edge to the hir_crate dep-node, nothing would // be re-used, so checking that this module was re-used is sufficient. -#![rustc_partition_reused(module = "issue_38222", cfg = "rpass2")] +// #![rustc_partition_reused(module = "issue_38222", cfg = "rpass2")] //@[rpass1] compile-flags: -C debuginfo=1 //@[rpass2] compile-flags: -C debuginfo=1 diff --git a/tests/incremental/krate-inherent.rs b/tests/incremental/krate-inherent.rs index 60ff636b6bea5..332f060dfb778 100644 --- a/tests/incremental/krate-inherent.rs +++ b/tests/incremental/krate-inherent.rs @@ -5,7 +5,7 @@ #![allow(warnings)] #![feature(rustc_attrs)] -#![rustc_partition_reused(module = "krate_inherent-x", cfg = "cfail2")] +// #![rustc_partition_reused(module = "krate_inherent-x", cfg = "cfail2")] #![crate_type = "rlib"] pub mod x { diff --git a/tests/incremental/krate-inlined.rs b/tests/incremental/krate-inlined.rs index 563b14bc02638..91c7bfe1092a1 100644 --- a/tests/incremental/krate-inlined.rs +++ b/tests/incremental/krate-inlined.rs @@ -8,7 +8,7 @@ #![allow(warnings)] #![feature(rustc_attrs)] -#![rustc_partition_reused(module = "krate_inlined-x", cfg = "rpass2")] +// #![rustc_partition_reused(module = "krate_inlined-x", cfg = "rpass2")] fn main() { x::method(); diff --git a/tests/incremental/lto-in-linker.rs b/tests/incremental/lto-in-linker.rs index b5009d683486d..6f5bd108ab6ed 100644 --- a/tests/incremental/lto-in-linker.rs +++ b/tests/incremental/lto-in-linker.rs @@ -4,6 +4,6 @@ //@ build-pass #![feature(rustc_attrs)] -#![rustc_partition_reused(module = "lto_in_linker", cfg = "cfail2")] +// #![rustc_partition_reused(module = "lto_in_linker", cfg = "cfail2")] pub fn foo() {} diff --git a/tests/incremental/remapped_paths_cc/main.rs b/tests/incremental/remapped_paths_cc/main.rs index eee541148f0b3..a382bf170c3d6 100644 --- a/tests/incremental/remapped_paths_cc/main.rs +++ b/tests/incremental/remapped_paths_cc/main.rs @@ -8,9 +8,9 @@ #![feature(rustc_attrs)] -#![rustc_partition_reused(module="main", cfg="rpass2")] -#![rustc_partition_reused(module="main-some_mod", cfg="rpass2")] -#![rustc_partition_reused(module="main", cfg="rpass3")] +// #![rustc_partition_reused(module="main", cfg="rpass2")] +// #![rustc_partition_reused(module="main-some_mod", cfg="rpass2")] +// #![rustc_partition_reused(module="main", cfg="rpass3")] #![rustc_partition_codegened(module="main-some_mod", cfg="rpass3")] extern crate extern_crate; diff --git a/tests/incremental/remove-private-item-cross-crate/main.rs b/tests/incremental/remove-private-item-cross-crate/main.rs index 762d0aac26deb..d5bd89795c100 100644 --- a/tests/incremental/remove-private-item-cross-crate/main.rs +++ b/tests/incremental/remove-private-item-cross-crate/main.rs @@ -9,7 +9,7 @@ #![feature(rustc_attrs)] #![crate_type = "bin"] -#![rustc_partition_reused(module="main", cfg="rpass2")] +// #![rustc_partition_reused(module="main", cfg="rpass2")] extern crate a; diff --git a/tests/incremental/rlib-lto.rs b/tests/incremental/rlib-lto.rs index 51090615b1fa1..9ad67e07c555f 100644 --- a/tests/incremental/rlib-lto.rs +++ b/tests/incremental/rlib-lto.rs @@ -3,6 +3,6 @@ //@ build-pass #![feature(rustc_attrs)] -#![rustc_partition_reused(module = "rlib_lto", cfg = "cfail2")] +// #![rustc_partition_reused(module = "rlib_lto", cfg = "cfail2")] pub fn foo() {} diff --git a/tests/incremental/spans_in_type_debuginfo.rs b/tests/incremental/spans_in_type_debuginfo.rs index e56b782e92f16..2d81f898c222d 100644 --- a/tests/incremental/spans_in_type_debuginfo.rs +++ b/tests/incremental/spans_in_type_debuginfo.rs @@ -5,8 +5,8 @@ //@ compile-flags: -Z query-dep-graph -g //@ ignore-backends: gcc -#![rustc_partition_reused(module="spans_in_type_debuginfo-structs", cfg="rpass2")] -#![rustc_partition_reused(module="spans_in_type_debuginfo-enums", cfg="rpass2")] +// #![rustc_partition_reused(module="spans_in_type_debuginfo-structs", cfg="rpass2")] +// #![rustc_partition_reused(module="spans_in_type_debuginfo-enums", cfg="rpass2")] #![feature(rustc_attrs)] diff --git a/tests/incremental/spike.rs b/tests/incremental/spike.rs index da1d20fe11656..6e4e9a094cd1d 100644 --- a/tests/incremental/spike.rs +++ b/tests/incremental/spike.rs @@ -8,9 +8,9 @@ #![feature(rustc_attrs)] -#![rustc_partition_reused(module="spike", cfg="rpass2")] +// #![rustc_partition_reused(module="spike", cfg="rpass2")] #![rustc_partition_codegened(module="spike-x", cfg="rpass2")] -#![rustc_partition_reused(module="spike-y", cfg="rpass2")] +// #![rustc_partition_reused(module="spike-y", cfg="rpass2")] mod x { pub struct X { diff --git a/tests/incremental/thinlto/cgu_keeps_identical_fn.rs b/tests/incremental/thinlto/cgu_keeps_identical_fn.rs index 6c87130b73850..6685da3d8436f 100644 --- a/tests/incremental/thinlto/cgu_keeps_identical_fn.rs +++ b/tests/incremental/thinlto/cgu_keeps_identical_fn.rs @@ -10,26 +10,26 @@ #![feature(rustc_attrs)] #![crate_type = "rlib"] -#![rustc_expected_cgu_reuse( - module = "cgu_keeps_identical_fn-foo", - cfg = "cfail2", - kind = "pre-lto" -)] -#![rustc_expected_cgu_reuse( - module = "cgu_keeps_identical_fn-foo", - cfg = "cfail3", - kind = "pre-lto" // Should be "post-lto", see issue #119076 -)] -#![rustc_expected_cgu_reuse( - module = "cgu_keeps_identical_fn-bar", - cfg = "cfail2", - kind = "pre-lto" // Should be "post-lto", see issue #119076 -)] -#![rustc_expected_cgu_reuse( - module = "cgu_keeps_identical_fn-bar", - cfg = "cfail3", - kind = "pre-lto" // Should be "post-lto", see issue #119076 -)] +// #![rustc_expected_cgu_reuse( +// module = "cgu_keeps_identical_fn-foo", +// cfg = "cfail2", +// kind = "pre-lto" +// )] +// #![rustc_expected_cgu_reuse( +// module = "cgu_keeps_identical_fn-foo", +// cfg = "cfail3", +// kind = "pre-lto" // Should be "post-lto", see issue #119076 +// )] +// #![rustc_expected_cgu_reuse( +// module = "cgu_keeps_identical_fn-bar", +// cfg = "cfail2", +// kind = "pre-lto" // Should be "post-lto", see issue #119076 +// )] +// #![rustc_expected_cgu_reuse( +// module = "cgu_keeps_identical_fn-bar", +// cfg = "cfail3", +// kind = "pre-lto" // Should be "post-lto", see issue #119076 +// )] mod foo { From 061dfcef514dcd6b5a2940a5667b64450ac7b30e Mon Sep 17 00:00:00 2001 From: mu001999 Date: Sun, 15 Feb 2026 14:36:43 +0800 Subject: [PATCH 8/8] Use WokerLocal to avoid lock when checking features --- compiler/rustc_driver_impl/src/lib.rs | 4 +-- compiler/rustc_feature/src/unstable.rs | 18 ++++++++----- compiler/rustc_interface/src/passes.rs | 6 ++--- compiler/rustc_interface/src/tests.rs | 7 +++++ compiler/rustc_middle/src/ty/context.rs | 3 ++- compiler/rustc_session/src/session.rs | 36 ++++++++++++++++++++++--- 6 files changed, 57 insertions(+), 17 deletions(-) diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs index bb95bd1f93a66..1bfa3cf4ece33 100644 --- a/compiler/rustc_driver_impl/src/lib.rs +++ b/compiler/rustc_driver_impl/src/lib.rs @@ -21,8 +21,8 @@ use std::io::{self, IsTerminal, Read, Write}; use std::panic::{self, PanicHookInfo}; use std::path::{Path, PathBuf}; use std::process::{Command, ExitCode, Stdio, Termination}; +use std::sync::OnceLock; use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::{Arc, OnceLock}; use std::time::Instant; use std::{env, str}; @@ -714,7 +714,7 @@ fn print_crate_info( let lint_store = crate::unerased_lint_store(sess); let registered_tools = rustc_resolve::registered_tools_ast(sess.dcx(), attrs); let features = rustc_feature::TrackedFeatures::new( - Arc::clone(&sess.used_features), + sess.used_features_weak(), rustc_expand::config::features(sess, attrs, crate_name), ); let lint_levels = rustc_lint::LintLevelsBuilder::crate_root( diff --git a/compiler/rustc_feature/src/unstable.rs b/compiler/rustc_feature/src/unstable.rs index abe4d02a9af93..af775033e394c 100644 --- a/compiler/rustc_feature/src/unstable.rs +++ b/compiler/rustc_feature/src/unstable.rs @@ -1,10 +1,12 @@ //! List of the unstable feature gates. +use std::cell::RefCell; use std::path::PathBuf; -use std::sync::{Arc, Mutex}; +use std::sync::Weak; use std::time::{SystemTime, UNIX_EPOCH}; use rustc_data_structures::fx::FxHashSet; +use rustc_data_structures::sync::WorkerLocal; use rustc_span::{Span, Symbol, sym}; use super::{Feature, to_nonzero}; @@ -45,17 +47,19 @@ macro_rules! status_to_enum { /// "unused features" diagnostics. #[derive(Clone, Debug)] pub struct TrackedFeatures { - used_features: Arc>>, + used_features: Weak>>>, features: Features, } impl TrackedFeatures { - pub fn new(used_features: Arc>>, features: Features) -> Self { + pub fn new( + used_features: Weak>>>, + features: Features, + ) -> Self { Self { used_features, features } } - pub fn unused_features(&self) -> Vec<(Symbol, Span)> { - let used_features = self.used_features.lock().unwrap(); + pub fn unused_features(&self, used_features: &FxHashSet) -> Vec<(Symbol, Span)> { self.enabled_features_iter_stable_order() .filter(|(f, _)| { !used_features.contains(f) @@ -72,7 +76,9 @@ impl TrackedFeatures { /// Is the given feature enabled (via `#[feature(...)]`)? pub fn enabled(&self, feature: Symbol) -> bool { - self.used_features.lock().unwrap().insert(feature); + if let Some(used_features) = self.used_features.upgrade() { + used_features.borrow_mut().insert(feature); + } self.features.enabled(feature) } diff --git a/compiler/rustc_interface/src/passes.rs b/compiler/rustc_interface/src/passes.rs index 5cc7a2fb56b1a..f64bc03d222ff 100644 --- a/compiler/rustc_interface/src/passes.rs +++ b/compiler/rustc_interface/src/passes.rs @@ -877,10 +877,8 @@ pub fn write_interface<'tcx>(tcx: TyCtxt<'tcx>) { pub fn tracked_features_query<'tcx>(tcx: TyCtxt<'tcx>) -> &'tcx rustc_feature::TrackedFeatures { let features = tcx.features_query(()); - tcx.arena.alloc(rustc_feature::TrackedFeatures::new( - Arc::clone(&tcx.sess.used_features), - features.clone(), - )) + tcx.arena + .alloc(rustc_feature::TrackedFeatures::new(tcx.sess.used_features_weak(), features.clone())) } pub static DEFAULT_QUERY_PROVIDERS: LazyLock = LazyLock::new(|| { diff --git a/compiler/rustc_interface/src/tests.rs b/compiler/rustc_interface/src/tests.rs index 5ebf898f45a34..637036d335847 100644 --- a/compiler/rustc_interface/src/tests.rs +++ b/compiler/rustc_interface/src/tests.rs @@ -6,6 +6,7 @@ use std::sync::atomic::AtomicBool; use rustc_abi::Align; use rustc_data_structures::profiling::TimePassesFormat; +use rustc_data_structures::sync::Registry; use rustc_errors::ColorConfig; use rustc_errors::emitter::HumanReadableErrorType; use rustc_hir::attrs::{CollapseMacroDebuginfo, NativeLibKind}; @@ -146,6 +147,8 @@ fn assert_non_crate_hash_different(x: &Options, y: &Options) { // When the user supplies --test we should implicitly supply --cfg test #[test] fn test_switch_implies_cfg_test() { + Registry::new(NonZero::new(1).unwrap()).register(); + sess_and_cfg(&["--test"], |_sess, cfg| { assert!(cfg.contains(&(sym::test, None))); }) @@ -154,6 +157,8 @@ fn test_switch_implies_cfg_test() { // When the user supplies --test and --cfg test, don't implicitly add another --cfg test #[test] fn test_switch_implies_cfg_test_unless_cfg_test() { + Registry::new(NonZero::new(1).unwrap()).register(); + sess_and_cfg(&["--test", "--cfg=test"], |_sess, cfg| { let mut test_items = cfg.iter().filter(|&&(name, _)| name == sym::test); assert!(test_items.next().is_some()); @@ -163,6 +168,8 @@ fn test_switch_implies_cfg_test_unless_cfg_test() { #[test] fn test_can_print_warnings() { + Registry::new(NonZero::new(1).unwrap()).register(); + sess_and_cfg(&["-Awarnings"], |sess, _cfg| { assert!(!sess.dcx().can_emit_warnings()); }); diff --git a/compiler/rustc_middle/src/ty/context.rs b/compiler/rustc_middle/src/ty/context.rs index 7e09c8410d556..b86ef4238aee4 100644 --- a/compiler/rustc_middle/src/ty/context.rs +++ b/compiler/rustc_middle/src/ty/context.rs @@ -1678,7 +1678,8 @@ impl<'tcx> TyCtxt<'tcx> { } pub fn finish(self) { - for (feature, span) in self.features().unused_features() { + let used_features = self.sess.take_used_features(); + for (feature, span) in self.features().unused_features(&used_features) { self.node_span_lint( rustc_session::lint::builtin::UNUSED_FEATURES, CRATE_HIR_ID, diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs index 419ae05127262..568d45ae0a264 100644 --- a/compiler/rustc_session/src/session.rs +++ b/compiler/rustc_session/src/session.rs @@ -1,8 +1,9 @@ use std::any::Any; +use std::cell::RefCell; use std::path::PathBuf; use std::str::FromStr; use std::sync::atomic::AtomicBool; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, Weak}; use std::{env, io}; use rand::{RngCore, rng}; @@ -10,7 +11,9 @@ use rustc_data_structures::base_n::{CASE_INSENSITIVE, ToBaseN}; use rustc_data_structures::flock; use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexSet}; use rustc_data_structures::profiling::{SelfProfiler, SelfProfilerRef}; -use rustc_data_structures::sync::{DynSend, DynSync, Lock, MappedReadGuard, ReadGuard, RwLock}; +use rustc_data_structures::sync::{ + DynSend, DynSync, Lock, MappedReadGuard, ReadGuard, RwLock, WorkerLocal, +}; use rustc_errors::annotate_snippet_emitter_writer::AnnotateSnippetEmitter; use rustc_errors::codes::*; use rustc_errors::emitter::{DynEmitter, HumanReadableErrorType, OutputTheme, stderr_destination}; @@ -159,7 +162,8 @@ pub struct Session { /// with its own implementations. pub replaced_intrinsics: FxHashSet, - pub used_features: Arc>>, + pub used_features: Lock>>>>>, + used_features_weak: Weak>>>, } #[derive(Clone, Copy)] @@ -194,6 +198,27 @@ impl Session { self.miri_unleashed_features.lock().push((span, feature_gate)); } + pub fn used_features_weak(&self) -> Weak>>> { + Weak::clone(&self.used_features_weak) + } + + // Collect used features into a single set from all threads. + #[allow(rustc::potential_query_instability)] + pub fn take_used_features(&self) -> FxHashSet { + let used_features = self.used_features.lock().take().expect("used_features must be set"); + + let mut result = FxHashSet::default(); + for set in Arc::try_unwrap(used_features) + .ok() + .expect("used_features has outstanding strong references") + .into_inner() + { + result.extend(set.take()); + } + + result + } + pub fn local_crate_source_file(&self) -> Option { Some( self.source_map() @@ -1066,6 +1091,8 @@ pub fn build_session( let timings = TimingSectionHandler::new(sopts.json_timings); + let used_features = Arc::new(WorkerLocal::new(|_| RefCell::new(FxHashSet::default()))); + let used_features_weak = Arc::downgrade(&used_features); let sess = Session { target, host, @@ -1090,7 +1117,8 @@ pub fn build_session( host_filesearch, invocation_temp, replaced_intrinsics: FxHashSet::default(), // filled by `run_compiler` - used_features: Arc::new(Mutex::new(FxHashSet::default())), + used_features: Lock::new(Some(used_features)), + used_features_weak, }; validate_commandline_args_with_session_available(&sess);