[] InherentImpls(DefId),
[] TypeckBodiesKrate,
[] TypeckTables(DefId),
+ [] UsedTraitImports(DefId),
[] HasTypeckTables(DefId),
[] ConstEval { param_env: ParamEnvAnd<'tcx, (DefId, &'tcx Substs<'tcx>)> },
[] SymbolName(DefId),
cast_kinds: ItemLocalMap<ty::cast::CastKind>,
/// Set of trait imports actually used in the method resolution.
- /// This is used for warning unused imports.
- pub used_trait_imports: Rc<RefCell<DefIdSet>>,
+ /// This is used for warning unused imports. During type
+ /// checking, this field should not be cloned.
+ pub used_trait_imports: Rc<DefIdSet>,
/// If any errors occurred while type-checking this body,
/// this field will be set to `true`.
liberated_fn_sigs: ItemLocalMap(),
fru_field_types: ItemLocalMap(),
cast_kinds: ItemLocalMap(),
- used_trait_imports: Rc::new(RefCell::new(DefIdSet())),
+ used_trait_imports: Rc::new(DefIdSet()),
tainted_by_errors: false,
free_region_map: FreeRegionMap::new(),
}
cast_kinds.hash_stable(hcx, hasher);
generator_sigs.hash_stable(hcx, hasher);
generator_interiors.hash_stable(hcx, hasher);
- used_trait_imports.borrow_mut().hash_stable(hcx, hasher);
+ used_trait_imports.hash_stable(hcx, hasher);
tainted_by_errors.hash_stable(hcx, hasher);
free_region_map.hash_stable(hcx, hasher);
})
[] fn typeck_tables_of: TypeckTables(DefId) -> &'tcx ty::TypeckTables<'tcx>,
+ [] fn used_trait_imports: UsedTraitImports(DefId) -> Rc<DefIdSet>,
+
[] fn has_typeck_tables: HasTypeckTables(DefId) -> bool,
[] fn coherent_trait: coherent_trait_dep_node((CrateNum, DefId)) -> (),
DepKind::InherentImpls => { force!(inherent_impls, def_id!()); }
DepKind::TypeckBodiesKrate => { force!(typeck_item_bodies, LOCAL_CRATE); }
DepKind::TypeckTables => { force!(typeck_tables_of, def_id!()); }
+ DepKind::UsedTraitImports => { force!(used_trait_imports, def_id!()); }
DepKind::HasTypeckTables => { force!(has_typeck_tables, def_id!()); }
DepKind::SymbolName => { force!(def_symbol_name, def_id!()); }
DepKind::SpecializationGraph => { force!(specialization_graph_of, def_id!()); }
use rustc::hir;
+use std::rc::Rc;
+
pub use self::MethodError::*;
pub use self::CandidateSource::*;
if let Some(import_id) = pick.import_id {
let import_def_id = self.tcx.hir.local_def_id(import_id);
debug!("used_trait_import: {:?}", import_def_id);
-
- let tables = self.tables.borrow_mut();
- let mut ut = tables.used_trait_imports.borrow_mut();
- ut.insert(import_def_id);
+ Rc::get_mut(&mut self.tables.borrow_mut().used_trait_imports)
+ .unwrap().insert(import_def_id);
}
self.tcx.check_stability(pick.item.def_id, call_expr.id, span);
if let Some(import_id) = pick.import_id {
let import_def_id = self.tcx.hir.local_def_id(import_id);
debug!("used_trait_import: {:?}", import_def_id);
- let tables = self.tables.borrow_mut();
- let mut ut = tables.used_trait_imports.borrow_mut();
- ut.insert(import_def_id);
+ Rc::get_mut(&mut self.tables.borrow_mut().used_trait_imports)
+ .unwrap().insert(import_def_id);
}
let def = pick.item.def();
closure_kind,
generator_sig,
adt_destructor,
+ used_trait_imports,
..*providers
};
}
primary_body_of(tcx, id).is_some()
}
+fn used_trait_imports<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
+ def_id: DefId)
+ -> Rc<DefIdSet> {
+ Rc::clone(&tcx.typeck_tables_of(def_id).used_trait_imports)
+}
+
fn typeck_tables_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
def_id: DefId)
-> &'tcx ty::TypeckTables<'tcx> {
tables
}
-pub fn get_used_trait_imports<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
- def_id: DefId)
- -> Rc<RefCell<DefIdSet>> {
- Rc::clone(&tcx.typeck_tables_of(def_id).used_trait_imports)
-}
-
fn check_abi<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, span: Span, abi: Abi) {
if !tcx.sess.target.target.is_abi_supported(abi) {
struct_span_err!(tcx.sess, span, E0570,
use syntax_pos::Span;
use std::mem;
use std::rc::Rc;
-use std::cell::RefCell;
///////////////////////////////////////////////////////////////////////////
// Entry point
wbcx.visit_generator_interiors();
let used_trait_imports = mem::replace(&mut self.tables.borrow_mut().used_trait_imports,
- Rc::new(RefCell::new(DefIdSet())));
+ Rc::new(DefIdSet()));
debug!("used_trait_imports({:?}) = {:?}", item_def_id, used_trait_imports);
wbcx.tables.used_trait_imports = used_trait_imports;
use rustc::hir;
use rustc::util::nodemap::DefIdSet;
-use check::get_used_trait_imports;
-
struct CheckVisitor<'a, 'tcx: 'a> {
tcx: TyCtxt<'a, 'tcx, 'tcx>,
used_trait_imports: DefIdSet,
let mut used_trait_imports = DefIdSet();
for &body_id in tcx.hir.krate().bodies.keys() {
let item_def_id = tcx.hir.body_owner_def_id(body_id);
- let imports = get_used_trait_imports(tcx, item_def_id);
+ // let tables = tcx.typeck_tables_of(item_def_id);
+ let imports = tcx.used_trait_imports(item_def_id);
debug!("GatherVisitor: item_def_id={:?} with imports {:#?}", item_def_id, imports);
- used_trait_imports.extend(imports.borrow().iter());
+ used_trait_imports.extend(imports.iter());
}
let mut visitor = CheckVisitor { tcx, used_trait_imports };