self.register_renamed("transmute_fat_ptr", "fat_ptr_transmutes");
self.register_renamed("raw_pointer_deriving", "raw_pointer_derive");
+ self.register_renamed("unknown_features", "unused_features");
}
#[allow(unused_variables)]
}
}
- tcx.sess.abort_if_errors();
*tcx.node_lint_levels.borrow_mut() = cx.node_levels.into_inner();
}
//! propagating default levels lexically from parent to children ast nodes.
use session::Session;
+use lint;
use middle::ty;
use metadata::csearch;
use syntax::parse::token::InternedString;
use syntax::attr::{Stability, AttrMetaMethods};
use syntax::visit::{FnKind, FkMethod, Visitor};
use syntax::feature_gate::emit_feature_warn;
-use util::nodemap::{NodeMap, DefIdMap, FnvHashSet};
+use util::nodemap::{NodeMap, DefIdMap, FnvHashSet, FnvHashMap};
use util::ppaux::Repr;
use std::mem::replace;
/// Given the list of enabled features that were not language features (i.e. that
/// were expected to be library features), and the list of features used from
/// libraries, identify activated features that don't exist and error about them.
-pub fn check_unknown_features(sess: &Session,
- _used_lib_features: &FnvHashSet<InternedString>) {
- let ref _lib_features = sess.features.borrow().lib_features;
- // TODO
-
- //sess.add_lint(lint::builtin::UNKNOWN_FEATURES,
- // ast::CRATE_NODE_ID,
- // *uf,
- // "unknown feature".to_string());
+pub fn check_unused_features(sess: &Session,
+ used_lib_features: &FnvHashSet<InternedString>) {
+ let ref lib_features = sess.features.borrow().lib_features;
+ let mut active_lib_features: FnvHashMap<InternedString, Span>
+ = lib_features.clone().into_iter().collect();
+
+ for used_feature in used_lib_features.iter() {
+ active_lib_features.remove(used_feature);
+ }
+
+ for (_, &span) in active_lib_features.iter() {
+ sess.add_lint(lint::builtin::UNUSED_FEATURES,
+ ast::CRATE_NODE_ID,
+ span,
+ "unused or unknown feature".to_string());
+ }
}
time(time_passes, "stability checking", (), |_|
stability::check_unstable_api_usage(&ty_cx));
- time(time_passes, "unknown feature checking", (), |_|
- stability::check_unknown_features(
+ time(time_passes, "unused feature checking", (), |_|
+ stability::check_unused_features(
&ty_cx.sess, lib_features_used));
time(time_passes, "lint checking", (), |_|
lint::check_crate(&ty_cx, &exported_items));
- // Some of the above passes generate errors
+ // The above three passes generate errors w/o aborting
ty_cx.sess.abort_if_errors();
ty::CrateAnalysis {