Skip to content

Commit b6d0597

Browse files
authored
Merge pull request #314 from dwrensha/fulfill-obligation
use rustc version of fulfill_obligation now that we can
2 parents 54a1f07 + 8b5f22c commit b6d0597

File tree

1 file changed

+3
-83
lines changed

1 file changed

+3
-83
lines changed

src/librustc_mir/interpret/eval_context.rs

Lines changed: 3 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ use rustc::traits::Reveal;
1010
use rustc::ty::layout::{self, Layout, Size, Align, HasDataLayout};
1111
use rustc::ty::subst::{Subst, Substs, Kind};
1212
use rustc::ty::{self, Ty, TyCtxt, TypeFoldable, Binder};
13-
use rustc::traits;
1413
use rustc_data_structures::indexed_vec::Idx;
15-
use syntax::codemap::{self, DUMMY_SP, Span};
16-
use syntax::ast::{self, Mutability};
14+
use syntax::codemap::{self, DUMMY_SP};
15+
use syntax::ast::Mutability;
1716
use syntax::abi::Abi;
1817

1918
use super::{EvalError, EvalResult, EvalErrorKind, GlobalId, Lvalue, LvalueExtra, Memory,
@@ -2312,7 +2311,7 @@ fn resolve_associated_item<'a, 'tcx>(
23122311
);
23132312

23142313
let trait_ref = ty::TraitRef::from_method(tcx, trait_id, rcvr_substs);
2315-
let vtbl = fulfill_obligation(tcx, DUMMY_SP, ty::Binder(trait_ref));
2314+
let vtbl = tcx.trans_fulfill_obligation(DUMMY_SP, ty::Binder(trait_ref));
23162315

23172316
// Now that we know which impl is being used, we can dispatch to
23182317
// the actual function:
@@ -2419,85 +2418,6 @@ fn type_is_sized<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, ty: Ty<'tcx>) -> bool {
24192418
ty.is_sized(tcx, ty::ParamEnv::empty(Reveal::All), DUMMY_SP)
24202419
}
24212420

2422-
/// Attempts to resolve an obligation. The result is a shallow vtable resolution -- meaning that we
2423-
/// do not (necessarily) resolve all nested obligations on the impl. Note that type check should
2424-
/// guarantee to us that all nested obligations *could be* resolved if we wanted to.
2425-
fn fulfill_obligation<'a, 'tcx>(
2426-
tcx: TyCtxt<'a, 'tcx, 'tcx>,
2427-
span: Span,
2428-
trait_ref: ty::PolyTraitRef<'tcx>,
2429-
) -> traits::Vtable<'tcx, ()> {
2430-
// Remove any references to regions; this helps improve caching.
2431-
let trait_ref = tcx.erase_regions(&trait_ref);
2432-
2433-
debug!(
2434-
"trans::fulfill_obligation(trait_ref={:?}, def_id={:?})",
2435-
trait_ref,
2436-
trait_ref.def_id()
2437-
);
2438-
2439-
// Do the initial selection for the obligation. This yields the
2440-
// shallow result we are looking for -- that is, what specific impl.
2441-
tcx.infer_ctxt().enter(|infcx| {
2442-
let mut selcx = traits::SelectionContext::new(&infcx);
2443-
2444-
let obligation_cause = traits::ObligationCause::misc(span, ast::DUMMY_NODE_ID);
2445-
let obligation = traits::Obligation::new(
2446-
obligation_cause,
2447-
ty::ParamEnv::empty(Reveal::All),
2448-
trait_ref.to_poly_trait_predicate(),
2449-
);
2450-
2451-
let selection = match selcx.select(&obligation) {
2452-
Ok(Some(selection)) => selection,
2453-
Ok(None) => {
2454-
// Ambiguity can happen when monomorphizing during trans
2455-
// expands to some humongo type that never occurred
2456-
// statically -- this humongo type can then overflow,
2457-
// leading to an ambiguous result. So report this as an
2458-
// overflow bug, since I believe this is the only case
2459-
// where ambiguity can result.
2460-
debug!(
2461-
"Encountered ambiguity selecting `{:?}` during trans, \
2462-
presuming due to overflow",
2463-
trait_ref
2464-
);
2465-
tcx.sess.span_fatal(
2466-
span,
2467-
"reached the recursion limit during monomorphization \
2468-
(selection ambiguity)",
2469-
);
2470-
}
2471-
Err(e) => {
2472-
span_bug!(
2473-
span,
2474-
"Encountered error `{:?}` selecting `{:?}` during trans",
2475-
e,
2476-
trait_ref
2477-
)
2478-
}
2479-
};
2480-
2481-
debug!("fulfill_obligation: selection={:?}", selection);
2482-
2483-
// Currently, we use a fulfillment context to completely resolve
2484-
// all nested obligations. This is because they can inform the
2485-
// inference of the impl's type parameters.
2486-
let mut fulfill_cx = traits::FulfillmentContext::new();
2487-
let vtable = selection.map(|predicate| {
2488-
debug!(
2489-
"fulfill_obligation: register_predicate_obligation {:?}",
2490-
predicate
2491-
);
2492-
fulfill_cx.register_predicate_obligation(&infcx, predicate);
2493-
});
2494-
let vtable = infcx.drain_fulfillment_cx_or_panic(span, &mut fulfill_cx, &vtable);
2495-
2496-
debug!("Cache miss: {:?} => {:?}", trait_ref, vtable);
2497-
vtable
2498-
})
2499-
}
2500-
25012421
pub fn resolve_drop_in_place<'a, 'tcx>(
25022422
tcx: TyCtxt<'a, 'tcx, 'tcx>,
25032423
ty: Ty<'tcx>,

0 commit comments

Comments
 (0)