From fc99ea7ffa1f2dc3407e4f2b7eb64e36532cb5f9 Mon Sep 17 00:00:00 2001 From: varkor Date: Mon, 23 Jul 2018 01:22:01 +0100 Subject: [PATCH] Add a lint for duplicate feature attributes --- src/librustc/lint/builtin.rs | 7 +++++++ src/librustc/middle/stability.rs | 7 +++++++ src/librustc_lint/lib.rs | 1 + 3 files changed, 15 insertions(+) diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index 6536ab6ea73b..2301055e5cec 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -111,6 +111,12 @@ declare_lint! { "unknown features found in crate-level #[feature] directives" } +declare_lint! { + pub DUPLICATE_FEATURES, + Deny, + "duplicate features found in crate-level #[feature] directives" +} + declare_lint! { pub STABLE_FEATURES, Warn, @@ -369,6 +375,7 @@ impl LintPass for HardwiredLints { WARNINGS, UNUSED_FEATURES, UNKNOWN_FEATURES, + DUPLICATE_FEATURES, STABLE_FEATURES, UNKNOWN_CRATE_TYPES, TRIVIAL_CASTS, diff --git a/src/librustc/middle/stability.rs b/src/librustc/middle/stability.rs index 50f949854870..9b5a9dfd5b31 100644 --- a/src/librustc/middle/stability.rs +++ b/src/librustc/middle/stability.rs @@ -826,6 +826,13 @@ pub fn check_unused_or_stable_features<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) { let mut remaining_lib_features = FxHashMap(); for (feature, span) in declared_lib_features.clone().into_iter() { + // Warn if the user enables a feature multiple times. + if remaining_lib_features.contains_key(&feature) { + tcx.lint_node(lint::builtin::DUPLICATE_FEATURES, + ast::CRATE_NODE_ID, + span, + &format!("duplicate `{}` feature attribute", feature)); + } remaining_lib_features.insert(feature, span); } // FIXME(varkor): we don't properly handle lib features behind `cfg` attributes yet, diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index 396e5e869f30..4d8cee294e36 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -189,6 +189,7 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) { UNUSED_EXTERN_CRATES, UNUSED_FEATURES, UNKNOWN_FEATURES, + DUPLICATE_FEATURES, UNUSED_LABELS, UNUSED_PARENS);