layout computation: eagerly error for unexpected unsized fields
This commit is contained in:
parent
16be6666d4
commit
697450151c
25 changed files with 1246 additions and 1115 deletions
|
@ -63,7 +63,7 @@ pub mod rustc {
|
|||
use std::fmt::{self, Write};
|
||||
|
||||
use rustc_middle::mir::Mutability;
|
||||
use rustc_middle::ty::layout::{LayoutCx, LayoutError};
|
||||
use rustc_middle::ty::layout::{HasTyCtxt, LayoutCx, LayoutError};
|
||||
use rustc_middle::ty::{self, Ty};
|
||||
use rustc_target::abi::Layout;
|
||||
|
||||
|
@ -128,7 +128,7 @@ pub mod rustc {
|
|||
ty: Ty<'tcx>,
|
||||
) -> Result<Layout<'tcx>, &'tcx LayoutError<'tcx>> {
|
||||
use rustc_middle::ty::layout::LayoutOf;
|
||||
let ty = cx.tcx.erase_regions(ty);
|
||||
let ty = cx.tcx().erase_regions(ty);
|
||||
cx.layout_of(ty).map(|tl| tl.layout)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -212,7 +212,7 @@ pub(crate) mod rustc {
|
|||
return Err(Err::TypeError(e));
|
||||
}
|
||||
|
||||
let target = cx.tcx.data_layout();
|
||||
let target = cx.data_layout();
|
||||
let pointer_size = target.pointer_size;
|
||||
|
||||
match ty.kind() {
|
||||
|
@ -320,7 +320,7 @@ pub(crate) mod rustc {
|
|||
|
||||
// Computes the variant of a given index.
|
||||
let layout_of_variant = |index, encoding: Option<TagEncoding<VariantIdx>>| {
|
||||
let tag = cx.tcx.tag_for_variant((cx.tcx.erase_regions(ty), index));
|
||||
let tag = cx.tcx().tag_for_variant((cx.tcx().erase_regions(ty), index));
|
||||
let variant_def = Def::Variant(def.variant(index));
|
||||
let variant_layout = ty_variant(cx, (ty, layout), index);
|
||||
Self::from_variant(
|
||||
|
@ -417,7 +417,7 @@ pub(crate) mod rustc {
|
|||
}
|
||||
}
|
||||
}
|
||||
struct_tree = struct_tree.then(Self::from_tag(*tag, cx.tcx));
|
||||
struct_tree = struct_tree.then(Self::from_tag(*tag, cx.tcx()));
|
||||
}
|
||||
|
||||
// Append the fields, in memory order, to the layout.
|
||||
|
@ -509,12 +509,12 @@ pub(crate) mod rustc {
|
|||
match layout.variants {
|
||||
Variants::Single { index } => {
|
||||
let field = &def.variant(index).fields[i];
|
||||
field.ty(cx.tcx, args)
|
||||
field.ty(cx.tcx(), args)
|
||||
}
|
||||
// Discriminant field for enums (where applicable).
|
||||
Variants::Multiple { tag, .. } => {
|
||||
assert_eq!(i.as_usize(), 0);
|
||||
ty::layout::PrimitiveExt::to_ty(&tag.primitive(), cx.tcx)
|
||||
ty::layout::PrimitiveExt::to_ty(&tag.primitive(), cx.tcx())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -531,7 +531,7 @@ pub(crate) mod rustc {
|
|||
(ty, layout): (Ty<'tcx>, Layout<'tcx>),
|
||||
i: VariantIdx,
|
||||
) -> Layout<'tcx> {
|
||||
let ty = cx.tcx.erase_regions(ty);
|
||||
let ty = cx.tcx().erase_regions(ty);
|
||||
TyAndLayout { ty, layout }.for_variant(&cx, i).layout
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@ mod rustc {
|
|||
pub fn answer(self) -> Answer<<TyCtxt<'tcx> as QueryContext>::Ref> {
|
||||
let Self { src, dst, assume, context } = self;
|
||||
|
||||
let layout_cx = LayoutCx { tcx: context, param_env: ParamEnv::reveal_all() };
|
||||
let layout_cx = LayoutCx::new(context, ParamEnv::reveal_all());
|
||||
|
||||
// Convert `src` and `dst` from their rustc representations, to `Tree`-based
|
||||
// representations.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue