Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/layout/adt.rs')
-rw-r--r--crates/hir-ty/src/layout/adt.rs56
1 files changed, 27 insertions, 29 deletions
diff --git a/crates/hir-ty/src/layout/adt.rs b/crates/hir-ty/src/layout/adt.rs
index eb4729fab8..3a020bf050 100644
--- a/crates/hir-ty/src/layout/adt.rs
+++ b/crates/hir-ty/src/layout/adt.rs
@@ -2,11 +2,10 @@
use std::{cmp, ops::Bound};
-use base_db::ra_salsa::Cycle;
use hir_def::{
- data::adt::VariantData,
- layout::{Integer, ReprOptions, TargetDataLayout},
AdtId, VariantId,
+ layout::{Integer, ReprOptions, TargetDataLayout},
+ signatures::{StructFlags, VariantFields},
};
use intern::sym;
use rustc_index::IndexVec;
@@ -14,10 +13,9 @@ use smallvec::SmallVec;
use triomphe::Arc;
use crate::{
- db::HirDatabase,
- lang_items::is_unsafe_cell,
- layout::{field_ty, Layout, LayoutError},
Substitution, TraitEnvironment,
+ db::HirDatabase,
+ layout::{Layout, LayoutError, field_ty},
};
use super::LayoutCx;
@@ -34,33 +32,37 @@ pub fn layout_of_adt_query(
};
let dl = &*target;
let cx = LayoutCx::new(dl);
- let handle_variant = |def: VariantId, var: &VariantData| {
+ let handle_variant = |def: VariantId, var: &VariantFields| {
var.fields()
.iter()
.map(|(fd, _)| db.layout_of_ty(field_ty(db, def, fd, &subst), trait_env.clone()))
.collect::<Result<Vec<_>, _>>()
};
- let (variants, repr) = match def {
+ let (variants, repr, is_special_no_niche) = match def {
AdtId::StructId(s) => {
- let data = db.struct_data(s);
+ let sig = db.struct_signature(s);
let mut r = SmallVec::<[_; 1]>::new();
- r.push(handle_variant(s.into(), &data.variant_data)?);
- (r, data.repr.unwrap_or_default())
+ r.push(handle_variant(s.into(), &db.variant_fields(s.into()))?);
+ (
+ r,
+ sig.repr.unwrap_or_default(),
+ sig.flags.intersects(StructFlags::IS_UNSAFE_CELL | StructFlags::IS_UNSAFE_PINNED),
+ )
}
AdtId::UnionId(id) => {
- let data = db.union_data(id);
+ let data = db.union_signature(id);
let mut r = SmallVec::new();
- r.push(handle_variant(id.into(), &data.variant_data)?);
- (r, data.repr.unwrap_or_default())
+ r.push(handle_variant(id.into(), &db.variant_fields(id.into()))?);
+ (r, data.repr.unwrap_or_default(), false)
}
AdtId::EnumId(e) => {
- let data = db.enum_data(e);
- let r = data
+ let variants = db.enum_variants(e);
+ let r = variants
.variants
.iter()
- .map(|&(v, _)| handle_variant(v.into(), &db.enum_variant_data(v).variant_data))
+ .map(|&(v, _)| handle_variant(v.into(), &db.variant_fields(v.into())))
.collect::<Result<SmallVec<_>, _>>()?;
- (r, data.repr.unwrap_or_default())
+ (r, db.enum_signature(e).repr.unwrap_or_default(), false)
}
};
let variants = variants
@@ -75,12 +77,12 @@ pub fn layout_of_adt_query(
&repr,
&variants,
matches!(def, AdtId::EnumId(..)),
- is_unsafe_cell(db, def),
+ is_special_no_niche,
layout_scalar_valid_range(db, def),
|min, max| repr_discr(dl, &repr, min, max).unwrap_or((Integer::I8, false)),
variants.iter_enumerated().filter_map(|(id, _)| {
let AdtId::EnumId(e) = def else { return None };
- let d = db.const_eval_discriminant(db.enum_data(e).variants[id.0].0).ok()?;
+ let d = db.const_eval_discriminant(db.enum_variants(e).variants[id.0].0).ok()?;
Some((id, d))
}),
// FIXME: The current code for niche-filling relies on variant indices
@@ -125,18 +127,14 @@ fn layout_scalar_valid_range(db: &dyn HirDatabase, def: AdtId) -> (Bound<u128>,
}
Bound::Unbounded
};
- (
- get(&sym::rustc_layout_scalar_valid_range_start),
- get(&sym::rustc_layout_scalar_valid_range_end),
- )
+ (get(sym::rustc_layout_scalar_valid_range_start), get(sym::rustc_layout_scalar_valid_range_end))
}
-pub fn layout_of_adt_recover(
+pub(crate) fn layout_of_adt_cycle_result(
_: &dyn HirDatabase,
- _: &Cycle,
- _: &AdtId,
- _: &Substitution,
- _: &Arc<TraitEnvironment>,
+ _: AdtId,
+ _: Substitution,
+ _: Arc<TraitEnvironment>,
) -> Result<Arc<Layout>, LayoutError> {
Err(LayoutError::RecursiveTypeWithoutIndirection)
}