From 29d68edc6e1d4f5e6d1599202e3af38080840977 Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Fri, 22 Feb 2019 15:07:18 +0100 Subject: [PATCH 01/18] Add lint for redundant imports Co-authored-by: Stephan Schauerte --- src/librustc/lint/builtin.rs | 6 ++ src/librustc_resolve/resolve_imports.rs | 93 ++++++++++++++++++++++++- src/test/ui/lint/use-redundant.rs | 17 +++++ src/test/ui/lint/use-redundant.stderr | 14 ++++ 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/lint/use-redundant.rs create mode 100644 src/test/ui/lint/use-redundant.stderr diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index 10a5c1479fa6a..615bc0af37a15 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -392,6 +392,12 @@ declare_lint! { "nested occurrence of `impl Trait` type" } +declare_lint! { + pub REDUNDANT_IMPORT, + Warn, + "redundant import" +} + /// Does nothing as a lint pass, but registers some `Lint`s /// that are used by other parts of the compiler. #[derive(Copy, Clone)] diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index c2d2bd753c82e..b40b68b085348 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -7,6 +7,7 @@ use crate::{NameBinding, NameBindingKind, ToNameBinding, PathResult, PrivacyErro use crate::{Resolver, Segment}; use crate::{names_to_string, module_to_string}; use crate::{resolve_error, ResolutionError, Suggestion}; +use crate::ModuleKind; use crate::macros::ParentScope; use errors::Applicability; @@ -14,7 +15,11 @@ use errors::Applicability; use rustc_data_structures::ptr_key::PtrKey; use rustc::ty; use rustc::lint::builtin::BuiltinLintDiagnostics; -use rustc::lint::builtin::{DUPLICATE_MACRO_EXPORTS, PUB_USE_OF_PRIVATE_EXTERN_CRATE}; +use rustc::lint::builtin::{ + DUPLICATE_MACRO_EXPORTS, + PUB_USE_OF_PRIVATE_EXTERN_CRATE, + REDUNDANT_IMPORT, +}; use rustc::hir::def_id::{CrateNum, DefId}; use rustc::hir::def::*; use rustc::session::DiagnosticMessageId; @@ -1227,10 +1232,96 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { import[ns] = Some(PathResolution::new(def)); }); + self.check_for_redundant_imports( + ident, + directive, + source_bindings, + target_bindings, + target, + ); + debug!("(resolving single import) successfully resolved import"); None } + fn check_for_redundant_imports( + &mut self, + ident: Ident, + directive: &'b ImportDirective<'b>, + source_bindings: &PerNS, Determinacy>>>, + target_bindings: &PerNS>>>, + target: Ident, + ) { + // Check if we are at the root of a macro expansion and skip if we are. + if directive.parent_scope.expansion != Mark::root() { + return; + } + + if let ModuleKind::Def(_, _) = directive.parent_scope.module.kind { + return; + } + + let mut is_redundant = PerNS { + value_ns: None, + type_ns: None, + macro_ns: None, + }; + + let mut redundant_span = PerNS { + value_ns: None, + type_ns: None, + macro_ns: None, + }; + + self.per_ns(|this, ns| if let Some(binding) = source_bindings[ns].get().ok() { + if binding.def() == Def::Err { + return; + } + + let orig_blacklisted_binding = mem::replace( + &mut this.blacklisted_binding, + target_bindings[ns].get() + ); + + match this.early_resolve_ident_in_lexical_scope( + target, + ScopeSet::Import(ns), + &directive.parent_scope, + false, + false, + directive.span, + ) { + Ok(other_binding) => { + is_redundant[ns] = Some(binding.def() == other_binding.def()); + redundant_span[ns] = Some(other_binding.span); + } + Err(_) => is_redundant[ns] = Some(false) + } + + this.blacklisted_binding = orig_blacklisted_binding; + }); + + if !is_redundant.is_empty() && + is_redundant.present_items().all(|is_redundant| is_redundant) + { + self.session.buffer_lint( + REDUNDANT_IMPORT, + directive.id, + directive.span, + &format!("the item `{}` is imported redundantly", ident), + ); + + for span in redundant_span.present_items() { + self.session.buffer_lint( + REDUNDANT_IMPORT, + directive.id, + span, + "another import" + ); + } + } + } + fn resolve_glob_import(&mut self, directive: &'b ImportDirective<'b>) { let module = match directive.imported_module.get().unwrap() { ModuleOrUniformRoot::Module(module) => module, diff --git a/src/test/ui/lint/use-redundant.rs b/src/test/ui/lint/use-redundant.rs new file mode 100644 index 0000000000000..50d4d30625a6a --- /dev/null +++ b/src/test/ui/lint/use-redundant.rs @@ -0,0 +1,17 @@ +// compile-pass + +use crate::foo::Bar; //~ WARNING first import + +mod foo { + pub type Bar = i32; +} + +fn baz() -> Bar { + 3 +} + +fn main() { + use crate::foo::Bar; //~ WARNING redundant import + let _a: Bar = 3; + baz(); +} diff --git a/src/test/ui/lint/use-redundant.stderr b/src/test/ui/lint/use-redundant.stderr new file mode 100644 index 0000000000000..6a6becc5e615b --- /dev/null +++ b/src/test/ui/lint/use-redundant.stderr @@ -0,0 +1,14 @@ +warning: the item `Bar` is imported redundantly + --> $DIR/use-redundant.rs:14:9 + | +LL | use crate::foo::Bar; //~ WARNING redundant import + | ^^^^^^^^^^^^^^^ + | + = note: #[warn(redundant_import)] on by default + +warning: another import + --> $DIR/use-redundant.rs:3:5 + | +LL | use crate::foo::Bar; //~ WARNING first import + | ^^^^^^^^^^^^^^^ + From 541c4999a9e878f26ada62bc9a82f088a8f2fad2 Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sun, 10 Mar 2019 12:52:30 +0100 Subject: [PATCH 02/18] Remove redundant imports --- src/librustc/ty/query/on_disk_cache.rs | 1 - src/librustc_codegen_llvm/context.rs | 1 - src/librustc_codegen_ssa/mir/rvalue.rs | 1 - src/librustc_errors/lib.rs | 2 +- src/librustc_interface/profile/mod.rs | 1 - src/librustc_mir/hair/pattern/mod.rs | 1 - src/librustc_mir/interpret/operator.rs | 2 -- src/librustc_resolve/lib.rs | 1 - src/librustc_traits/lowering/environment.rs | 2 +- src/librustc_typeck/check/wfcheck.rs | 5 ----- 10 files changed, 2 insertions(+), 15 deletions(-) diff --git a/src/librustc/ty/query/on_disk_cache.rs b/src/librustc/ty/query/on_disk_cache.rs index 1b4c36b8b06c3..05d80f9203f14 100644 --- a/src/librustc/ty/query/on_disk_cache.rs +++ b/src/librustc/ty/query/on_disk_cache.rs @@ -777,7 +777,6 @@ impl<'enc, 'a, 'tcx, E> CacheEncoder<'enc, 'a, 'tcx, E> value: &V) -> Result<(), E::Error> { - use crate::ty::codec::TyEncoder; let start_pos = self.position(); tag.encode(self)?; diff --git a/src/librustc_codegen_llvm/context.rs b/src/librustc_codegen_llvm/context.rs index fc79e868fb4bf..f6956bd5736eb 100644 --- a/src/librustc_codegen_llvm/context.rs +++ b/src/librustc_codegen_llvm/context.rs @@ -372,7 +372,6 @@ impl MiscMethods<'tcx> for CodegenCx<'ll, 'tcx> { // Returns a Value of the "eh_unwind_resume" lang item if one is defined, // otherwise declares it as an external function. fn eh_unwind_resume(&self) -> &'ll Value { - use crate::attributes; let unwresume = &self.eh_unwind_resume; if let Some(llfn) = unwresume.get() { return llfn; diff --git a/src/librustc_codegen_ssa/mir/rvalue.rs b/src/librustc_codegen_ssa/mir/rvalue.rs index 7a31c5b3950e0..fc4f6b8324787 100644 --- a/src/librustc_codegen_ssa/mir/rvalue.rs +++ b/src/librustc_codegen_ssa/mir/rvalue.rs @@ -732,7 +732,6 @@ fn cast_int_to_float<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>>( // All inputs greater or equal to (f32::MAX + 0.5 ULP) are rounded to infinity, // and for everything else LLVM's uitofp works just fine. use rustc_apfloat::ieee::Single; - use rustc_apfloat::Float; const MAX_F32_PLUS_HALF_ULP: u128 = ((1 << (Single::PRECISION + 1)) - 1) << (Single::MAX_EXP - Single::PRECISION as i16); let max = bx.cx().const_uint_big(int_ty, MAX_F32_PLUS_HALF_ULP); diff --git a/src/librustc_errors/lib.rs b/src/librustc_errors/lib.rs index 6b4b437930d26..ebbc5a3d3a340 100644 --- a/src/librustc_errors/lib.rs +++ b/src/librustc_errors/lib.rs @@ -155,7 +155,7 @@ impl CodeSuggestion { /// Returns the assembled code suggestions and whether they should be shown with an underline. pub fn splice_lines(&self, cm: &SourceMapperDyn) -> Vec<(String, Vec)> { - use syntax_pos::{CharPos, Loc, Pos}; + use syntax_pos::{CharPos, Pos}; fn push_trailing(buf: &mut String, line_opt: Option<&Cow<'_, str>>, diff --git a/src/librustc_interface/profile/mod.rs b/src/librustc_interface/profile/mod.rs index d0c8dff207083..2e71d46f4154c 100644 --- a/src/librustc_interface/profile/mod.rs +++ b/src/librustc_interface/profile/mod.rs @@ -62,7 +62,6 @@ fn total_duration(traces: &[trace::Rec]) -> Duration { fn profile_queries_thread(r: Receiver) { use self::trace::*; use std::fs::File; - use std::time::{Instant}; let mut profq_msgs: Vec = vec![]; let mut frame: StackFrame = StackFrame { parse_st: ParseState::Clear, traces: vec![] }; diff --git a/src/librustc_mir/hair/pattern/mod.rs b/src/librustc_mir/hair/pattern/mod.rs index 6c532fce57f0e..622cf00ed86e7 100644 --- a/src/librustc_mir/hair/pattern/mod.rs +++ b/src/librustc_mir/hair/pattern/mod.rs @@ -427,7 +427,6 @@ impl<'a, 'tcx> PatternContext<'a, 'tcx> { let mut kind = match (lo, hi) { (PatternKind::Constant { value: lo }, PatternKind::Constant { value: hi }) => { - use std::cmp::Ordering; let cmp = compare_const_vals( self.tcx, lo, diff --git a/src/librustc_mir/interpret/operator.rs b/src/librustc_mir/interpret/operator.rs index ca93007788e03..488f81d8f740e 100644 --- a/src/librustc_mir/interpret/operator.rs +++ b/src/librustc_mir/interpret/operator.rs @@ -331,8 +331,6 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> InterpretCx<'a, 'mir, 'tcx, M> val: ImmTy<'tcx, M::PointerTag>, ) -> EvalResult<'tcx, Scalar> { use rustc::mir::UnOp::*; - use rustc_apfloat::ieee::{Single, Double}; - use rustc_apfloat::Float; let layout = val.layout; let val = val.to_scalar()?; diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index ab3d87fafdac7..3703ea08b6253 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -1738,7 +1738,6 @@ impl<'a> Resolver<'a> { /// just that an error occurred. pub fn resolve_str_path_error(&mut self, span: Span, path_str: &str, is_value: bool) -> Result { - use std::iter; let mut errored = false; let path = if path_str.starts_with("::") { diff --git a/src/librustc_traits/lowering/environment.rs b/src/librustc_traits/lowering/environment.rs index 3570cb1024600..eb47892ea4103 100644 --- a/src/librustc_traits/lowering/environment.rs +++ b/src/librustc_traits/lowering/environment.rs @@ -164,7 +164,7 @@ crate fn environment<'a, 'tcx>( tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId ) -> Environment<'tcx> { - use super::{Lower, IntoFromEnvGoal}; + use super::IntoFromEnvGoal; use rustc::hir::{Node, TraitItemKind, ImplItemKind, ItemKind, ForeignItemKind}; debug!("environment(def_id = {:?})", def_id); diff --git a/src/librustc_typeck/check/wfcheck.rs b/src/librustc_typeck/check/wfcheck.rs index 920270b5473cf..3579810b8d75f 100644 --- a/src/librustc_typeck/check/wfcheck.rs +++ b/src/librustc_typeck/check/wfcheck.rs @@ -420,9 +420,6 @@ fn check_where_clauses<'a, 'gcx, 'fcx, 'tcx>( def_id: DefId, return_ty: Option>, ) { - use ty::subst::Subst; - use rustc::ty::TypeFoldable; - let predicates = fcx.tcx.predicates_of(def_id); let generics = tcx.generics_of(def_id); @@ -1010,8 +1007,6 @@ fn check_false_global_bounds<'a, 'gcx, 'tcx>( span: Span, id: hir::HirId) { - use rustc::ty::TypeFoldable; - let empty_env = ty::ParamEnv::empty(); let def_id = fcx.tcx.hir().local_def_id_from_hir_id(id); From 2cebbe25995f308fe6ed72a246f9d2ea633addf9 Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sat, 16 Mar 2019 16:49:13 +0100 Subject: [PATCH 03/18] Edit comments --- src/librustc_resolve/resolve_imports.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index b40b68b085348..534e5e0ff45a1 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -1252,11 +1252,13 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { target_bindings: &PerNS>>>, target: Ident, ) { - // Check if we are at the root of a macro expansion and skip if we are. + // Skip if the import was produced by a macro. if directive.parent_scope.expansion != Mark::root() { return; } + // Skip if we are inside a named module (in contrast to an anonymous + // module defined by a block). if let ModuleKind::Def(_, _) = directive.parent_scope.module.kind { return; } From 2245d10fac9b37c55a286f48d8560fc9537cbc3e Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sat, 16 Mar 2019 17:38:12 +0100 Subject: [PATCH 04/18] Improve warning --- src/librustc/lint/builtin.rs | 9 +++++++++ src/librustc_resolve/resolve_imports.rs | 15 +++++---------- src/test/ui/lint/use-redundant.stderr | 11 ++++------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index 615bc0af37a15..002ee59940059 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -489,6 +489,7 @@ pub enum BuiltinLintDiagnostics { UnknownCrateTypes(Span, String, String), UnusedImports(String, Vec<(Span, String)>), NestedImplTrait { outer_impl_trait_span: Span, inner_impl_trait_span: Span }, + RedundantImport(Vec, ast::Ident), } impl BuiltinLintDiagnostics { @@ -585,6 +586,14 @@ impl BuiltinLintDiagnostics { db.span_label(outer_impl_trait_span, "outer `impl Trait`"); db.span_label(inner_impl_trait_span, "nested `impl Trait` here"); } + BuiltinLintDiagnostics::RedundantImport(spans, ident) => { + for span in spans { + db.span_label( + span, + format!("the item `{}` was already imported here", ident) + ); + } + } } } } diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 534e5e0ff45a1..cd018d8eb9e23 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -1306,21 +1306,16 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { if !is_redundant.is_empty() && is_redundant.present_items().all(|is_redundant| is_redundant) { - self.session.buffer_lint( + self.session.buffer_lint_with_diagnostic( REDUNDANT_IMPORT, directive.id, directive.span, &format!("the item `{}` is imported redundantly", ident), + BuiltinLintDiagnostics::RedundantImport( + redundant_span.present_items().collect(), + ident, + ), ); - - for span in redundant_span.present_items() { - self.session.buffer_lint( - REDUNDANT_IMPORT, - directive.id, - span, - "another import" - ); - } } } diff --git a/src/test/ui/lint/use-redundant.stderr b/src/test/ui/lint/use-redundant.stderr index 6a6becc5e615b..c843ed160df08 100644 --- a/src/test/ui/lint/use-redundant.stderr +++ b/src/test/ui/lint/use-redundant.stderr @@ -1,14 +1,11 @@ warning: the item `Bar` is imported redundantly --> $DIR/use-redundant.rs:14:9 | -LL | use crate::foo::Bar; //~ WARNING redundant import +LL | use crate::foo::Bar; + | --------------- the item `Bar` was already imported here +... +LL | use crate::foo::Bar; | ^^^^^^^^^^^^^^^ | = note: #[warn(redundant_import)] on by default -warning: another import - --> $DIR/use-redundant.rs:3:5 - | -LL | use crate::foo::Bar; //~ WARNING first import - | ^^^^^^^^^^^^^^^ - From d04e83fe2c51acd2c8e89c03d15deb7e1896bb8b Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sat, 16 Mar 2019 18:08:51 +0100 Subject: [PATCH 05/18] Bless tests --- src/test/ui/lint/lint-unused-imports.stderr | 23 ++++++++++ .../rust-2018/future-proofing-locals.stderr | 46 +++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/src/test/ui/lint/lint-unused-imports.stderr b/src/test/ui/lint/lint-unused-imports.stderr index f9a54f477f998..bf194696f6182 100644 --- a/src/test/ui/lint/lint-unused-imports.stderr +++ b/src/test/ui/lint/lint-unused-imports.stderr @@ -34,12 +34,35 @@ error: unused import: `foo::Square` LL | use foo::Square; | ^^^^^^^^^^^ +warning: the item `g` is imported redundantly + --> $DIR/lint-unused-imports.rs:68:9 + | +LL | / fn g() { +LL | | use self::g; + | | ^^^^^^^ +LL | | fn f() { +LL | | self::g(); +LL | | } +LL | | } + | |_- the item `g` was already imported here + | + = note: #[warn(redundant_import)] on by default + error: unused import: `self::g` --> $DIR/lint-unused-imports.rs:68:9 | LL | use self::g; | ^^^^^^^ +warning: the item `foo` is imported redundantly + --> $DIR/lint-unused-imports.rs:77:9 + | +LL | use test2::{foo, bar}; + | --- the item `foo` was already imported here +... +LL | use test2::foo; + | ^^^^^^^^^^ + error: unused import: `test2::foo` --> $DIR/lint-unused-imports.rs:77:9 | diff --git a/src/test/ui/rust-2018/future-proofing-locals.stderr b/src/test/ui/rust-2018/future-proofing-locals.stderr index 4d666d22afed1..fa8333b5d2112 100644 --- a/src/test/ui/rust-2018/future-proofing-locals.stderr +++ b/src/test/ui/rust-2018/future-proofing-locals.stderr @@ -52,5 +52,51 @@ error: imports cannot refer to local variables LL | use {T as _, x}; | ^ +warning: the item `T` is imported redundantly + --> $DIR/future-proofing-locals.rs:19:9 + | +LL | / mod T { +LL | | pub struct U; +LL | | } + | |_- the item `T` was already imported here +... +LL | use T; + | ^ + | + = note: #[warn(redundant_import)] on by default + +warning: the item `x` is imported redundantly + --> $DIR/future-proofing-locals.rs:31:9 + | +LL | / mod x { +LL | | pub struct y; +LL | | } + | |_- the item `x` was already imported here +... +LL | use x; + | ^ + +warning: the item `x` is imported redundantly + --> $DIR/future-proofing-locals.rs:37:17 + | +LL | / mod x { +LL | | pub struct y; +LL | | } + | |_- the item `x` was already imported here +... +LL | use x; + | ^ + +warning: the item `x` is imported redundantly + --> $DIR/future-proofing-locals.rs:45:18 + | +LL | / mod x { +LL | | pub struct y; +LL | | } + | |_- the item `x` was already imported here +... +LL | use {T as _, x}; + | ^ + error: aborting due to 9 previous errors From 8919894c513a8f8eadacd9555afee7a6d095665c Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sat, 16 Mar 2019 19:06:22 +0100 Subject: [PATCH 06/18] Distinguish between imported and defined items --- src/librustc/lint/builtin.rs | 7 ++++--- src/librustc_resolve/resolve_imports.rs | 3 ++- src/test/ui/lint/use-redundant.stderr | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index 002ee59940059..462f0947338bb 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -489,7 +489,7 @@ pub enum BuiltinLintDiagnostics { UnknownCrateTypes(Span, String, String), UnusedImports(String, Vec<(Span, String)>), NestedImplTrait { outer_impl_trait_span: Span, inner_impl_trait_span: Span }, - RedundantImport(Vec, ast::Ident), + RedundantImport(Vec<(Span, bool)>, ast::Ident), } impl BuiltinLintDiagnostics { @@ -587,10 +587,11 @@ impl BuiltinLintDiagnostics { db.span_label(inner_impl_trait_span, "nested `impl Trait` here"); } BuiltinLintDiagnostics::RedundantImport(spans, ident) => { - for span in spans { + for (span, is_imported) in spans { + let introduced = if is_imported { "imported" } else { "defined" }; db.span_label( span, - format!("the item `{}` was already imported here", ident) + format!("the item `{}` was {} here", ident, introduced) ); } } diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index cd018d8eb9e23..eacbf81347aa7 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -1295,7 +1295,8 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { ) { Ok(other_binding) => { is_redundant[ns] = Some(binding.def() == other_binding.def()); - redundant_span[ns] = Some(other_binding.span); + redundant_span[ns] = + Some((other_binding.span, other_binding.is_import())); } Err(_) => is_redundant[ns] = Some(false) } diff --git a/src/test/ui/lint/use-redundant.stderr b/src/test/ui/lint/use-redundant.stderr index c843ed160df08..b5000b22a1dad 100644 --- a/src/test/ui/lint/use-redundant.stderr +++ b/src/test/ui/lint/use-redundant.stderr @@ -2,7 +2,7 @@ warning: the item `Bar` is imported redundantly --> $DIR/use-redundant.rs:14:9 | LL | use crate::foo::Bar; - | --------------- the item `Bar` was already imported here + | --------------- the item `Bar` was imported here ... LL | use crate::foo::Bar; | ^^^^^^^^^^^^^^^ From fef3f5c88d660277c85909af36edd3e121a0d576 Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sat, 16 Mar 2019 19:19:40 +0100 Subject: [PATCH 07/18] Remove redundant import --- src/librustdoc/html/render.rs | 2 -- src/librustdoc/test.rs | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 9220d2feed2d2..f7e8cdeaeca89 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -1069,8 +1069,6 @@ themePicker.onblur = handleThemeButtonsBlur; } if cx.shared.include_sources { - use std::path::Component; - let mut hierarchy = Hierarchy::new(OsString::new()); for source in cx.shared.local_sources.iter() .filter_map(|p| p.0.strip_prefix(&cx.shared.src_root) diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs index f1d4d8470b2a5..0bbc7c5c4b223 100644 --- a/src/librustdoc/test.rs +++ b/src/librustdoc/test.rs @@ -371,8 +371,7 @@ pub fn make_test(s: &str, // Uses libsyntax to parse the doctest and find if there's a main fn and the extern // crate already is included. let (already_has_main, already_has_extern_crate, found_macro) = crate::syntax::with_globals(|| { - use crate::syntax::{ast, parse::{self, ParseSess}, source_map::FilePathMapping}; - use crate::syntax_pos::FileName; + use crate::syntax::{parse::{self, ParseSess}, source_map::FilePathMapping}; use errors::emitter::EmitterWriter; use errors::Handler; From f9272364bf443ec29cf9cc3548f37a7579b35bfd Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sat, 16 Mar 2019 19:21:03 +0100 Subject: [PATCH 08/18] Edit ui tests --- src/test/ui/lint/lint-unused-imports.rs | 1 + src/test/ui/rust-2018/future-proofing-locals.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/test/ui/lint/lint-unused-imports.rs b/src/test/ui/lint/lint-unused-imports.rs index 9c5b206203c1d..c7ffdc270c947 100644 --- a/src/test/ui/lint/lint-unused-imports.rs +++ b/src/test/ui/lint/lint-unused-imports.rs @@ -1,5 +1,6 @@ #![deny(unused_imports)] #![allow(dead_code)] +#![allow(redundant_import)] use bar::c::cc as cal; diff --git a/src/test/ui/rust-2018/future-proofing-locals.rs b/src/test/ui/rust-2018/future-proofing-locals.rs index 1e53c2d1daca4..df3badb94e5f0 100644 --- a/src/test/ui/rust-2018/future-proofing-locals.rs +++ b/src/test/ui/rust-2018/future-proofing-locals.rs @@ -1,6 +1,7 @@ // edition:2018 #![allow(non_camel_case_types)] +#![allow(redundant_import)] mod T { pub struct U; From 6e7b45e12b76cad70262281d5fae7ad98032fafc Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sun, 17 Mar 2019 09:49:31 +0100 Subject: [PATCH 09/18] Replace REDUNDANT_IMPORT with UNUSED_IMPORTS --- src/librustc/lint/builtin.rs | 8 +-- src/librustc_resolve/resolve_imports.rs | 4 +- src/test/ui/lint/lint-unused-imports.rs | 1 - src/test/ui/lint/lint-unused-imports.stderr | 10 ++- .../ui/rust-2018/future-proofing-locals.rs | 2 +- .../rust-2018/future-proofing-locals.stderr | 64 +++---------------- 6 files changed, 17 insertions(+), 72 deletions(-) diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index 462f0947338bb..6908674bc13a2 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -392,12 +392,6 @@ declare_lint! { "nested occurrence of `impl Trait` type" } -declare_lint! { - pub REDUNDANT_IMPORT, - Warn, - "redundant import" -} - /// Does nothing as a lint pass, but registers some `Lint`s /// that are used by other parts of the compiler. #[derive(Copy, Clone)] @@ -591,7 +585,7 @@ impl BuiltinLintDiagnostics { let introduced = if is_imported { "imported" } else { "defined" }; db.span_label( span, - format!("the item `{}` was {} here", ident, introduced) + format!("the item `{}` was already {} here", ident, introduced) ); } } diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index eacbf81347aa7..99e20c398d92f 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -18,7 +18,7 @@ use rustc::lint::builtin::BuiltinLintDiagnostics; use rustc::lint::builtin::{ DUPLICATE_MACRO_EXPORTS, PUB_USE_OF_PRIVATE_EXTERN_CRATE, - REDUNDANT_IMPORT, + UNUSED_IMPORTS, }; use rustc::hir::def_id::{CrateNum, DefId}; use rustc::hir::def::*; @@ -1308,7 +1308,7 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { is_redundant.present_items().all(|is_redundant| is_redundant) { self.session.buffer_lint_with_diagnostic( - REDUNDANT_IMPORT, + UNUSED_IMPORTS, directive.id, directive.span, &format!("the item `{}` is imported redundantly", ident), diff --git a/src/test/ui/lint/lint-unused-imports.rs b/src/test/ui/lint/lint-unused-imports.rs index c7ffdc270c947..9c5b206203c1d 100644 --- a/src/test/ui/lint/lint-unused-imports.rs +++ b/src/test/ui/lint/lint-unused-imports.rs @@ -1,6 +1,5 @@ #![deny(unused_imports)] #![allow(dead_code)] -#![allow(redundant_import)] use bar::c::cc as cal; diff --git a/src/test/ui/lint/lint-unused-imports.stderr b/src/test/ui/lint/lint-unused-imports.stderr index bf194696f6182..62490972420a2 100644 --- a/src/test/ui/lint/lint-unused-imports.stderr +++ b/src/test/ui/lint/lint-unused-imports.stderr @@ -34,7 +34,7 @@ error: unused import: `foo::Square` LL | use foo::Square; | ^^^^^^^^^^^ -warning: the item `g` is imported redundantly +error: the item `g` is imported redundantly --> $DIR/lint-unused-imports.rs:68:9 | LL | / fn g() { @@ -44,9 +44,7 @@ LL | | fn f() { LL | | self::g(); LL | | } LL | | } - | |_- the item `g` was already imported here - | - = note: #[warn(redundant_import)] on by default + | |_- the item `g` was already defined here error: unused import: `self::g` --> $DIR/lint-unused-imports.rs:68:9 @@ -54,7 +52,7 @@ error: unused import: `self::g` LL | use self::g; | ^^^^^^^ -warning: the item `foo` is imported redundantly +error: the item `foo` is imported redundantly --> $DIR/lint-unused-imports.rs:77:9 | LL | use test2::{foo, bar}; @@ -75,5 +73,5 @@ error: unused import: `test::B2` LL | use test::B2; | ^^^^^^^^ -error: aborting due to 8 previous errors +error: aborting due to 10 previous errors diff --git a/src/test/ui/rust-2018/future-proofing-locals.rs b/src/test/ui/rust-2018/future-proofing-locals.rs index df3badb94e5f0..2c388cf3713b0 100644 --- a/src/test/ui/rust-2018/future-proofing-locals.rs +++ b/src/test/ui/rust-2018/future-proofing-locals.rs @@ -1,7 +1,7 @@ // edition:2018 #![allow(non_camel_case_types)] -#![allow(redundant_import)] +#![allow(unused_imports)] mod T { pub struct U; diff --git a/src/test/ui/rust-2018/future-proofing-locals.stderr b/src/test/ui/rust-2018/future-proofing-locals.stderr index fa8333b5d2112..7021489a6ddcf 100644 --- a/src/test/ui/rust-2018/future-proofing-locals.stderr +++ b/src/test/ui/rust-2018/future-proofing-locals.stderr @@ -1,102 +1,56 @@ error: imports cannot refer to type parameters - --> $DIR/future-proofing-locals.rs:13:9 + --> $DIR/future-proofing-locals.rs:14:9 | LL | use T as _; | ^ error: imports cannot refer to type parameters - --> $DIR/future-proofing-locals.rs:14:9 + --> $DIR/future-proofing-locals.rs:15:9 | LL | use T::U; | ^ error: imports cannot refer to type parameters - --> $DIR/future-proofing-locals.rs:15:9 + --> $DIR/future-proofing-locals.rs:16:9 | LL | use T::*; | ^ error: imports cannot refer to type parameters - --> $DIR/future-proofing-locals.rs:19:9 + --> $DIR/future-proofing-locals.rs:20:9 | LL | use T; | ^ error: imports cannot refer to local variables - --> $DIR/future-proofing-locals.rs:25:9 + --> $DIR/future-proofing-locals.rs:26:9 | LL | use x as _; | ^ error: imports cannot refer to local variables - --> $DIR/future-proofing-locals.rs:31:9 + --> $DIR/future-proofing-locals.rs:32:9 | LL | use x; | ^ error: imports cannot refer to local variables - --> $DIR/future-proofing-locals.rs:37:17 + --> $DIR/future-proofing-locals.rs:38:17 | LL | use x; | ^ error: imports cannot refer to type parameters - --> $DIR/future-proofing-locals.rs:45:10 + --> $DIR/future-proofing-locals.rs:46:10 | LL | use {T as _, x}; | ^ error: imports cannot refer to local variables - --> $DIR/future-proofing-locals.rs:45:18 + --> $DIR/future-proofing-locals.rs:46:18 | LL | use {T as _, x}; | ^ -warning: the item `T` is imported redundantly - --> $DIR/future-proofing-locals.rs:19:9 - | -LL | / mod T { -LL | | pub struct U; -LL | | } - | |_- the item `T` was already imported here -... -LL | use T; - | ^ - | - = note: #[warn(redundant_import)] on by default - -warning: the item `x` is imported redundantly - --> $DIR/future-proofing-locals.rs:31:9 - | -LL | / mod x { -LL | | pub struct y; -LL | | } - | |_- the item `x` was already imported here -... -LL | use x; - | ^ - -warning: the item `x` is imported redundantly - --> $DIR/future-proofing-locals.rs:37:17 - | -LL | / mod x { -LL | | pub struct y; -LL | | } - | |_- the item `x` was already imported here -... -LL | use x; - | ^ - -warning: the item `x` is imported redundantly - --> $DIR/future-proofing-locals.rs:45:18 - | -LL | / mod x { -LL | | pub struct y; -LL | | } - | |_- the item `x` was already imported here -... -LL | use {T as _, x}; - | ^ - error: aborting due to 9 previous errors From 0f3b1c035837fc5e101d5a2d8c49b1d5128927b5 Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sun, 17 Mar 2019 11:38:38 +0100 Subject: [PATCH 10/18] Fix tests --- src/test/ui/lint/lint-unused-imports.rs | 2 ++ src/test/ui/lint/lint-unused-imports.stderr | 5 +++-- src/test/ui/lint/use-redundant.rs | 1 + src/test/ui/lint/use-redundant.stderr | 10 +++++++--- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/test/ui/lint/lint-unused-imports.rs b/src/test/ui/lint/lint-unused-imports.rs index 9c5b206203c1d..4754d8880763a 100644 --- a/src/test/ui/lint/lint-unused-imports.rs +++ b/src/test/ui/lint/lint-unused-imports.rs @@ -66,6 +66,7 @@ mod bar { fn g() { use self::g; //~ ERROR unused import: `self::g` + //~^ ERROR the item `g` is imported redundantly fn f() { self::g(); } @@ -75,6 +76,7 @@ fn g() { #[allow(unused_variables)] fn h() { use test2::foo; //~ ERROR unused import: `test2::foo` + //~^ ERROR the item `foo` is imported redundantly let foo = 0; } diff --git a/src/test/ui/lint/lint-unused-imports.stderr b/src/test/ui/lint/lint-unused-imports.stderr index 62490972420a2..b37f25ec01741 100644 --- a/src/test/ui/lint/lint-unused-imports.stderr +++ b/src/test/ui/lint/lint-unused-imports.stderr @@ -40,6 +40,7 @@ error: the item `g` is imported redundantly LL | / fn g() { LL | | use self::g; | | ^^^^^^^ +LL | | LL | | fn f() { LL | | self::g(); LL | | } @@ -53,7 +54,7 @@ LL | use self::g; | ^^^^^^^ error: the item `foo` is imported redundantly - --> $DIR/lint-unused-imports.rs:77:9 + --> $DIR/lint-unused-imports.rs:78:9 | LL | use test2::{foo, bar}; | --- the item `foo` was already imported here @@ -62,7 +63,7 @@ LL | use test2::foo; | ^^^^^^^^^^ error: unused import: `test2::foo` - --> $DIR/lint-unused-imports.rs:77:9 + --> $DIR/lint-unused-imports.rs:78:9 | LL | use test2::foo; | ^^^^^^^^^^ diff --git a/src/test/ui/lint/use-redundant.rs b/src/test/ui/lint/use-redundant.rs index 50d4d30625a6a..7abf5e498b538 100644 --- a/src/test/ui/lint/use-redundant.rs +++ b/src/test/ui/lint/use-redundant.rs @@ -1,4 +1,5 @@ // compile-pass +#![warn(unused_imports)] use crate::foo::Bar; //~ WARNING first import diff --git a/src/test/ui/lint/use-redundant.stderr b/src/test/ui/lint/use-redundant.stderr index b5000b22a1dad..b25ffc6073f46 100644 --- a/src/test/ui/lint/use-redundant.stderr +++ b/src/test/ui/lint/use-redundant.stderr @@ -1,11 +1,15 @@ warning: the item `Bar` is imported redundantly - --> $DIR/use-redundant.rs:14:9 + --> $DIR/use-redundant.rs:15:9 | LL | use crate::foo::Bar; - | --------------- the item `Bar` was imported here + | --------------- the item `Bar` was already imported here ... LL | use crate::foo::Bar; | ^^^^^^^^^^^^^^^ | - = note: #[warn(redundant_import)] on by default +note: lint level defined here + --> $DIR/use-redundant.rs:2:9 + | +LL | #![warn(unused_imports)] + | ^^^^^^^^^^^^^^ From 4a619aa1261c995abedc446226a7701c2c9e1c79 Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sun, 17 Mar 2019 11:55:32 +0100 Subject: [PATCH 11/18] Add glob import to redundancy test --- src/test/ui/lint/use-redundant.rs | 9 ++++++++ src/test/ui/lint/use-redundant.stderr | 33 ++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/test/ui/lint/use-redundant.rs b/src/test/ui/lint/use-redundant.rs index 7abf5e498b538..328f8232bafa8 100644 --- a/src/test/ui/lint/use-redundant.rs +++ b/src/test/ui/lint/use-redundant.rs @@ -11,8 +11,17 @@ fn baz() -> Bar { 3 } +mod m1 { pub struct S {} } +mod m2 { pub struct S {} } + +use m1::*; +use m2::*; + fn main() { use crate::foo::Bar; //~ WARNING redundant import let _a: Bar = 3; baz(); + + use m1::S; //~ WARNING redundant import + let _s = S {}; } diff --git a/src/test/ui/lint/use-redundant.stderr b/src/test/ui/lint/use-redundant.stderr index b25ffc6073f46..82d2312779e6d 100644 --- a/src/test/ui/lint/use-redundant.stderr +++ b/src/test/ui/lint/use-redundant.stderr @@ -1,15 +1,36 @@ +warning: unused import: `m1::*` + --> $DIR/use-redundant.rs:17:5 + | +LL | use m1::*; + | ^^^^^ + | +note: lint level defined here + --> $DIR/use-redundant.rs:2:9 + | +LL | #![warn(unused_imports)] + | ^^^^^^^^^^^^^^ + +warning: unused import: `m2::*` + --> $DIR/use-redundant.rs:18:5 + | +LL | use m2::*; + | ^^^^^ + warning: the item `Bar` is imported redundantly - --> $DIR/use-redundant.rs:15:9 + --> $DIR/use-redundant.rs:21:9 | LL | use crate::foo::Bar; | --------------- the item `Bar` was already imported here ... LL | use crate::foo::Bar; | ^^^^^^^^^^^^^^^ + +warning: the item `S` is imported redundantly + --> $DIR/use-redundant.rs:25:9 | -note: lint level defined here - --> $DIR/use-redundant.rs:2:9 - | -LL | #![warn(unused_imports)] - | ^^^^^^^^^^^^^^ +LL | use m1::*; + | ----- the item `S` was already imported here +... +LL | use m1::S; + | ^^^^^ From a97aeb41d4d342136f52b3cdddc8d59beae606cc Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sun, 17 Mar 2019 13:30:42 +0100 Subject: [PATCH 12/18] Fix more tests --- src/test/run-pass/binding/match-arm-statics.rs | 2 -- src/test/run-pass/ifmt.rs | 2 -- src/test/run-pass/invalid_const_promotion.rs | 1 - src/test/run-pass/issues/issue-38556.rs | 1 - src/test/run-pass/issues/issue-39367.rs | 1 - src/test/run-pass/out-of-stack.rs | 1 - src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/basic.rs | 1 - .../traits/traits-multidispatch-infer-convert-target.rs | 1 - 8 files changed, 10 deletions(-) diff --git a/src/test/run-pass/binding/match-arm-statics.rs b/src/test/run-pass/binding/match-arm-statics.rs index 359c39211588c..5f7e357eeb2a9 100644 --- a/src/test/run-pass/binding/match-arm-statics.rs +++ b/src/test/run-pass/binding/match-arm-statics.rs @@ -45,8 +45,6 @@ pub mod glfw { } fn issue_6533() { - use glfw; - fn action_to_str(state: glfw::InputState) -> &'static str { use glfw::{RELEASE, PRESS, REPEAT}; match state { diff --git a/src/test/run-pass/ifmt.rs b/src/test/run-pass/ifmt.rs index 56222fa46f7c9..8c17b01e2bd89 100644 --- a/src/test/run-pass/ifmt.rs +++ b/src/test/run-pass/ifmt.rs @@ -238,7 +238,6 @@ pub fn main() { // Basic test to make sure that we can invoke the `write!` macro with an // fmt::Write instance. fn test_write() { - use std::fmt::Write; let mut buf = String::new(); write!(&mut buf, "{}", 3); { @@ -267,7 +266,6 @@ fn test_print() { // Just make sure that the macros are defined, there's not really a lot that we // can do with them just yet (to test the output) fn test_format_args() { - use std::fmt::Write; let mut buf = String::new(); { let w = &mut buf; diff --git a/src/test/run-pass/invalid_const_promotion.rs b/src/test/run-pass/invalid_const_promotion.rs index 1524373895d9b..2775aac015615 100644 --- a/src/test/run-pass/invalid_const_promotion.rs +++ b/src/test/run-pass/invalid_const_promotion.rs @@ -25,7 +25,6 @@ fn foo() { #[cfg(unix)] fn check_status(status: std::process::ExitStatus) { - use libc; use std::os::unix::process::ExitStatusExt; assert!(status.signal() == Some(libc::SIGILL) diff --git a/src/test/run-pass/issues/issue-38556.rs b/src/test/run-pass/issues/issue-38556.rs index 0cc247f5b9ca5..63fd9db08ff2f 100644 --- a/src/test/run-pass/issues/issue-38556.rs +++ b/src/test/run-pass/issues/issue-38556.rs @@ -9,6 +9,5 @@ macro_rules! reexport { reexport!(); fn main() { - use Bar; fn f(_: Bar) {} } diff --git a/src/test/run-pass/issues/issue-39367.rs b/src/test/run-pass/issues/issue-39367.rs index bd92224bce161..484cd782a09df 100644 --- a/src/test/run-pass/issues/issue-39367.rs +++ b/src/test/run-pass/issues/issue-39367.rs @@ -15,7 +15,6 @@ fn arena() -> &'static ArenaSet> { fn require_sync(_: &T) { } unsafe fn __stability() -> &'static ArenaSet> { use std::mem::transmute; - use std::boxed::Box; static mut DATA: *const ArenaSet> = 0 as *const ArenaSet>; static mut ONCE: Once = ONCE_INIT; diff --git a/src/test/run-pass/out-of-stack.rs b/src/test/run-pass/out-of-stack.rs index 72d6d6806229e..9f868d6e5c3e4 100644 --- a/src/test/run-pass/out-of-stack.rs +++ b/src/test/run-pass/out-of-stack.rs @@ -36,7 +36,6 @@ fn loud_recurse() { #[cfg(unix)] fn check_status(status: std::process::ExitStatus) { - use libc; use std::os::unix::process::ExitStatusExt; assert!(!status.success()); diff --git a/src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/basic.rs b/src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/basic.rs index 15449a6b83e2e..f25d81f1c9a52 100644 --- a/src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/basic.rs +++ b/src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/basic.rs @@ -7,7 +7,6 @@ use xcrate::Z; fn f() { - use xcrate; use xcrate as ycrate; let s = xcrate::S; assert_eq!(format!("{:?}", s), "S"); diff --git a/src/test/run-pass/traits/traits-multidispatch-infer-convert-target.rs b/src/test/run-pass/traits/traits-multidispatch-infer-convert-target.rs index ca47d9736f63c..626e1ae71bc2f 100644 --- a/src/test/run-pass/traits/traits-multidispatch-infer-convert-target.rs +++ b/src/test/run-pass/traits/traits-multidispatch-infer-convert-target.rs @@ -28,7 +28,6 @@ where T : Convert } fn main() { - use std::default::Default; // T = i16, U = u32 test(22_i16, Default::default(), 2, 4); From 8fb05491514c5cfb3c3aa03e0266389fa0b29ed0 Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sun, 17 Mar 2019 17:40:25 +0100 Subject: [PATCH 13/18] Fix doc tests --- src/liballoc/borrow.rs | 2 +- src/libcore/cell.rs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/liballoc/borrow.rs b/src/liballoc/borrow.rs index 74c80a08b12ab..ee1799fad8e15 100644 --- a/src/liballoc/borrow.rs +++ b/src/liballoc/borrow.rs @@ -135,7 +135,7 @@ impl ToOwned for T /// Another example showing how to keep `Cow` in a struct: /// /// ``` -/// use std::borrow::{Cow, ToOwned}; +/// use std::borrow::Cow; /// /// struct Items<'a, X: 'a> where [X]: ToOwned> { /// values: Cow<'a, [X]>, diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs index 753f10e6a0ad0..3b888244341f9 100644 --- a/src/libcore/cell.rs +++ b/src/libcore/cell.rs @@ -1421,7 +1421,6 @@ impl fmt::Display for RefMut<'_, T> { /// /// ``` /// use std::cell::UnsafeCell; -/// use std::marker::Sync; /// /// # #[allow(dead_code)] /// struct NotThreadSafe { From df80eae985e80e0907c1ebde4caf1d7cc8acbc21 Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sun, 17 Mar 2019 21:07:57 +0100 Subject: [PATCH 14/18] Change message to present tense --- src/librustc/lint/builtin.rs | 2 +- src/test/ui/lint/lint-unused-imports.stderr | 4 ++-- src/test/ui/lint/use-redundant.stderr | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index 6908674bc13a2..2d8a2c6321fa8 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -585,7 +585,7 @@ impl BuiltinLintDiagnostics { let introduced = if is_imported { "imported" } else { "defined" }; db.span_label( span, - format!("the item `{}` was already {} here", ident, introduced) + format!("the item `{}` is already {} here", ident, introduced) ); } } diff --git a/src/test/ui/lint/lint-unused-imports.stderr b/src/test/ui/lint/lint-unused-imports.stderr index b37f25ec01741..96d71a228a5f2 100644 --- a/src/test/ui/lint/lint-unused-imports.stderr +++ b/src/test/ui/lint/lint-unused-imports.stderr @@ -45,7 +45,7 @@ LL | | fn f() { LL | | self::g(); LL | | } LL | | } - | |_- the item `g` was already defined here + | |_- the item `g` is already defined here error: unused import: `self::g` --> $DIR/lint-unused-imports.rs:68:9 @@ -57,7 +57,7 @@ error: the item `foo` is imported redundantly --> $DIR/lint-unused-imports.rs:78:9 | LL | use test2::{foo, bar}; - | --- the item `foo` was already imported here + | --- the item `foo` is already imported here ... LL | use test2::foo; | ^^^^^^^^^^ diff --git a/src/test/ui/lint/use-redundant.stderr b/src/test/ui/lint/use-redundant.stderr index 82d2312779e6d..3554443590abf 100644 --- a/src/test/ui/lint/use-redundant.stderr +++ b/src/test/ui/lint/use-redundant.stderr @@ -20,7 +20,7 @@ warning: the item `Bar` is imported redundantly --> $DIR/use-redundant.rs:21:9 | LL | use crate::foo::Bar; - | --------------- the item `Bar` was already imported here + | --------------- the item `Bar` is already imported here ... LL | use crate::foo::Bar; | ^^^^^^^^^^^^^^^ @@ -29,7 +29,7 @@ warning: the item `S` is imported redundantly --> $DIR/use-redundant.rs:25:9 | LL | use m1::*; - | ----- the item `S` was already imported here + | ----- the item `S` is already imported here ... LL | use m1::S; | ^^^^^ From c244c411e4c869a76c7a8163b67840bdf83674e6 Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Mon, 18 Mar 2019 17:50:49 +0100 Subject: [PATCH 15/18] Handle glob import in redundancy check --- src/librustc_resolve/resolve_imports.rs | 5 ++++- src/test/ui/lint/use-redundant.stderr | 9 --------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/librustc_resolve/resolve_imports.rs b/src/librustc_resolve/resolve_imports.rs index 99e20c398d92f..7ea07f5e0cbcb 100644 --- a/src/librustc_resolve/resolve_imports.rs +++ b/src/librustc_resolve/resolve_imports.rs @@ -1294,7 +1294,10 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> { directive.span, ) { Ok(other_binding) => { - is_redundant[ns] = Some(binding.def() == other_binding.def()); + is_redundant[ns] = Some( + binding.def() == other_binding.def() + && !other_binding.is_ambiguity() + ); redundant_span[ns] = Some((other_binding.span, other_binding.is_import())); } diff --git a/src/test/ui/lint/use-redundant.stderr b/src/test/ui/lint/use-redundant.stderr index 3554443590abf..fbd9f81f18f8a 100644 --- a/src/test/ui/lint/use-redundant.stderr +++ b/src/test/ui/lint/use-redundant.stderr @@ -25,12 +25,3 @@ LL | use crate::foo::Bar; LL | use crate::foo::Bar; | ^^^^^^^^^^^^^^^ -warning: the item `S` is imported redundantly - --> $DIR/use-redundant.rs:25:9 - | -LL | use m1::*; - | ----- the item `S` is already imported here -... -LL | use m1::S; - | ^^^^^ - From 2ade4430402dcbe3bba9a17a13cb290f73f5a477 Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Mon, 18 Mar 2019 17:51:00 +0100 Subject: [PATCH 16/18] Restore test --- src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/basic.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/basic.rs b/src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/basic.rs index f25d81f1c9a52..566b3581046d9 100644 --- a/src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/basic.rs +++ b/src/test/run-pass/rfcs/rfc-2126-extern-absolute-paths/basic.rs @@ -4,9 +4,12 @@ // compile-flags:--extern xcrate // edition:2018 +#![allow(unused_imports)] + use xcrate::Z; fn f() { + use xcrate; use xcrate as ycrate; let s = xcrate::S; assert_eq!(format!("{:?}", s), "S"); From ae6622da58d011e57489df7971a57f2cb6a6e926 Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sun, 31 Mar 2019 12:02:27 +0200 Subject: [PATCH 17/18] Add back missing import --- src/librustc_traits/lowering/environment.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc_traits/lowering/environment.rs b/src/librustc_traits/lowering/environment.rs index eb47892ea4103..3570cb1024600 100644 --- a/src/librustc_traits/lowering/environment.rs +++ b/src/librustc_traits/lowering/environment.rs @@ -164,7 +164,7 @@ crate fn environment<'a, 'tcx>( tcx: TyCtxt<'a, 'tcx, 'tcx>, def_id: DefId ) -> Environment<'tcx> { - use super::IntoFromEnvGoal; + use super::{Lower, IntoFromEnvGoal}; use rustc::hir::{Node, TraitItemKind, ImplItemKind, ItemKind, ForeignItemKind}; debug!("environment(def_id = {:?})", def_id); From c1d5314bd3b628749491e4fe201b4c6916a53ce6 Mon Sep 17 00:00:00 2001 From: Fabian Drinck Date: Sun, 31 Mar 2019 14:11:46 +0200 Subject: [PATCH 18/18] Remove redundant import --- src/librustc_codegen_ssa/traits/type_.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/librustc_codegen_ssa/traits/type_.rs b/src/librustc_codegen_ssa/traits/type_.rs index 7fb2cb9d39362..efc18d401c082 100644 --- a/src/librustc_codegen_ssa/traits/type_.rs +++ b/src/librustc_codegen_ssa/traits/type_.rs @@ -77,7 +77,6 @@ pub trait DerivedTypeMethods<'tcx>: BaseTypeMethods<'tcx> + MiscMethods<'tcx> { } fn type_has_metadata(&self, ty: Ty<'tcx>) -> bool { - use syntax_pos::DUMMY_SP; if ty.is_sized(self.tcx().at(DUMMY_SP), ty::ParamEnv::reveal_all()) { return false; }