parent
1143eb26a2
commit
3ac976861d
4 changed files with 41 additions and 12 deletions
|
@ -597,7 +597,7 @@ pub fn normalize_and_test_predicates<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
debug!("normalize_and_test_predicates(predicates={:?})",
|
debug!("normalize_and_test_predicates(predicates={:?})",
|
||||||
predicates);
|
predicates);
|
||||||
|
|
||||||
tcx.infer_ctxt().enter(|infcx| {
|
let result = tcx.infer_ctxt().enter(|infcx| {
|
||||||
let param_env = ty::ParamEnv::empty(Reveal::All);
|
let param_env = ty::ParamEnv::empty(Reveal::All);
|
||||||
let mut selcx = SelectionContext::new(&infcx);
|
let mut selcx = SelectionContext::new(&infcx);
|
||||||
let mut fulfill_cx = FulfillmentContext::new();
|
let mut fulfill_cx = FulfillmentContext::new();
|
||||||
|
@ -613,7 +613,10 @@ pub fn normalize_and_test_predicates<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fulfill_cx.select_all_or_error(&infcx).is_ok()
|
fulfill_cx.select_all_or_error(&infcx).is_ok()
|
||||||
})
|
});
|
||||||
|
debug!("normalize_and_test_predicates(predicates={:?}) = {:?}",
|
||||||
|
predicates, result);
|
||||||
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Given a trait `trait_ref`, iterates the vtable entries
|
/// Given a trait `trait_ref`, iterates the vtable entries
|
||||||
|
|
|
@ -195,7 +195,7 @@ use rustc::hir::map as hir_map;
|
||||||
use rustc::hir::def_id::DefId;
|
use rustc::hir::def_id::DefId;
|
||||||
use rustc::middle::lang_items::{ExchangeMallocFnLangItem};
|
use rustc::middle::lang_items::{ExchangeMallocFnLangItem};
|
||||||
use rustc::traits;
|
use rustc::traits;
|
||||||
use rustc::ty::subst::{Substs, Subst};
|
use rustc::ty::subst::Substs;
|
||||||
use rustc::ty::{self, TypeFoldable, TyCtxt};
|
use rustc::ty::{self, TypeFoldable, TyCtxt};
|
||||||
use rustc::ty::adjustment::CustomCoerceUnsized;
|
use rustc::ty::adjustment::CustomCoerceUnsized;
|
||||||
use rustc::mir::{self, Location};
|
use rustc::mir::{self, Location};
|
||||||
|
@ -304,6 +304,7 @@ fn collect_roots<'a, 'tcx>(scx: &SharedCrateContext<'a, 'tcx>,
|
||||||
scx.tcx().hir.krate().visit_all_item_likes(&mut visitor);
|
scx.tcx().hir.krate().visit_all_item_likes(&mut visitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
roots.retain(|root| root.is_instantiable(scx.tcx()));
|
||||||
roots
|
roots
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -937,14 +938,9 @@ fn create_trans_items_for_default_impls<'a, 'tcx>(scx: &SharedCrateContext<'a, '
|
||||||
let instance =
|
let instance =
|
||||||
monomorphize::resolve(scx, method.def_id, callee_substs);
|
monomorphize::resolve(scx, method.def_id, callee_substs);
|
||||||
|
|
||||||
let predicates = tcx.predicates_of(instance.def_id()).predicates
|
let trans_item = create_fn_trans_item(instance);
|
||||||
.subst(tcx, instance.substs);
|
if trans_item.is_instantiable(tcx) && should_trans_locally(tcx, &instance) {
|
||||||
if !traits::normalize_and_test_predicates(tcx, predicates) {
|
output.push(trans_item);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if should_trans_locally(tcx, &instance) {
|
|
||||||
output.push(create_fn_trans_item(instance));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,8 +25,9 @@ use llvm;
|
||||||
use monomorphize::Instance;
|
use monomorphize::Instance;
|
||||||
use rustc::hir;
|
use rustc::hir;
|
||||||
use rustc::hir::def_id::DefId;
|
use rustc::hir::def_id::DefId;
|
||||||
|
use rustc::traits;
|
||||||
use rustc::ty::{self, Ty, TyCtxt, TypeFoldable};
|
use rustc::ty::{self, Ty, TyCtxt, TypeFoldable};
|
||||||
use rustc::ty::subst::Substs;
|
use rustc::ty::subst::{Subst, Substs};
|
||||||
use syntax::ast::{self, NodeId};
|
use syntax::ast::{self, NodeId};
|
||||||
use syntax::attr;
|
use syntax::attr;
|
||||||
use syntax_pos::Span;
|
use syntax_pos::Span;
|
||||||
|
@ -250,6 +251,21 @@ impl<'a, 'tcx> TransItem<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns whether this instance is instantiable - whether it has no unsatisfied
|
||||||
|
/// predicates.
|
||||||
|
pub fn is_instantiable(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>) -> bool {
|
||||||
|
debug!("is_instantiable({:?})", self);
|
||||||
|
let (def_id, substs) = match *self {
|
||||||
|
TransItem::Fn(ref instance) => (instance.def_id(), instance.substs),
|
||||||
|
TransItem::Static(node_id) => (tcx.hir.local_def_id(node_id), Substs::empty()),
|
||||||
|
// global asm never has predicates
|
||||||
|
TransItem::GlobalAsm(..) => return true
|
||||||
|
};
|
||||||
|
|
||||||
|
let predicates = tcx.predicates_of(def_id).predicates.subst(tcx, substs);
|
||||||
|
traits::normalize_and_test_predicates(tcx, predicates)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn to_string(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>) -> String {
|
pub fn to_string(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>) -> String {
|
||||||
let hir_map = &tcx.hir;
|
let hir_map = &tcx.hir;
|
||||||
|
|
||||||
|
|
14
src/test/run-pass/issue-37725.rs
Normal file
14
src/test/run-pass/issue-37725.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||||
|
// file at the top-level directory of this distribution and at
|
||||||
|
// http://rust-lang.org/COPYRIGHT.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||||
|
// option. This file may not be copied, modified, or distributed
|
||||||
|
// except according to those terms.
|
||||||
|
|
||||||
|
pub fn foo<'a>(s: &'a mut ()) where &'a mut (): Clone {
|
||||||
|
s.clone();
|
||||||
|
}
|
||||||
|
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue