Auto merge of #90700 - fee1-dead:select-returns-vec, r=davidtwco
Make `select_*` methods return `Vec` for `TraitEngine` This reduces some complexity as an empty vec means no errors and non-empty vec means errors occurred.
This commit is contained in:
commit
eee8b9c7ba
25 changed files with 146 additions and 140 deletions
|
@ -663,8 +663,9 @@ fn check_opaque_meets_bounds<'tcx>(
|
|||
|
||||
// Check that all obligations are satisfied by the implementation's
|
||||
// version.
|
||||
if let Err(ref errors) = inh.fulfillment_cx.borrow_mut().select_all_or_error(&infcx) {
|
||||
infcx.report_fulfillment_errors(errors, None, false);
|
||||
let errors = inh.fulfillment_cx.borrow_mut().select_all_or_error(&infcx);
|
||||
if !errors.is_empty() {
|
||||
infcx.report_fulfillment_errors(&errors, None, false);
|
||||
}
|
||||
|
||||
// Finally, resolve all regions. This catches wily misuses of
|
||||
|
|
|
@ -950,7 +950,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
};
|
||||
let mut fcx = traits::FulfillmentContext::new_in_snapshot();
|
||||
fcx.register_predicate_obligations(self, ok.obligations);
|
||||
fcx.select_where_possible(&self).is_ok()
|
||||
fcx.select_where_possible(&self).is_empty()
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -391,8 +391,9 @@ fn compare_predicate_entailment<'tcx>(
|
|||
|
||||
// Check that all obligations are satisfied by the implementation's
|
||||
// version.
|
||||
if let Err(ref errors) = inh.fulfillment_cx.borrow_mut().select_all_or_error(&infcx) {
|
||||
infcx.report_fulfillment_errors(errors, None, false);
|
||||
let errors = inh.fulfillment_cx.borrow_mut().select_all_or_error(&infcx);
|
||||
if !errors.is_empty() {
|
||||
infcx.report_fulfillment_errors(&errors, None, false);
|
||||
return Err(ErrorReported);
|
||||
}
|
||||
|
||||
|
@ -1094,8 +1095,9 @@ crate fn compare_const_impl<'tcx>(
|
|||
|
||||
// Check that all obligations are satisfied by the implementation's
|
||||
// version.
|
||||
if let Err(ref errors) = inh.fulfillment_cx.borrow_mut().select_all_or_error(&infcx) {
|
||||
infcx.report_fulfillment_errors(errors, None, false);
|
||||
let errors = inh.fulfillment_cx.borrow_mut().select_all_or_error(&infcx);
|
||||
if !errors.is_empty() {
|
||||
infcx.report_fulfillment_errors(&errors, None, false);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1210,8 +1212,9 @@ fn compare_type_predicate_entailment<'tcx>(
|
|||
|
||||
// Check that all obligations are satisfied by the implementation's
|
||||
// version.
|
||||
if let Err(ref errors) = inh.fulfillment_cx.borrow_mut().select_all_or_error(&infcx) {
|
||||
infcx.report_fulfillment_errors(errors, None, false);
|
||||
let errors = inh.fulfillment_cx.borrow_mut().select_all_or_error(&infcx);
|
||||
if !errors.is_empty() {
|
||||
infcx.report_fulfillment_errors(&errors, None, false);
|
||||
return Err(ErrorReported);
|
||||
}
|
||||
|
||||
|
@ -1427,10 +1430,10 @@ pub fn check_type_bounds<'tcx>(
|
|||
|
||||
// Check that all obligations are satisfied by the implementation's
|
||||
// version.
|
||||
if let Err(ref errors) =
|
||||
inh.fulfillment_cx.borrow_mut().select_all_with_constness_or_error(&infcx, constness)
|
||||
{
|
||||
infcx.report_fulfillment_errors(errors, None, false);
|
||||
let errors =
|
||||
inh.fulfillment_cx.borrow_mut().select_all_with_constness_or_error(&infcx, constness);
|
||||
if !errors.is_empty() {
|
||||
infcx.report_fulfillment_errors(&errors, None, false);
|
||||
return Err(ErrorReported);
|
||||
}
|
||||
|
||||
|
|
|
@ -113,9 +113,10 @@ fn ensure_drop_params_and_item_params_correspond<'tcx>(
|
|||
}
|
||||
}
|
||||
|
||||
if let Err(ref errors) = fulfillment_cx.select_all_or_error(&infcx) {
|
||||
let errors = fulfillment_cx.select_all_or_error(&infcx);
|
||||
if !errors.is_empty() {
|
||||
// this could be reached when we get lazy normalization
|
||||
infcx.report_fulfillment_errors(errors, None, false);
|
||||
infcx.report_fulfillment_errors(&errors, None, false);
|
||||
return Err(ErrorReported);
|
||||
}
|
||||
|
||||
|
|
|
@ -642,11 +642,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
|
||||
#[instrument(skip(self), level = "debug")]
|
||||
pub(in super::super) fn select_all_obligations_or_error(&self) {
|
||||
if let Err(errors) = self
|
||||
let errors = self
|
||||
.fulfillment_cx
|
||||
.borrow_mut()
|
||||
.select_all_with_constness_or_error(&self, self.inh.constness)
|
||||
{
|
||||
.select_all_with_constness_or_error(&self, self.inh.constness);
|
||||
|
||||
if !errors.is_empty() {
|
||||
self.report_fulfillment_errors(&errors, self.inh.body_id, false);
|
||||
}
|
||||
}
|
||||
|
@ -657,13 +658,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
fallback_has_occurred: bool,
|
||||
mutate_fulfillment_errors: impl Fn(&mut Vec<traits::FulfillmentError<'tcx>>),
|
||||
) {
|
||||
let result = self
|
||||
let mut result = self
|
||||
.fulfillment_cx
|
||||
.borrow_mut()
|
||||
.select_with_constness_where_possible(self, self.inh.constness);
|
||||
if let Err(mut errors) = result {
|
||||
mutate_fulfillment_errors(&mut errors);
|
||||
self.report_fulfillment_errors(&errors, self.inh.body_id, fallback_has_occurred);
|
||||
if !result.is_empty() {
|
||||
mutate_fulfillment_errors(&mut result);
|
||||
self.report_fulfillment_errors(&result, self.inh.body_id, fallback_has_occurred);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -793,14 +794,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// we can. We don't care if some things turn
|
||||
// out unconstrained or ambiguous, as we're
|
||||
// just trying to get hints here.
|
||||
self.save_and_restore_in_snapshot_flag(|_| {
|
||||
let errors = self.save_and_restore_in_snapshot_flag(|_| {
|
||||
let mut fulfill = <dyn TraitEngine<'_>>::new(self.tcx);
|
||||
for obligation in ok.obligations {
|
||||
fulfill.register_predicate_obligation(self, obligation);
|
||||
}
|
||||
fulfill.select_where_possible(self)
|
||||
})
|
||||
.map_err(|_| ())?;
|
||||
});
|
||||
|
||||
if !errors.is_empty() {
|
||||
return Err(());
|
||||
}
|
||||
}
|
||||
Err(_) => return Err(()),
|
||||
}
|
||||
|
|
|
@ -826,10 +826,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
self.obligation_for_method(span, trait_did, lhs_ty, Some(other_tys));
|
||||
let mut fulfill = <dyn TraitEngine<'_>>::new(self.tcx);
|
||||
fulfill.register_predicate_obligation(self, obligation);
|
||||
Err(match fulfill.select_where_possible(&self.infcx) {
|
||||
Err(errors) => errors,
|
||||
_ => vec![],
|
||||
})
|
||||
Err(fulfill.select_where_possible(&self.infcx))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -263,7 +263,8 @@ fn visit_implementation_of_dispatch_from_dyn(tcx: TyCtxt<'_>, impl_did: LocalDef
|
|||
}
|
||||
|
||||
// Check that all transitive obligations are satisfied.
|
||||
if let Err(errors) = fulfill_cx.select_all_or_error(&infcx) {
|
||||
let errors = fulfill_cx.select_all_or_error(&infcx);
|
||||
if !errors.is_empty() {
|
||||
infcx.report_fulfillment_errors(&errors, None, false);
|
||||
}
|
||||
|
||||
|
@ -522,7 +523,8 @@ pub fn coerce_unsized_info(tcx: TyCtxt<'tcx>, impl_did: DefId) -> CoerceUnsizedI
|
|||
fulfill_cx.register_predicate_obligation(&infcx, predicate);
|
||||
|
||||
// Check that all transitive obligations are satisfied.
|
||||
if let Err(errors) = fulfill_cx.select_all_or_error(&infcx) {
|
||||
let errors = fulfill_cx.select_all_or_error(&infcx);
|
||||
if !errors.is_empty() {
|
||||
infcx.report_fulfillment_errors(&errors, None, false);
|
||||
}
|
||||
|
||||
|
|
|
@ -88,7 +88,8 @@ fn diagnostic_hir_wf_check<'tcx>(
|
|||
),
|
||||
);
|
||||
|
||||
if let Err(errors) = fulfill.select_all_or_error(&infcx) {
|
||||
let errors = fulfill.select_all_or_error(&infcx);
|
||||
if !errors.is_empty() {
|
||||
tracing::debug!("Wf-check got errors for {:?}: {:?}", ty, errors);
|
||||
for error in errors {
|
||||
if error.obligation.predicate == self.predicate {
|
||||
|
|
|
@ -157,10 +157,10 @@ fn require_same_types<'tcx>(
|
|||
}
|
||||
}
|
||||
|
||||
match fulfill_cx.select_all_or_error(infcx) {
|
||||
Ok(()) => true,
|
||||
Err(errors) => {
|
||||
infcx.report_fulfillment_errors(&errors, None, false);
|
||||
match fulfill_cx.select_all_or_error(infcx).as_slice() {
|
||||
[] => true,
|
||||
errors => {
|
||||
infcx.report_fulfillment_errors(errors, None, false);
|
||||
false
|
||||
}
|
||||
}
|
||||
|
@ -352,8 +352,9 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: DefId) {
|
|||
term_id,
|
||||
cause,
|
||||
);
|
||||
if let Err(err) = fulfillment_cx.select_all_or_error(&infcx) {
|
||||
infcx.report_fulfillment_errors(&err, None, false);
|
||||
let errors = fulfillment_cx.select_all_or_error(&infcx);
|
||||
if !errors.is_empty() {
|
||||
infcx.report_fulfillment_errors(&errors, None, false);
|
||||
error = true;
|
||||
}
|
||||
});
|
||||
|
|
|
@ -83,7 +83,8 @@ impl<'cx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'tcx> {
|
|||
// variables. Process these constraints.
|
||||
let mut fulfill_cx = FulfillmentContext::new();
|
||||
fulfill_cx.register_predicate_obligations(self, result.obligations);
|
||||
if fulfill_cx.select_all_or_error(self).is_err() {
|
||||
let errors = fulfill_cx.select_all_or_error(self);
|
||||
if !errors.is_empty() {
|
||||
self.tcx.sess.delay_span_bug(
|
||||
span,
|
||||
"implied_outlives_bounds failed to solve obligations from instantiation",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue