Add cycle errors to ScrubbedTraitError to remove a couple more calls to new_with_diagnostics
This commit is contained in:
@@ -54,7 +54,7 @@ impl<
|
||||
|
||||
/// Used if you want to have pleasant experience when dealing
|
||||
/// with obligations outside of hir or mir typeck.
|
||||
pub struct ObligationCtxt<'a, 'tcx, E = ScrubbedTraitError> {
|
||||
pub struct ObligationCtxt<'a, 'tcx, E = ScrubbedTraitError<'tcx>> {
|
||||
pub infcx: &'a InferCtxt<'tcx>,
|
||||
engine: RefCell<Box<dyn TraitEngine<'tcx, E>>>,
|
||||
}
|
||||
@@ -65,21 +65,12 @@ impl<'a, 'tcx> ObligationCtxt<'a, 'tcx, FulfillmentError<'tcx>> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx> ObligationCtxt<'a, 'tcx, ScrubbedTraitError> {
|
||||
impl<'a, 'tcx> ObligationCtxt<'a, 'tcx, ScrubbedTraitError<'tcx>> {
|
||||
pub fn new(infcx: &'a InferCtxt<'tcx>) -> Self {
|
||||
Self { infcx, engine: RefCell::new(<dyn TraitEngine<'tcx, _>>::new(infcx)) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx, E> ObligationCtxt<'a, 'tcx, E>
|
||||
where
|
||||
E: FromSolverError<'tcx, NextSolverError<'tcx>> + FromSolverError<'tcx, OldSolverError<'tcx>>,
|
||||
{
|
||||
pub fn new_generic(infcx: &'a InferCtxt<'tcx>) -> Self {
|
||||
Self { infcx, engine: RefCell::new(<dyn TraitEngine<'tcx, _>>::new(infcx)) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx, E> ObligationCtxt<'a, 'tcx, E>
|
||||
where
|
||||
E: FulfillmentErrorLike<'tcx>,
|
||||
|
||||
@@ -856,16 +856,15 @@ impl<'tcx> FromSolverError<'tcx, OldSolverError<'tcx>> for FulfillmentError<'tcx
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> FromSolverError<'tcx, OldSolverError<'tcx>> for ScrubbedTraitError {
|
||||
impl<'tcx> FromSolverError<'tcx, OldSolverError<'tcx>> for ScrubbedTraitError<'tcx> {
|
||||
fn from_solver_error(_infcx: &InferCtxt<'tcx>, error: OldSolverError<'tcx>) -> Self {
|
||||
match error.error {
|
||||
FulfillmentErrorCode::Select(_)
|
||||
| FulfillmentErrorCode::Project(_)
|
||||
| FulfillmentErrorCode::Subtype(_, _)
|
||||
| FulfillmentErrorCode::ConstEquate(_, _) => ScrubbedTraitError::TrueError,
|
||||
FulfillmentErrorCode::Cycle(_) | FulfillmentErrorCode::Ambiguity { overflow: _ } => {
|
||||
ScrubbedTraitError::Ambiguity
|
||||
}
|
||||
FulfillmentErrorCode::Ambiguity { overflow: _ } => ScrubbedTraitError::Ambiguity,
|
||||
FulfillmentErrorCode::Cycle(cycle) => ScrubbedTraitError::Cycle(cycle),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,24 +77,26 @@ pub use rustc_infer::traits::*;
|
||||
/// error itself (except for if it's an ambiguity or true error).
|
||||
///
|
||||
/// use [`ObligationCtxt::new_with_diagnostics`] to get a [`FulfillmentError`].
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub enum ScrubbedTraitError {
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum ScrubbedTraitError<'tcx> {
|
||||
/// A real error. This goal definitely does not hold.
|
||||
TrueError,
|
||||
/// An ambiguity. This goal may hold if further inference is done.
|
||||
Ambiguity,
|
||||
/// An old-solver-style cycle error, which will fatal.
|
||||
Cycle(Vec<PredicateObligation<'tcx>>),
|
||||
}
|
||||
|
||||
impl ScrubbedTraitError {
|
||||
impl<'tcx> ScrubbedTraitError<'tcx> {
|
||||
fn is_true_error(&self) -> bool {
|
||||
match self {
|
||||
ScrubbedTraitError::TrueError => true,
|
||||
ScrubbedTraitError::Ambiguity => false,
|
||||
ScrubbedTraitError::Ambiguity | ScrubbedTraitError::Cycle(_) => false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> FulfillmentErrorLike<'tcx> for ScrubbedTraitError {
|
||||
impl<'tcx> FulfillmentErrorLike<'tcx> for ScrubbedTraitError<'tcx> {
|
||||
fn is_true_error(&self) -> bool {
|
||||
self.is_true_error()
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ impl<'cx, 'tcx> At<'cx, 'tcx> {
|
||||
};
|
||||
|
||||
if self.infcx.next_trait_solver() {
|
||||
match crate::solve::deeply_normalize_with_skipped_universes::<_, ScrubbedTraitError>(
|
||||
match crate::solve::deeply_normalize_with_skipped_universes::<_, ScrubbedTraitError<'tcx>>(
|
||||
self, value, universes,
|
||||
) {
|
||||
Ok(value) => return Ok(Normalized { value, obligations: vec![] }),
|
||||
|
||||
@@ -267,7 +267,7 @@ pub fn compute_implied_outlives_bounds_compat_inner<'tcx>(
|
||||
ocx.infcx.at(&ObligationCause::dummy(), param_env),
|
||||
ty_a,
|
||||
)
|
||||
.map_err(|_errs: Vec<ScrubbedTraitError>| NoSolution)?;
|
||||
.map_err(|_errs: Vec<ScrubbedTraitError<'tcx>>| NoSolution)?;
|
||||
}
|
||||
let mut components = smallvec![];
|
||||
push_outlives_components(tcx, ty_a, &mut components);
|
||||
|
||||
Reference in New Issue
Block a user