Skip to content

Commit 8e414e0

Browse files
committed
Auto merge of #33091 - sanxiyn:unused-trait-import-3, r=nrc
Warn unused trait imports, rebased Rebase of #30021. Fix #25730.
2 parents 4896832 + 282afda commit 8e414e0

File tree

60 files changed

+193
-83
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+193
-83
lines changed

src/libcoretest/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
#![feature(box_syntax)]
1616
#![feature(cell_extras)]
1717
#![feature(const_fn)]
18-
#![feature(core_float)]
1918
#![feature(core_private_bignum)]
2019
#![feature(core_private_diy_float)]
2120
#![feature(dec2flt)]

src/libcoretest/num/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ pub fn test_num<T>(ten: T, two: T) where
5252
mod tests {
5353
use core::option::Option;
5454
use core::option::Option::{Some, None};
55-
use core::num::Float;
5655

5756
#[test]
5857
fn from_str_issue7588() {

src/librand/distributions/exponential.rs

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
//! The exponential distribution.
1212
13+
#[cfg(not(test))] // only necessary for no_std
1314
use FloatMath;
1415

1516
use {Rng, Rand};

src/librand/distributions/gamma.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use self::GammaRepr::*;
1414
use self::ChiSquaredRepr::*;
1515

16+
#[cfg(not(test))] // only necessary for no_std
1617
use FloatMath;
1718

1819
use {Rng, Open01};

src/librand/distributions/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
//! internally. The `IndependentSample` trait is for generating values
1818
//! that do not need to record state.
1919
20+
#[cfg(not(test))] // only necessary for no_std
2021
use core::num::Float;
22+
2123
use core::marker::PhantomData;
2224

2325
use {Rng, Rand};

src/librand/distributions/normal.rs

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
//! The normal and derived distributions.
1212
13+
#[cfg(not(test))] // only necessary for no_std
1314
use FloatMath;
1415

1516
use {Rng, Rand, Open01};

src/librand/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@
2828
#![unstable(feature = "rand",
2929
reason = "use `rand` from crates.io",
3030
issue = "27703")]
31-
#![feature(core_float)]
3231
#![feature(core_intrinsics)]
3332
#![feature(staged_api)]
3433
#![feature(step_by)]
3534
#![feature(custom_attribute)]
3635
#![allow(unused_attributes)]
3736

37+
#![cfg_attr(not(test), feature(core_float))] // only necessary for no_std
3838
#![cfg_attr(test, feature(test, rand))]
3939

4040
#![allow(deprecated)]

src/librustc/dep_graph/dep_node.rs

+2
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ pub enum DepNode<D: Clone + Debug> {
5959
TypeckItemBody(D),
6060
Dropck,
6161
DropckImpl(D),
62+
UnusedTraitCheck,
6263
CheckConst(D),
6364
Privacy,
6465
IntrinsicCheck(D),
@@ -165,6 +166,7 @@ impl<D: Clone + Debug> DepNode<D> {
165166
CheckEntryFn => Some(CheckEntryFn),
166167
Variance => Some(Variance),
167168
Dropck => Some(Dropck),
169+
UnusedTraitCheck => Some(UnusedTraitCheck),
168170
Privacy => Some(Privacy),
169171
Reachability => Some(Reachability),
170172
DeadCheck => Some(DeadCheck),

src/librustc/hir/mod.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -1639,8 +1639,13 @@ pub type FreevarMap = NodeMap<Vec<Freevar>>;
16391639

16401640
pub type CaptureModeMap = NodeMap<CaptureClause>;
16411641

1642+
pub struct TraitCandidate {
1643+
pub def_id: DefId,
1644+
pub import_id: Option<NodeId>,
1645+
}
1646+
16421647
// Trait method resolution
1643-
pub type TraitMap = NodeMap<Vec<DefId>>;
1648+
pub type TraitMap = NodeMap<Vec<TraitCandidate>>;
16441649

16451650
// Map from the NodeId of a glob import to a list of items which are actually
16461651
// imported.

src/librustc/ty/context.rs

+9
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,8 @@ pub struct TyCtxt<'tcx> {
289289
// scratch every time.
290290
pub freevars: RefCell<FreevarMap>,
291291

292+
pub maybe_unused_trait_imports: NodeSet,
293+
292294
// Records the type of every item.
293295
pub tcache: RefCell<DepTrackingMap<maps::Tcache<'tcx>>>,
294296

@@ -338,6 +340,10 @@ pub struct TyCtxt<'tcx> {
338340
/// about.
339341
pub used_mut_nodes: RefCell<NodeSet>,
340342

343+
/// Set of trait imports actually used in the method resolution.
344+
/// This is used for warning unused imports.
345+
pub used_trait_imports: RefCell<NodeSet>,
346+
341347
/// The set of external nominal types whose implementations have been read.
342348
/// This is used for lazy resolution of methods.
343349
pub populated_external_types: RefCell<DefIdSet>,
@@ -543,6 +549,7 @@ impl<'tcx> TyCtxt<'tcx> {
543549
named_region_map: resolve_lifetime::NamedRegionMap,
544550
map: ast_map::Map<'tcx>,
545551
freevars: FreevarMap,
552+
maybe_unused_trait_imports: NodeSet,
546553
region_maps: RegionMaps,
547554
lang_items: middle::lang_items::LanguageItems,
548555
stability: stability::Index<'tcx>,
@@ -581,6 +588,7 @@ impl<'tcx> TyCtxt<'tcx> {
581588
fulfilled_predicates: RefCell::new(fulfilled_predicates),
582589
map: map,
583590
freevars: RefCell::new(freevars),
591+
maybe_unused_trait_imports: maybe_unused_trait_imports,
584592
tcache: RefCell::new(DepTrackingMap::new(dep_graph.clone())),
585593
rcache: RefCell::new(FnvHashMap()),
586594
tc_cache: RefCell::new(FnvHashMap()),
@@ -595,6 +603,7 @@ impl<'tcx> TyCtxt<'tcx> {
595603
impl_items: RefCell::new(DepTrackingMap::new(dep_graph.clone())),
596604
used_unsafe: RefCell::new(NodeSet()),
597605
used_mut_nodes: RefCell::new(NodeSet()),
606+
used_trait_imports: RefCell::new(NodeSet()),
598607
populated_external_types: RefCell::new(DefIdSet()),
599608
populated_external_primitive_impls: RefCell::new(DefIdSet()),
600609
extern_const_statics: RefCell::new(DefIdMap()),

src/librustc_back/sha2.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ mod tests {
531531
use self::rand::isaac::IsaacRng;
532532
use serialize::hex::FromHex;
533533
use std::u64;
534-
use super::{Digest, Sha256, FixedBuffer};
534+
use super::{Digest, Sha256};
535535

536536
// A normal addition - no overflow occurs
537537
#[test]
@@ -648,7 +648,7 @@ mod tests {
648648
mod bench {
649649
extern crate test;
650650
use self::test::Bencher;
651-
use super::{Sha256, FixedBuffer, Digest};
651+
use super::{Sha256, Digest};
652652

653653
#[bench]
654654
pub fn sha256_10(b: &mut Bencher) {

src/librustc_const_eval/eval.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use self::EvalHint::*;
1717

1818
use rustc::hir::map as ast_map;
1919
use rustc::hir::map::blocks::FnLikeNode;
20-
use rustc::middle::cstore::{self, CrateStore, InlinedItem};
20+
use rustc::middle::cstore::{self, InlinedItem};
2121
use rustc::{infer, traits};
2222
use rustc::hir::def::Def;
2323
use rustc::hir::def_id::DefId;

src/librustc_driver/driver.rs

+2
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
791791
let resolve::CrateMap {
792792
def_map,
793793
freevars,
794+
maybe_unused_trait_imports,
794795
export_map,
795796
trait_map,
796797
glob_map,
@@ -840,6 +841,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
840841
named_region_map,
841842
hir_map,
842843
freevars,
844+
maybe_unused_trait_imports,
843845
region_map,
844846
lang_items,
845847
index,

src/librustc_driver/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ use rustc_trans::back::link;
7070
use rustc::session::{self, config, Session, build_session, CompileResult};
7171
use rustc::session::config::{Input, PrintRequest, OutputType, ErrorOutputType};
7272
use rustc::session::config::{get_unstable_features_setting, nightly_options};
73-
use rustc::middle::cstore::CrateStore;
7473
use rustc::lint::Lint;
7574
use rustc::lint;
7675
use rustc_metadata::loader;

src/librustc_driver/test.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ use rustc::ty::subst;
2424
use rustc::ty::subst::Subst;
2525
use rustc::traits::ProjectionMode;
2626
use rustc::ty::{self, Ty, TyCtxt, TypeFoldable};
27-
use rustc::ty::relate::TypeRelation;
2827
use rustc::infer::{self, InferOk, InferResult, TypeOrigin};
2928
use rustc_metadata::cstore::CStore;
3029
use rustc_metadata::creader::LocalCrateReader;
@@ -132,7 +131,7 @@ fn test_env<F>(source_string: &str,
132131

133132
// run just enough stuff to build a tcx:
134133
let lang_items = lang_items::collect_language_items(&sess, &ast_map);
135-
let resolve::CrateMap { def_map, freevars, .. } =
134+
let resolve::CrateMap { def_map, freevars, maybe_unused_trait_imports, .. } =
136135
resolve::resolve_crate(&sess, &ast_map, resolve::MakeGlobMap::No);
137136
let named_region_map = resolve_lifetime::krate(&sess, &ast_map, &def_map.borrow());
138137
let region_map = region::resolve_crate(&sess, &ast_map);
@@ -143,6 +142,7 @@ fn test_env<F>(source_string: &str,
143142
named_region_map.unwrap(),
144143
ast_map,
145144
freevars,
145+
maybe_unused_trait_imports,
146146
region_map,
147147
lang_items,
148148
index,

src/librustc_incremental/persist/data.rs

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
//! The data that we will serialize and deserialize.
1212
1313
use rustc::dep_graph::DepNode;
14-
use rustc_serialize::{Decoder as RustcDecoder, Encoder as RustcEncoder};
1514

1615
use super::directory::DefPathIndex;
1716

src/librustc_incremental/persist/directory.rs

-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ use rustc::hir::map::DefPath;
1818
use rustc::hir::def_id::DefId;
1919
use rustc::ty;
2020
use rustc::util::nodemap::DefIdMap;
21-
use rustc_serialize::{Decoder as RustcDecoder, Encoder as RustcEncoder};
2221
use std::fmt::{self, Debug};
2322

2423
/// Index into the DefIdDirectory

src/librustc_lint/builtin.rs

-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
//! a `pub fn new()`.
3030
3131
use rustc::hir::def::Def;
32-
use middle::cstore::CrateStore;
3332
use rustc::hir::def_id::DefId;
3433
use middle::stability;
3534
use rustc::{cfg, infer};

src/librustc_lint/types.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use std::{i8, i16, i32, i64, u8, u16, u32, u64, f32, f64};
2626

2727
use syntax::ast;
2828
use syntax::abi::Abi;
29-
use syntax::attr::{self, AttrMetaMethods};
29+
use syntax::attr;
3030
use syntax::codemap::{self, Span};
3131

3232
use rustc::hir;

src/librustc_metadata/csearch.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ impl<'tcx> CrateStore<'tcx> for cstore::CStore {
536536
let mut visible_parent_map = self.visible_parent_map.borrow_mut();
537537
if !visible_parent_map.is_empty() { return visible_parent_map; }
538538

539-
use rustc::middle::cstore::{CrateStore, ChildItem};
539+
use rustc::middle::cstore::ChildItem;
540540
use std::collections::vec_deque::VecDeque;
541541
use std::collections::hash_map::Entry;
542542
for cnum in 1 .. self.next_crate_num() {

src/librustc_metadata/decoder.rs

-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ use rustc::mir;
4343
use rustc::mir::visit::MutVisitor;
4444

4545
use std::cell::Cell;
46-
use std::io::prelude::*;
4746
use std::io;
4847
use std::rc::Rc;
4948
use std::str;

src/librustc_metadata/encoder.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use def_key;
2121
use tyencode;
2222
use index::{self, IndexData};
2323

24-
use middle::cstore::{LOCAL_CRATE, CrateStore, InlinedItemRef, LinkMeta, tls};
24+
use middle::cstore::{LOCAL_CRATE, InlinedItemRef, LinkMeta, tls};
2525
use rustc::hir::def;
2626
use rustc::hir::def_id::{CRATE_DEF_INDEX, DefId};
2727
use middle::dependency_format::Linkage;
@@ -46,7 +46,6 @@ use syntax::abi::Abi;
4646
use syntax::ast::{self, NodeId, Name, CRATE_NODE_ID, CrateNum};
4747
use syntax::codemap::BytePos;
4848
use syntax::attr;
49-
use syntax::attr::AttrMetaMethods;
5049
use syntax::errors::Handler;
5150
use syntax;
5251
use rbml::writer::Encoder;

src/librustc_metadata/loader.rs

-1
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,6 @@ use std::cmp;
233233
use std::collections::HashMap;
234234
use std::fmt;
235235
use std::fs;
236-
use std::io::prelude::*;
237236
use std::io;
238237
use std::path::{Path, PathBuf};
239238
use std::ptr;

src/librustc_privacy/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ use rustc::hir::intravisit::{self, Visitor};
3434

3535
use rustc::dep_graph::DepNode;
3636
use rustc::lint;
37-
use rustc::middle::cstore::CrateStore;
3837
use rustc::hir::def::{self, Def};
3938
use rustc::hir::def_id::DefId;
4039
use rustc::middle::privacy::{AccessLevel, AccessLevels};

src/librustc_resolve/build_reduced_graph.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use ParentLink::{ModuleParentLink, BlockParentLink};
2121
use Resolver;
2222
use {resolve_error, resolve_struct_error, ResolutionError};
2323

24-
use rustc::middle::cstore::{CrateStore, ChildItem, DlDef};
24+
use rustc::middle::cstore::{ChildItem, DlDef};
2525
use rustc::lint;
2626
use rustc::hir::def::*;
2727
use rustc::hir::def_id::{CRATE_DEF_INDEX, DefId};

src/librustc_resolve/check_unused.rs

+10
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
// resolve data structures and because it finalises the privacy information for
1717
// `use` directives.
1818
//
19+
// Unused trait imports can't be checked until the method resolution. We save
20+
// candidates here, and do the acutal check in librustc_typeck/check_unused.rs.
1921

2022
use std::ops::{Deref, DerefMut};
2123

@@ -55,10 +57,18 @@ impl<'a, 'b, 'tcx> UnusedImportCheckVisitor<'a, 'b, 'tcx> {
5557
fn check_import(&mut self, id: ast::NodeId, span: Span) {
5658
if !self.used_imports.contains(&(id, TypeNS)) &&
5759
!self.used_imports.contains(&(id, ValueNS)) {
60+
if self.maybe_unused_trait_imports.contains(&id) {
61+
// Check later.
62+
return;
63+
}
5864
self.session.add_lint(lint::builtin::UNUSED_IMPORTS,
5965
id,
6066
span,
6167
"unused import".to_string());
68+
} else {
69+
// This trait import is definitely used, in a way other than
70+
// method resolution.
71+
self.maybe_unused_trait_imports.remove(&id);
6272
}
6373
}
6474
}

0 commit comments

Comments
 (0)