explicitly handle errors in fulfill
This commit is contained in:
parent
afd7ea88fb
commit
e873eef1e3
2 changed files with 26 additions and 25 deletions
|
@ -2,6 +2,7 @@ use crate::infer::{InferCtxt, TyOrConstInferVar};
|
|||
use rustc_data_structures::obligation_forest::ProcessResult;
|
||||
use rustc_data_structures::obligation_forest::{DoCompleted, Error, ForestObligation};
|
||||
use rustc_data_structures::obligation_forest::{ObligationForest, ObligationProcessor};
|
||||
use rustc_errors::ErrorReported;
|
||||
use rustc_infer::traits::{TraitEngine, TraitEngineExt as _};
|
||||
use rustc_middle::mir::interpret::ErrorHandled;
|
||||
use rustc_middle::ty::error::ExpectedFound;
|
||||
|
@ -544,11 +545,9 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> {
|
|||
.filter_map(|ty| TyOrConstInferVar::maybe_from_ty(ty))
|
||||
.collect(),
|
||||
);
|
||||
Err(ProcessResult::Unchanged)
|
||||
}
|
||||
Err(err) => {
|
||||
Err(ProcessResult::Error(CodeSelectionError(ConstEvalFailure(err))))
|
||||
Err(ErrorHandled::TooGeneric)
|
||||
}
|
||||
Err(err) => Err(err),
|
||||
}
|
||||
} else {
|
||||
Ok(c)
|
||||
|
@ -572,15 +571,17 @@ impl<'a, 'b, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'tcx> {
|
|||
}
|
||||
}
|
||||
}
|
||||
// FIXME(skinny121) How to report both errors if both produces errors?
|
||||
(Err(result @ ProcessResult::Error(_)), _)
|
||||
| (_, Err(result @ ProcessResult::Error(_))) => result,
|
||||
(Err(ProcessResult::Unchanged), _) | (_, Err(ProcessResult::Unchanged)) => {
|
||||
(Err(ErrorHandled::Reported(ErrorReported)), _)
|
||||
| (_, Err(ErrorHandled::Reported(ErrorReported))) => ProcessResult::Error(
|
||||
CodeSelectionError(ConstEvalFailure(ErrorHandled::Reported(ErrorReported))),
|
||||
),
|
||||
(Err(ErrorHandled::Linted), _) | (_, Err(ErrorHandled::Linted)) => span_bug!(
|
||||
obligation.cause.span(self.selcx.tcx()),
|
||||
"ConstEquate: const_eval_resolve returned an unexpected error"
|
||||
),
|
||||
(Err(ErrorHandled::TooGeneric), _) | (_, Err(ErrorHandled::TooGeneric)) => {
|
||||
ProcessResult::Unchanged
|
||||
}
|
||||
_ => {
|
||||
unreachable!("evaluate shouldn't itself return ProcessResult::Changed(..)")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,40 +1,40 @@
|
|||
warning: the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||
--> $DIR/lazy-normalization-feature-gate-hack.rs:2:12
|
||||
--> $DIR/lazy-normalization-feature-gate.rs:2:12
|
||||
|
|
||||
LL | #![feature(const_generics)]
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
error[E0391]: cycle detected when const-evaluating + checking `<impl at $DIR/lazy-normalization-feature-gate-hack.rs:6:1: 6:72>::{{constant}}#0`
|
||||
--> $DIR/lazy-normalization-feature-gate-hack.rs:6:58
|
||||
error[E0391]: cycle detected when const-evaluating + checking `<impl at $DIR/lazy-normalization-feature-gate.rs:6:1: 6:72>::{{constant}}#0`
|
||||
--> $DIR/lazy-normalization-feature-gate.rs:6:58
|
||||
|
|
||||
LL | impl<const N: usize> Foo for [(); N] where Self: FooImpl<{ N == 0 }> {}
|
||||
| ^^^^^^^^^^
|
||||
|
|
||||
note: ...which requires const-evaluating + checking `<impl at $DIR/lazy-normalization-feature-gate-hack.rs:6:1: 6:72>::{{constant}}#0`...
|
||||
--> $DIR/lazy-normalization-feature-gate-hack.rs:6:58
|
||||
note: ...which requires const-evaluating + checking `<impl at $DIR/lazy-normalization-feature-gate.rs:6:1: 6:72>::{{constant}}#0`...
|
||||
--> $DIR/lazy-normalization-feature-gate.rs:6:58
|
||||
|
|
||||
LL | impl<const N: usize> Foo for [(); N] where Self: FooImpl<{ N == 0 }> {}
|
||||
| ^^^^^^^^^^
|
||||
note: ...which requires const-evaluating `<impl at $DIR/lazy-normalization-feature-gate-hack.rs:6:1: 6:72>::{{constant}}#0`...
|
||||
--> $DIR/lazy-normalization-feature-gate-hack.rs:6:58
|
||||
note: ...which requires const-evaluating `<impl at $DIR/lazy-normalization-feature-gate.rs:6:1: 6:72>::{{constant}}#0`...
|
||||
--> $DIR/lazy-normalization-feature-gate.rs:6:58
|
||||
|
|
||||
LL | impl<const N: usize> Foo for [(); N] where Self: FooImpl<{ N == 0 }> {}
|
||||
| ^^^^^^^^^^
|
||||
note: ...which requires type-checking `<impl at $DIR/lazy-normalization-feature-gate-hack.rs:6:1: 6:72>::{{constant}}#0`...
|
||||
--> $DIR/lazy-normalization-feature-gate-hack.rs:6:58
|
||||
note: ...which requires type-checking `<impl at $DIR/lazy-normalization-feature-gate.rs:6:1: 6:72>::{{constant}}#0`...
|
||||
--> $DIR/lazy-normalization-feature-gate.rs:6:58
|
||||
|
|
||||
LL | impl<const N: usize> Foo for [(); N] where Self: FooImpl<{ N == 0 }> {}
|
||||
| ^^^^^^^^^^
|
||||
note: ...which requires processing `<impl at $DIR/lazy-normalization-feature-gate-hack.rs:6:1: 6:72>::{{constant}}#0`...
|
||||
--> $DIR/lazy-normalization-feature-gate-hack.rs:6:58
|
||||
note: ...which requires processing `<impl at $DIR/lazy-normalization-feature-gate.rs:6:1: 6:72>::{{constant}}#0`...
|
||||
--> $DIR/lazy-normalization-feature-gate.rs:6:58
|
||||
|
|
||||
LL | impl<const N: usize> Foo for [(); N] where Self: FooImpl<{ N == 0 }> {}
|
||||
| ^^^^^^^^^^
|
||||
= note: ...which again requires const-evaluating + checking `<impl at $DIR/lazy-normalization-feature-gate-hack.rs:6:1: 6:72>::{{constant}}#0`, completing the cycle
|
||||
note: cycle used when processing `<impl at $DIR/lazy-normalization-feature-gate-hack.rs:6:1: 6:72>`
|
||||
--> $DIR/lazy-normalization-feature-gate-hack.rs:6:1
|
||||
= note: ...which again requires const-evaluating + checking `<impl at $DIR/lazy-normalization-feature-gate.rs:6:1: 6:72>::{{constant}}#0`, completing the cycle
|
||||
note: cycle used when processing `<impl at $DIR/lazy-normalization-feature-gate.rs:6:1: 6:72>`
|
||||
--> $DIR/lazy-normalization-feature-gate.rs:6:1
|
||||
|
|
||||
LL | impl<const N: usize> Foo for [(); N] where Self: FooImpl<{ N == 0 }> {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue