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.rs | 19 |
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, _)| { |