Fixes #37725.
debug!("normalize_and_test_predicates(predicates={:?})",
predicates);
- tcx.infer_ctxt().enter(|infcx| {
+ let result = tcx.infer_ctxt().enter(|infcx| {
let param_env = ty::ParamEnv::empty(Reveal::All);
let mut selcx = SelectionContext::new(&infcx);
let mut fulfill_cx = FulfillmentContext::new();
}
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
use rustc::hir::def_id::DefId;
use rustc::middle::lang_items::{ExchangeMallocFnLangItem};
use rustc::traits;
-use rustc::ty::subst::{Substs, Subst};
+use rustc::ty::subst::Substs;
use rustc::ty::{self, TypeFoldable, TyCtxt};
use rustc::ty::adjustment::CustomCoerceUnsized;
use rustc::mir::{self, Location};
scx.tcx().hir.krate().visit_all_item_likes(&mut visitor);
}
+ roots.retain(|root| root.is_instantiable(scx.tcx()));
roots
}
let instance =
monomorphize::resolve(scx, method.def_id, callee_substs);
- let predicates = tcx.predicates_of(instance.def_id()).predicates
- .subst(tcx, instance.substs);
- if !traits::normalize_and_test_predicates(tcx, predicates) {
- continue;
- }
-
- if should_trans_locally(tcx, &instance) {
- output.push(create_fn_trans_item(instance));
+ let trans_item = create_fn_trans_item(instance);
+ if trans_item.is_instantiable(tcx) && should_trans_locally(tcx, &instance) {
+ output.push(trans_item);
}
}
}
use monomorphize::Instance;
use rustc::hir;
use rustc::hir::def_id::DefId;
+use rustc::traits;
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::attr;
use syntax_pos::Span;
}
}
+ /// 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 {
let hir_map = &tcx.hir;
--- /dev/null
+// 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() {}