Skip to content

Commit

Permalink
Auto merge of #53444 - varkor:lib_features-conditional, r=michaelwoer…
Browse files Browse the repository at this point in the history
…ister

Only fetch lib_features when there are unknown feature attributes

An attempt to win back some of the performance lost in #52644 (comment).

cc @nnethercote
  • Loading branch information
bors committed Aug 21, 2018
2 parents 9f9f2c0 + 1695856 commit 2d6d3ac
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 12 deletions.
7 changes: 1 addition & 6 deletions src/librustc/middle/lib_features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
use ty::TyCtxt;
use syntax::symbol::Symbol;
use syntax::ast::{Attribute, MetaItem, MetaItemKind};
use syntax_pos::{Span, DUMMY_SP};
use syntax_pos::Span;
use hir::intravisit::{self, NestedVisitorMap, Visitor};
use rustc_data_structures::fx::{FxHashSet, FxHashMap};
use errors::DiagnosticId;
Expand Down Expand Up @@ -152,11 +152,6 @@ impl<'a, 'tcx> Visitor<'tcx> for LibFeatureCollector<'a, 'tcx> {

pub fn collect<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> LibFeatures {
let mut collector = LibFeatureCollector::new(tcx);
for &cnum in tcx.crates().iter() {
for &(feature, since) in tcx.defined_lib_features(cnum).iter() {
collector.collect_feature(feature, since, DUMMY_SP);
}
}
intravisit::walk_crate(&mut collector, tcx.hir.krate());
collector.lib_features
}
32 changes: 26 additions & 6 deletions src/librustc/middle/stability.rs
Original file line number Diff line number Diff line change
Expand Up @@ -846,14 +846,34 @@ pub fn check_unused_or_stable_features<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
remaining_lib_features.remove(&Symbol::intern("libc"));
remaining_lib_features.remove(&Symbol::intern("test"));

for (feature, stable) in tcx.lib_features().to_vec() {
if let Some(since) = stable {
if let Some(span) = remaining_lib_features.get(&feature) {
// Warn if the user has enabled an already-stable lib feature.
unnecessary_stable_feature_lint(tcx, *span, feature, since);
let check_features =
|remaining_lib_features: &mut FxHashMap<_, _>, defined_features: &Vec<_>| {
for &(feature, since) in defined_features {
if let Some(since) = since {
if let Some(span) = remaining_lib_features.get(&feature) {
// Warn if the user has enabled an already-stable lib feature.
unnecessary_stable_feature_lint(tcx, *span, feature, since);
}
}
remaining_lib_features.remove(&feature);
if remaining_lib_features.is_empty() {
break;
}
}
};

// We always collect the lib features declared in the current crate, even if there are
// no unknown features, because the collection also does feature attribute validation.
let local_defined_features = tcx.lib_features().to_vec();
if !remaining_lib_features.is_empty() {
check_features(&mut remaining_lib_features, &local_defined_features);

for &cnum in &*tcx.crates() {
if remaining_lib_features.is_empty() {
break;
}
check_features(&mut remaining_lib_features, &tcx.defined_lib_features(cnum));
}
remaining_lib_features.remove(&feature);
}

for (feature, span) in remaining_lib_features {
Expand Down

0 comments on commit 2d6d3ac

Please sign in to comment.