Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/lib.rs')
-rw-r--r--crates/hir/src/lib.rs74
1 files changed, 37 insertions, 37 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index 5c0320f733..eee45b74d9 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -45,7 +45,7 @@ use hir_def::{
hir::{BindingAnnotation, BindingId, ExprOrPatId, LabelId, Pat},
item_tree::ItemTreeNode,
lang_item::LangItemTarget,
- layout::{self, ReprOptions},
+ layout::{self, ReprOptions, TargetDataLayout},
macro_id_to_def_id,
nameres::{self, diagnostics::DefDiagnostic, ModuleOrigin},
per_ns::PerNs,
@@ -62,7 +62,7 @@ use hir_ty::{
consteval::{try_const_usize, unknown_const_as_generic, ConstEvalError, ConstExt},
diagnostics::BodyValidationDiagnostic,
display::HexifiedConst,
- layout::{Layout as TyLayout, LayoutError, RustcEnumVariantIdx, TagEncoding},
+ layout::{Layout as TyLayout, RustcEnumVariantIdx, TagEncoding},
method_resolution::{self, TyFingerprint},
mir::{self, interpret_mir},
primitive::UintTy,
@@ -133,6 +133,7 @@ pub use {
},
hir_ty::{
display::{ClosureStyle, HirDisplay, HirDisplayError, HirWrite},
+ layout::LayoutError,
mir::MirEvalError,
PointerCast, Safety,
},
@@ -962,7 +963,8 @@ impl Field {
}
pub fn layout(&self, db: &dyn HirDatabase) -> Result<Layout, LayoutError> {
- db.layout_of_ty(self.ty(db).ty.clone(), self.parent.module(db).krate().into()).map(Layout)
+ db.layout_of_ty(self.ty(db).ty.clone(), self.parent.module(db).krate().into())
+ .map(|layout| Layout(layout, db.target_data_layout(self.krate(db).into()).unwrap()))
}
pub fn parent_def(&self, _db: &dyn HirDatabase) -> VariantDef {
@@ -1135,23 +1137,8 @@ impl Enum {
self.variants(db).iter().any(|v| !matches!(v.kind(db), StructKind::Unit))
}
- pub fn layout(self, db: &dyn HirDatabase) -> Result<(Layout, usize), LayoutError> {
- let layout = Adt::from(self).layout(db)?;
- let tag_size =
- if let layout::Variants::Multiple { tag, tag_encoding, .. } = &layout.0.variants {
- match tag_encoding {
- TagEncoding::Direct => {
- let target_data_layout = db
- .target_data_layout(self.module(db).krate().id)
- .ok_or(LayoutError::TargetLayoutNotAvailable)?;
- tag.size(&*target_data_layout).bytes_usize()
- }
- TagEncoding::Niche { .. } => 0,
- }
- } else {
- 0
- };
- Ok((layout, tag_size))
+ pub fn layout(self, db: &dyn HirDatabase) -> Result<Layout, LayoutError> {
+ Adt::from(self).layout(db)
}
}
@@ -1214,19 +1201,16 @@ impl Variant {
db.const_eval_discriminant(self.into())
}
- /// Return layout of the variant and tag size of the parent enum.
- pub fn layout(&self, db: &dyn HirDatabase) -> Result<(Layout, usize), LayoutError> {
+ pub fn layout(&self, db: &dyn HirDatabase) -> Result<Layout, LayoutError> {
let parent_enum = self.parent_enum(db);
- let (parent_layout, tag_size) = parent_enum.layout(db)?;
- Ok((
- match &parent_layout.0.variants {
- layout::Variants::Multiple { variants, .. } => {
- Layout(Arc::new(variants[RustcEnumVariantIdx(self.id)].clone()))
- }
- _ => parent_layout,
- },
- tag_size,
- ))
+ let parent_layout = parent_enum.layout(db)?;
+ Ok(match &parent_layout.0.variants {
+ layout::Variants::Multiple { variants, .. } => Layout(
+ Arc::new(variants[RustcEnumVariantIdx(self.id)].clone()),
+ db.target_data_layout(parent_enum.krate(db).into()).unwrap(),
+ ),
+ _ => parent_layout,
+ })
}
}
@@ -1259,7 +1243,9 @@ impl Adt {
if db.generic_params(self.into()).iter().count() != 0 {
return Err(LayoutError::HasPlaceholder);
}
- db.layout_of_adt(self.into(), Substitution::empty(Interner), self.krate(db).id).map(Layout)
+ let krate = self.krate(db).id;
+ db.layout_of_adt(self.into(), Substitution::empty(Interner), krate)
+ .map(|layout| Layout(layout, db.target_data_layout(krate).unwrap()))
}
/// Turns this ADT into a type. Any type parameters of the ADT will be
@@ -4244,7 +4230,8 @@ impl Type {
}
pub fn layout(&self, db: &dyn HirDatabase) -> Result<Layout, LayoutError> {
- db.layout_of_ty(self.ty.clone(), self.env.krate).map(Layout)
+ db.layout_of_ty(self.ty.clone(), self.env.krate)
+ .map(|layout| Layout(layout, db.target_data_layout(self.env.krate).unwrap()))
}
}
@@ -4356,7 +4343,7 @@ fn closure_source(db: &dyn HirDatabase, closure: ClosureId) -> Option<ast::Closu
}
#[derive(Clone, Debug, Eq, PartialEq)]
-pub struct Layout(Arc<TyLayout>);
+pub struct Layout(Arc<TyLayout>, Arc<TargetDataLayout>);
impl Layout {
pub fn size(&self) -> u64 {
@@ -4367,8 +4354,8 @@ impl Layout {
self.0.align.abi.bytes()
}
- pub fn niches(&self, db: &dyn HirDatabase, krate: Crate) -> Option<u128> {
- Some(self.0.largest_niche?.available(&*db.target_data_layout(krate.id)?))
+ pub fn niches(&self) -> Option<u128> {
+ Some(self.0.largest_niche?.available(&*self.1))
}
pub fn field_offset(&self, idx: usize) -> Option<u64> {
@@ -4382,6 +4369,19 @@ impl Layout {
layout::FieldsShape::Arbitrary { ref offsets, .. } => Some(offsets.get(idx)?.bytes()),
}
}
+
+ pub fn enum_tag_size(&self) -> Option<usize> {
+ let tag_size =
+ if let layout::Variants::Multiple { tag, tag_encoding, .. } = &self.0.variants {
+ match tag_encoding {
+ TagEncoding::Direct => tag.size(&*self.1).bytes_usize(),
+ TagEncoding::Niche { .. } => 0,
+ }
+ } else {
+ return None;
+ };
+ Some(tag_size)
+ }
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]