Avoid ICEing miri on layout query cycles
This commit is contained in:
parent
7b99493492
commit
7bc6d598f9
6 changed files with 119 additions and 44 deletions
|
@ -210,6 +210,7 @@ pub enum LayoutError<'tcx> {
|
|||
Unknown(Ty<'tcx>),
|
||||
SizeOverflow(Ty<'tcx>),
|
||||
NormalizationFailure(Ty<'tcx>, NormalizationError<'tcx>),
|
||||
Cycle,
|
||||
}
|
||||
|
||||
impl IntoDiagnostic<'_, !> for LayoutError<'_> {
|
||||
|
@ -230,6 +231,9 @@ impl IntoDiagnostic<'_, !> for LayoutError<'_> {
|
|||
diag.set_arg("failure_ty", e.get_type_for_failure());
|
||||
diag.set_primary_message(fluent::middle_cannot_be_normalized);
|
||||
}
|
||||
LayoutError::Cycle => {
|
||||
diag.set_primary_message(fluent::middle_cycle);
|
||||
}
|
||||
}
|
||||
diag
|
||||
}
|
||||
|
@ -250,6 +254,7 @@ impl<'tcx> fmt::Display for LayoutError<'tcx> {
|
|||
t,
|
||||
e.get_type_for_failure()
|
||||
),
|
||||
LayoutError::Cycle => write!(f, "a cycle occurred during layout computation"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -106,6 +106,12 @@ impl<'tcx> Value<TyCtxt<'tcx>, DepKind> for ty::EarlyBinder<ty::Binder<'_, ty::F
|
|||
}
|
||||
}
|
||||
|
||||
impl<'tcx, T> Value<TyCtxt<'tcx>, DepKind> for Result<T, ty::layout::LayoutError<'_>> {
|
||||
fn from_cycle_error(_tcx: TyCtxt<'tcx>, _cycle: &[QueryInfo<DepKind>]) -> Self {
|
||||
Err(ty::layout::LayoutError::Cycle)
|
||||
}
|
||||
}
|
||||
|
||||
// item_and_field_ids should form a cycle where each field contains the
|
||||
// type in the next element in the list
|
||||
pub fn recursive_type_error(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue