mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
EvaluatedToUnknown -> EvaluatedToAmbigStackDependent, EvaluatedToRecur -> EvaluatedToErrStackDependent
This commit is contained in:
parent
f32d29837d
commit
d732c3b756
@ -180,8 +180,8 @@ pub enum SelectionCandidate<'tcx> {
|
||||
///
|
||||
/// The evaluation results are ordered:
|
||||
/// - `EvaluatedToOk` implies `EvaluatedToOkModuloRegions`
|
||||
/// implies `EvaluatedToAmbig` implies `EvaluatedToUnknown`
|
||||
/// - `EvaluatedToErr` implies `EvaluatedToRecur`
|
||||
/// implies `EvaluatedToAmbig` implies `EvaluatedToAmbigStackDependent`
|
||||
/// - `EvaluatedToErr` implies `EvaluatedToErrStackDependent`
|
||||
/// - the "union" of evaluation results is equal to their maximum -
|
||||
/// all the "potential success" candidates can potentially succeed,
|
||||
/// so they are noops when unioned with a definite error, and within
|
||||
@ -199,7 +199,7 @@ pub enum EvaluationResult {
|
||||
/// Evaluation is known to be ambiguous -- it *might* hold for some
|
||||
/// assignment of inference variables, but it might not.
|
||||
///
|
||||
/// While this has the same meaning as `EvaluatedToUnknown` -- we can't
|
||||
/// While this has the same meaning as `EvaluatedToAmbigStackDependent` -- we can't
|
||||
/// know whether this obligation holds or not -- it is the result we
|
||||
/// would get with an empty stack, and therefore is cacheable.
|
||||
EvaluatedToAmbig,
|
||||
@ -207,8 +207,8 @@ pub enum EvaluationResult {
|
||||
/// variables. We are somewhat imprecise there, so we don't actually
|
||||
/// know the real result.
|
||||
///
|
||||
/// This can't be trivially cached for the same reason as `EvaluatedToRecur`.
|
||||
EvaluatedToUnknown,
|
||||
/// This can't be trivially cached for the same reason as `EvaluatedToErrStackDependent`.
|
||||
EvaluatedToAmbigStackDependent,
|
||||
/// Evaluation failed because we encountered an obligation we are already
|
||||
/// trying to prove on this branch.
|
||||
///
|
||||
@ -247,12 +247,12 @@ pub enum EvaluationResult {
|
||||
/// does not hold, because of the bound (which can indeed be satisfied
|
||||
/// by `SomeUnsizedType` from another crate).
|
||||
//
|
||||
// FIXME: when an `EvaluatedToRecur` goes past its parent root, we
|
||||
// FIXME: when an `EvaluatedToErrStackDependent` goes past its parent root, we
|
||||
// ought to convert it to an `EvaluatedToErr`, because we know
|
||||
// there definitely isn't a proof tree for that obligation. Not
|
||||
// doing so is still sound -- there isn't any proof tree, so the
|
||||
// branch still can't be a part of a minimal one -- but does not re-enable caching.
|
||||
EvaluatedToRecur,
|
||||
EvaluatedToErrStackDependent,
|
||||
/// Evaluation failed.
|
||||
EvaluatedToErr,
|
||||
}
|
||||
@ -276,15 +276,15 @@ impl EvaluationResult {
|
||||
| EvaluatedToOk
|
||||
| EvaluatedToOkModuloRegions
|
||||
| EvaluatedToAmbig
|
||||
| EvaluatedToUnknown => true,
|
||||
| EvaluatedToAmbigStackDependent => true,
|
||||
|
||||
EvaluatedToErr | EvaluatedToRecur => false,
|
||||
EvaluatedToErr | EvaluatedToErrStackDependent => false,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_stack_dependent(self) -> bool {
|
||||
match self {
|
||||
EvaluatedToUnknown | EvaluatedToRecur => true,
|
||||
EvaluatedToAmbigStackDependent | EvaluatedToErrStackDependent => true,
|
||||
|
||||
EvaluatedToOkModuloOpaqueTypes
|
||||
| EvaluatedToOk
|
||||
|
@ -29,7 +29,7 @@ pub trait InferCtxtExt<'tcx> {
|
||||
/// - the parameter environment
|
||||
///
|
||||
/// Invokes `evaluate_obligation`, so in the event that evaluating
|
||||
/// `Ty: Trait` causes overflow, EvaluatedToRecur (or EvaluatedToUnknown)
|
||||
/// `Ty: Trait` causes overflow, EvaluatedToErrStackDependent (or EvaluatedToAmbigStackDependent)
|
||||
/// will be returned.
|
||||
fn type_implements_trait(
|
||||
&self,
|
||||
|
@ -222,8 +222,8 @@ pub enum TreatInductiveCycleAs {
|
||||
impl From<TreatInductiveCycleAs> for EvaluationResult {
|
||||
fn from(treat: TreatInductiveCycleAs) -> EvaluationResult {
|
||||
match treat {
|
||||
TreatInductiveCycleAs::Ambig => EvaluatedToUnknown,
|
||||
TreatInductiveCycleAs::Recur => EvaluatedToRecur,
|
||||
TreatInductiveCycleAs::Ambig => EvaluatedToAmbigStackDependent,
|
||||
TreatInductiveCycleAs::Recur => EvaluatedToErrStackDependent,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1231,7 +1231,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
})
|
||||
{
|
||||
debug!("evaluate_stack --> unbound argument, recursive --> giving up",);
|
||||
return Ok(EvaluatedToUnknown);
|
||||
return Ok(EvaluatedToAmbigStackDependent);
|
||||
}
|
||||
|
||||
match self.candidate_from_obligation(stack) {
|
||||
|
Loading…
Reference in New Issue
Block a user