Skip to content

Commit

Permalink
Rollup merge of #106705 - compiler-errors:new-solver-err-properly, r=…
Browse files Browse the repository at this point in the history
…lcnr

Report fulfillment errors in new trait solver

Causes fewer ICEs when testing the new solver 😄
  • Loading branch information
matthiaskrgr authored Jan 11, 2023
2 parents 90f9c68 + 104ec48 commit 865d83e
Showing 1 changed file with 25 additions and 11 deletions.
36 changes: 25 additions & 11 deletions compiler/rustc_trait_selection/src/solve/fulfill.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ use std::mem;
use rustc_data_structures::fx::FxHashMap;
use rustc_infer::{
infer::InferCtxt,
traits::{query::NoSolution, FulfillmentError, PredicateObligation, TraitEngine},
traits::{
query::NoSolution, FulfillmentError, FulfillmentErrorCode, PredicateObligation,
SelectionError, TraitEngine,
},
};
use rustc_middle::ty;

Expand Down Expand Up @@ -45,32 +48,43 @@ impl<'tcx> TraitEngine<'tcx> for FulfillmentCtxt<'tcx> {
return errors;
}

if self.obligations.is_empty() {
Vec::new()
} else {
unimplemented!("ambiguous obligations")
}
self.obligations
.drain(..)
.map(|obligation| FulfillmentError {
obligation: obligation.clone(),
code: FulfillmentErrorCode::CodeSelectionError(SelectionError::Unimplemented),
root_obligation: obligation,
})
.collect()
}

fn select_where_possible(&mut self, infcx: &InferCtxt<'tcx>) -> Vec<FulfillmentError<'tcx>> {
let errors = Vec::new();
let mut errors = Vec::new();
for i in 0.. {
if !infcx.tcx.recursion_limit().value_within_limit(i) {
unimplemented!("overflow")
}

let mut has_changed = false;
for o in mem::take(&mut self.obligations) {
for obligation in mem::take(&mut self.obligations) {
let mut cx = EvalCtxt::new(infcx.tcx);
let (changed, certainty) = match cx.evaluate_goal(infcx, o.clone().into()) {
let (changed, certainty) = match cx.evaluate_goal(infcx, obligation.clone().into())
{
Ok(result) => result,
Err(NoSolution) => unimplemented!("error"),
Err(NoSolution) => {
errors.push(FulfillmentError {
obligation: obligation.clone(),
code: FulfillmentErrorCode::CodeAmbiguity,
root_obligation: obligation,
});
continue;
}
};

has_changed |= changed;
match certainty {
Certainty::Yes => {}
Certainty::Maybe(_) => self.obligations.push(o),
Certainty::Maybe(_) => self.obligations.push(obligation),
}
}

Expand Down

0 comments on commit 865d83e

Please sign in to comment.