Skip to content

Commit 3fa3fe0

Browse files
committed
Fix ICE
1 parent f7964ae commit 3fa3fe0

File tree

8 files changed

+54
-2
lines changed

8 files changed

+54
-2
lines changed

src/librustc/dep_graph/dep_node.rs

+2
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,8 @@ define_dep_nodes!( <'tcx>
570570
[] MissingExternCrateItem(CrateNum),
571571
[] UsedCrateSource(CrateNum),
572572
[] PostorderCnums,
573+
[] HasCloneClosures(CrateNum),
574+
[] HasCopyClosures(CrateNum),
573575

574576
[] Freevars(DefId),
575577
[] MaybeUnusedTraitImport(DefId),

src/librustc/traits/select.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -2087,10 +2087,10 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
20872087
let trait_id = obligation.predicate.def_id();
20882088
let copy_closures =
20892089
Some(trait_id) == self.tcx().lang_items().copy_trait() &&
2090-
self.tcx().sess.features.borrow().copy_closures;
2090+
self.tcx().has_copy_closures(def_id.krate);
20912091
let clone_closures =
20922092
Some(trait_id) == self.tcx().lang_items().clone_trait() &&
2093-
self.tcx().sess.features.borrow().clone_closures;
2093+
self.tcx().has_clone_closures(def_id.krate);
20942094

20952095
if copy_closures || clone_closures {
20962096
Where(ty::Binder(substs.upvar_tys(def_id, self.tcx()).collect()))

src/librustc/ty/context.rs

+8
Original file line numberDiff line numberDiff line change
@@ -2247,4 +2247,12 @@ pub fn provide(providers: &mut ty::maps::Providers) {
22472247
assert_eq!(cnum, LOCAL_CRATE);
22482248
tcx.output_filenames.clone()
22492249
};
2250+
providers.has_copy_closures = |tcx, cnum| {
2251+
assert_eq!(cnum, LOCAL_CRATE);
2252+
tcx.sess.features.borrow().copy_closures
2253+
};
2254+
providers.has_clone_closures = |tcx, cnum| {
2255+
assert_eq!(cnum, LOCAL_CRATE);
2256+
tcx.sess.features.borrow().clone_closures
2257+
};
22502258
}

src/librustc/ty/maps/config.rs

+12
Original file line numberDiff line numberDiff line change
@@ -490,3 +490,15 @@ impl<'tcx> QueryDescription for queries::output_filenames<'tcx> {
490490
format!("output_filenames")
491491
}
492492
}
493+
494+
impl<'tcx> QueryDescription for queries::has_clone_closures<'tcx> {
495+
fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
496+
format!("seeing if the crate has enabled `Clone` closures")
497+
}
498+
}
499+
500+
impl<'tcx> QueryDescription for queries::has_copy_closures<'tcx> {
501+
fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
502+
format!("seeing if the crate has enabled `Copy` closures")
503+
}
504+
}

src/librustc/ty/maps/mod.rs

+3
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,9 @@ define_maps! { <'tcx>
326326
[] fn compile_codegen_unit: CompileCodegenUnit(InternedString) -> Stats,
327327
[] fn output_filenames: output_filenames_node(CrateNum)
328328
-> Arc<OutputFilenames>,
329+
330+
[] fn has_copy_closures: HasCopyClosures(CrateNum) -> bool,
331+
[] fn has_clone_closures: HasCloneClosures(CrateNum) -> bool,
329332
}
330333

331334
//////////////////////////////////////////////////////////////////////

src/librustc_metadata/cstore.rs

+10
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,16 @@ impl CrateMetadata {
218218
attr::contains_name(&attrs, "no_builtins")
219219
}
220220

221+
pub fn has_copy_closures(&self) -> bool {
222+
let attrs = self.get_item_attrs(CRATE_DEF_INDEX);
223+
attr::contains_feature_attr(&attrs, "copy_closures")
224+
}
225+
226+
pub fn has_clone_closures(&self) -> bool {
227+
let attrs = self.get_item_attrs(CRATE_DEF_INDEX);
228+
attr::contains_feature_attr(&attrs, "clone_closures")
229+
}
230+
221231
pub fn panic_strategy(&self) -> PanicStrategy {
222232
self.root.panic_strategy.clone()
223233
}

src/librustc_metadata/cstore_impl.rs

+3
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,9 @@ provide! { <'tcx> tcx, def_id, other, cdata,
231231
}
232232

233233
used_crate_source => { Rc::new(cdata.source.clone()) }
234+
235+
has_copy_closures => { cdata.has_copy_closures() }
236+
has_clone_closures => { cdata.has_clone_closures() }
234237
}
235238

236239
pub fn provide_local<'tcx>(providers: &mut Providers<'tcx>) {

src/libsyntax/attr.rs

+14
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,20 @@ pub fn first_attr_value_str_by_name(attrs: &[Attribute], name: &str) -> Option<S
500500
.and_then(|at| at.value_str())
501501
}
502502

503+
/// Check if `attrs` contains an attribute like `#![feature(feature_name)]`.
504+
/// This will not perform any "sanity checks" on the form of the attributes.
505+
pub fn contains_feature_attr(attrs: &[Attribute], feature_name: &str) -> bool {
506+
attrs.iter().any(|item| {
507+
item.check_name("feature") &&
508+
item.meta_item_list().map(|list| {
509+
list.iter().any(|mi| {
510+
mi.word().map(|w| w.name() == feature_name)
511+
.unwrap_or(false)
512+
})
513+
}).unwrap_or(false)
514+
})
515+
}
516+
503517
/* Higher-level applications */
504518

505519
pub fn find_crate_name(attrs: &[Attribute]) -> Option<Symbol> {

0 commit comments

Comments
 (0)