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.rs19
1 files changed, 11 insertions, 8 deletions
diff --git a/crates/hir-ty/src/layout/adt.rs b/crates/hir-ty/src/layout/adt.rs
index de6a82a098..67e0e370b7 100644
--- a/crates/hir-ty/src/layout/adt.rs
+++ b/crates/hir-ty/src/layout/adt.rs
@@ -5,7 +5,7 @@ use std::{cmp, ops::Bound};
use hir_def::{
AdtId, VariantId,
layout::{Integer, ReprOptions, TargetDataLayout},
- signatures::VariantFields,
+ signatures::{StructFlags, VariantFields},
};
use intern::sym;
use rustc_index::IndexVec;
@@ -16,7 +16,6 @@ use triomphe::Arc;
use crate::{
Substitution, TraitEnvironment,
db::HirDatabase,
- lang_items::is_unsafe_cell,
layout::{Layout, LayoutError, field_ty},
};
@@ -40,18 +39,22 @@ pub fn layout_of_adt_query(
.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_signature(s);
+ let sig = db.struct_signature(s);
let mut r = SmallVec::<[_; 1]>::new();
r.push(handle_variant(s.into(), &db.variant_fields(s.into()))?);
- (r, data.repr.unwrap_or_default())
+ (
+ r,
+ sig.repr.unwrap_or_default(),
+ sig.flags.intersects(StructFlags::IS_UNSAFE_CELL | StructFlags::IS_UNSAFE_PINNED),
+ )
}
AdtId::UnionId(id) => {
let data = db.union_signature(id);
let mut r = SmallVec::new();
r.push(handle_variant(id.into(), &db.variant_fields(id.into()))?);
- (r, data.repr.unwrap_or_default())
+ (r, data.repr.unwrap_or_default(), false)
}
AdtId::EnumId(e) => {
let variants = db.enum_variants(e);
@@ -60,7 +63,7 @@ pub fn layout_of_adt_query(
.iter()
.map(|&(v, _)| handle_variant(v.into(), &db.variant_fields(v.into())))
.collect::<Result<SmallVec<_>, _>>()?;
- (r, db.enum_signature(e).repr.unwrap_or_default())
+ (r, db.enum_signature(e).repr.unwrap_or_default(), false)
}
};
let variants = variants
@@ -75,7 +78,7 @@ 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, _)| {