move expensive layout sanity check to debug assertions
This commit is contained in:
parent
414482f6a0
commit
102cc2f883
1 changed files with 13 additions and 9 deletions
|
|
@ -8,15 +8,6 @@ use rustc_middle::ty::layout::{HasTyCtxt, LayoutCx, TyAndLayout};
|
|||
pub(super) fn layout_sanity_check<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayout<'tcx>) {
|
||||
let tcx = cx.tcx();
|
||||
|
||||
// Type-level uninhabitedness should always imply ABI uninhabitedness.
|
||||
if layout.ty.is_privately_uninhabited(tcx, cx.typing_env) {
|
||||
assert!(
|
||||
layout.is_uninhabited(),
|
||||
"{:?} is type-level uninhabited but not ABI-uninhabited?",
|
||||
layout.ty
|
||||
);
|
||||
}
|
||||
|
||||
if layout.size.bytes() % layout.align.abi.bytes() != 0 {
|
||||
bug!("size is not a multiple of align, in the following layout:\n{layout:#?}");
|
||||
}
|
||||
|
|
@ -29,6 +20,19 @@ pub(super) fn layout_sanity_check<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayou
|
|||
return;
|
||||
}
|
||||
|
||||
// Type-level uninhabitedness should always imply ABI uninhabitedness. This can be expensive on
|
||||
// big non-exhaustive types, and is [hard to
|
||||
// fix](https://github.com/rust-lang/rust/issues/141006#issuecomment-2883415000) in general.
|
||||
// Only doing this sanity check when debug assertions are turned on avoids the issue for the
|
||||
// very specific case of #140944.
|
||||
if layout.ty.is_privately_uninhabited(tcx, cx.typing_env) {
|
||||
assert!(
|
||||
layout.is_uninhabited(),
|
||||
"{:?} is type-level uninhabited but not ABI-uninhabited?",
|
||||
layout.ty
|
||||
);
|
||||
}
|
||||
|
||||
/// Yields non-ZST fields of the type
|
||||
fn non_zst_fields<'tcx, 'a>(
|
||||
cx: &'a LayoutCx<'tcx>,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue