Skip to content

Commit 61af754

Browse files
committed
Auto merge of #45350 - cjkenn:cjkenn/used-trait-imports, r=nikomatsakis
Put used trait imports field into a distinct query Implementation for #45214 r+ @nikomatsakis
2 parents fbc3642 + 6f30ce0 commit 61af754

File tree

8 files changed

+28
-10
lines changed

8 files changed

+28
-10
lines changed

src/librustc/dep_graph/dep_node.rs

+1
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ define_dep_nodes!( <'tcx>
500500
[] InherentImpls(DefId),
501501
[] TypeckBodiesKrate,
502502
[] TypeckTables(DefId),
503+
[] UsedTraitImports(DefId),
503504
[] HasTypeckTables(DefId),
504505
[] ConstEval { param_env: ParamEnvAnd<'tcx, (DefId, &'tcx Substs<'tcx>)> },
505506
[] SymbolName(DefId),

src/librustc/ty/context.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -386,8 +386,10 @@ pub struct TypeckTables<'tcx> {
386386
cast_kinds: ItemLocalMap<ty::cast::CastKind>,
387387

388388
/// Set of trait imports actually used in the method resolution.
389-
/// This is used for warning unused imports.
390-
pub used_trait_imports: DefIdSet,
389+
/// This is used for warning unused imports. During type
390+
/// checking, this `Rc` should not be cloned: it must have a ref-count
391+
/// of 1 so that we can insert things into the set mutably.
392+
pub used_trait_imports: Rc<DefIdSet>,
391393

392394
/// If any errors occurred while type-checking this body,
393395
/// this field will be set to `true`.
@@ -417,7 +419,7 @@ impl<'tcx> TypeckTables<'tcx> {
417419
liberated_fn_sigs: ItemLocalMap(),
418420
fru_field_types: ItemLocalMap(),
419421
cast_kinds: ItemLocalMap(),
420-
used_trait_imports: DefIdSet(),
422+
used_trait_imports: Rc::new(DefIdSet()),
421423
tainted_by_errors: false,
422424
free_region_map: FreeRegionMap::new(),
423425
}

src/librustc/ty/maps/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,8 @@ define_maps! { <'tcx>
183183

184184
[] fn typeck_tables_of: TypeckTables(DefId) -> &'tcx ty::TypeckTables<'tcx>,
185185

186+
[] fn used_trait_imports: UsedTraitImports(DefId) -> Rc<DefIdSet>,
187+
186188
[] fn has_typeck_tables: HasTypeckTables(DefId) -> bool,
187189

188190
[] fn coherent_trait: coherent_trait_dep_node((CrateNum, DefId)) -> (),

src/librustc/ty/maps/plumbing.rs

+1
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,7 @@ pub fn force_from_dep_node<'a, 'gcx, 'lcx>(tcx: TyCtxt<'a, 'gcx, 'lcx>,
754754
DepKind::InherentImpls => { force!(inherent_impls, def_id!()); }
755755
DepKind::TypeckBodiesKrate => { force!(typeck_item_bodies, LOCAL_CRATE); }
756756
DepKind::TypeckTables => { force!(typeck_tables_of, def_id!()); }
757+
DepKind::UsedTraitImports => { force!(used_trait_imports, def_id!()); }
757758
DepKind::HasTypeckTables => { force!(has_typeck_tables, def_id!()); }
758759
DepKind::SymbolName => { force!(def_symbol_name, def_id!()); }
759760
DepKind::SpecializationGraph => { force!(specialization_graph_of, def_id!()); }

src/librustc_typeck/check/method/mod.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ use syntax_pos::Span;
2525

2626
use rustc::hir;
2727

28+
use std::rc::Rc;
29+
2830
pub use self::MethodError::*;
2931
pub use self::CandidateSource::*;
3032

@@ -163,7 +165,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
163165
if let Some(import_id) = pick.import_id {
164166
let import_def_id = self.tcx.hir.local_def_id(import_id);
165167
debug!("used_trait_import: {:?}", import_def_id);
166-
self.tables.borrow_mut().used_trait_imports.insert(import_def_id);
168+
Rc::get_mut(&mut self.tables.borrow_mut().used_trait_imports)
169+
.unwrap().insert(import_def_id);
167170
}
168171

169172
self.tcx.check_stability(pick.item.def_id, call_expr.id, span);
@@ -361,7 +364,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
361364
if let Some(import_id) = pick.import_id {
362365
let import_def_id = self.tcx.hir.local_def_id(import_id);
363366
debug!("used_trait_import: {:?}", import_def_id);
364-
self.tables.borrow_mut().used_trait_imports.insert(import_def_id);
367+
Rc::get_mut(&mut self.tables.borrow_mut().used_trait_imports)
368+
.unwrap().insert(import_def_id);
365369
}
366370

367371
let def = pick.item.def();

src/librustc_typeck/check/mod.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,10 @@ use session::{CompileIncomplete, Session};
106106
use TypeAndSubsts;
107107
use lint;
108108
use util::common::{ErrorReported, indenter};
109-
use util::nodemap::{DefIdMap, FxHashMap, NodeMap};
109+
use util::nodemap::{DefIdMap, DefIdSet, FxHashMap, NodeMap};
110110

111111
use std::cell::{Cell, RefCell, Ref, RefMut};
112+
use std::rc::Rc;
112113
use std::collections::hash_map::Entry;
113114
use std::cmp;
114115
use std::fmt::Display;
@@ -742,6 +743,7 @@ pub fn provide(providers: &mut Providers) {
742743
closure_kind,
743744
generator_sig,
744745
adt_destructor,
746+
used_trait_imports,
745747
..*providers
746748
};
747749
}
@@ -845,6 +847,12 @@ fn has_typeck_tables<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
845847
primary_body_of(tcx, id).is_some()
846848
}
847849

850+
fn used_trait_imports<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
851+
def_id: DefId)
852+
-> Rc<DefIdSet> {
853+
tcx.typeck_tables_of(def_id).used_trait_imports.clone()
854+
}
855+
848856
fn typeck_tables_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
849857
def_id: DefId)
850858
-> &'tcx ty::TypeckTables<'tcx> {

src/librustc_typeck/check/writeback.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use rustc::util::nodemap::DefIdSet;
2323
use syntax::ast;
2424
use syntax_pos::Span;
2525
use std::mem;
26+
use std::rc::Rc;
2627

2728
///////////////////////////////////////////////////////////////////////////
2829
// Entry point
@@ -49,7 +50,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
4950
wbcx.visit_generator_interiors();
5051

5152
let used_trait_imports = mem::replace(&mut self.tables.borrow_mut().used_trait_imports,
52-
DefIdSet());
53+
Rc::new(DefIdSet()));
5354
debug!("used_trait_imports({:?}) = {:?}", item_def_id, used_trait_imports);
5455
wbcx.tables.used_trait_imports = used_trait_imports;
5556

src/librustc_typeck/check_unused.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,9 @@ pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
6666
let mut used_trait_imports = DefIdSet();
6767
for &body_id in tcx.hir.krate().bodies.keys() {
6868
let item_def_id = tcx.hir.body_owner_def_id(body_id);
69-
let tables = tcx.typeck_tables_of(item_def_id);
70-
let imports = &tables.used_trait_imports;
69+
let imports = tcx.used_trait_imports(item_def_id);
7170
debug!("GatherVisitor: item_def_id={:?} with imports {:#?}", item_def_id, imports);
72-
used_trait_imports.extend(imports);
71+
used_trait_imports.extend(imports.iter());
7372
}
7473

7574
let mut visitor = CheckVisitor { tcx, used_trait_imports };

0 commit comments

Comments
 (0)