register infer-ok obligations properly
Or at least, more properly. I think I left one or two FIXMEs still in there. cc #32730
This commit is contained in:
parent
19c1a47713
commit
48dc6e26ca
13 changed files with 91 additions and 121 deletions
|
|
@ -8,8 +8,8 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use super::combine::CombineFields;
|
||||
use super::SubregionOrigin;
|
||||
use super::combine::CombineFields;
|
||||
use super::type_variable::{SubtypeOf, SupertypeOf};
|
||||
|
||||
use ty::{self, Ty, TyCtxt};
|
||||
|
|
@ -117,6 +117,7 @@ impl<'combine, 'infcx, 'gcx, 'tcx> TypeRelation<'infcx, 'gcx, 'tcx>
|
|||
// error messages.
|
||||
let origin = SubregionOrigin::Subtype(self.fields.trace.clone());
|
||||
self.fields.infcx.region_vars.make_subregion(origin, a, b);
|
||||
|
||||
Ok(a)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -520,10 +520,8 @@ fn process_predicate<'a, 'gcx, 'tcx>(
|
|||
|
||||
ty::Predicate::Equate(ref binder) => {
|
||||
match selcx.infcx().equality_predicate(&obligation.cause, binder) {
|
||||
Ok(InferOk { obligations, .. }) => {
|
||||
// FIXME(#32730) propagate obligations
|
||||
assert!(obligations.is_empty());
|
||||
Ok(Some(Vec::new()))
|
||||
Ok(InferOk { obligations, value: () }) => {
|
||||
Ok(Some(obligations))
|
||||
},
|
||||
Err(_) => Err(CodeSelectionError(Unimplemented)),
|
||||
}
|
||||
|
|
|
|||
|
|
@ -210,9 +210,7 @@ fn project_and_unify_type<'cx, 'gcx, 'tcx>(
|
|||
|
||||
let infcx = selcx.infcx();
|
||||
match infcx.eq_types(true, &obligation.cause, normalized_ty, obligation.predicate.ty) {
|
||||
Ok(InferOk { obligations: inferred_obligations, .. }) => {
|
||||
// FIXME(#32730) once obligations are generated in inference, drop this assertion
|
||||
assert!(inferred_obligations.is_empty());
|
||||
Ok(InferOk { obligations: inferred_obligations, value: () }) => {
|
||||
obligations.extend(inferred_obligations);
|
||||
Ok(Some(obligations))
|
||||
},
|
||||
|
|
@ -847,9 +845,10 @@ fn assemble_candidates_from_predicates<'cx, 'gcx, 'tcx, I>(
|
|||
obligation.cause.clone(),
|
||||
data_poly_trait_ref,
|
||||
obligation_poly_trait_ref)
|
||||
// FIXME(#32730) once obligations are propagated from unification in
|
||||
// inference, drop this assertion
|
||||
.map(|InferOk { obligations, .. }| assert!(obligations.is_empty()))
|
||||
.map(|InferOk { obligations: _, value: () }| {
|
||||
// FIXME(#32730) -- do we need to take obligations
|
||||
// into account in any way? At the moment, no.
|
||||
})
|
||||
.is_ok()
|
||||
});
|
||||
|
||||
|
|
@ -1184,12 +1183,10 @@ fn confirm_fn_pointer_candidate<'cx, 'gcx, 'tcx>(
|
|||
fn_pointer_vtable: VtableFnPointerData<'tcx, PredicateObligation<'tcx>>)
|
||||
-> Progress<'tcx>
|
||||
{
|
||||
// FIXME(#32730) drop this assertion once obligations are propagated from inference (fn pointer
|
||||
// vtable nested obligations ONLY come from unification in inference)
|
||||
assert!(fn_pointer_vtable.nested.is_empty());
|
||||
let fn_type = selcx.infcx().shallow_resolve(fn_pointer_vtable.fn_ty);
|
||||
let sig = fn_type.fn_sig();
|
||||
confirm_callable_candidate(selcx, obligation, sig, util::TupleArgumentsFlag::Yes)
|
||||
.with_addl_obligations(fn_pointer_vtable.nested)
|
||||
}
|
||||
|
||||
fn confirm_closure_candidate<'cx, 'gcx, 'tcx>(
|
||||
|
|
@ -1266,8 +1263,6 @@ fn confirm_param_env_candidate<'cx, 'gcx, 'tcx>(
|
|||
let trait_ref = obligation.predicate.trait_ref;
|
||||
match infcx.match_poly_projection_predicate(cause, poly_projection, trait_ref) {
|
||||
Ok(InferOk { value: ty_match, obligations }) => {
|
||||
// FIXME(#32730) once obligations are generated in inference, drop this assertion
|
||||
assert!(obligations.is_empty());
|
||||
Progress {
|
||||
ty: ty_match.value,
|
||||
obligations: obligations,
|
||||
|
|
|
|||
|
|
@ -418,9 +418,6 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
|
|||
None => Ok(None),
|
||||
Some(candidate) => {
|
||||
let mut candidate = self.confirm_candidate(obligation, candidate)?;
|
||||
// FIXME(#32730) remove this assertion once inferred obligations are propagated
|
||||
// from inference
|
||||
assert!(self.inferred_obligations.len() == 0);
|
||||
let inferred_obligations = (*self.inferred_obligations).into_iter().cloned();
|
||||
candidate.nested_obligations_mut().extend(inferred_obligations);
|
||||
Ok(Some(candidate))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue