Skip to content

Commit c673dc8

Browse files
authored
Merge pull request #19650 from Veykril/push-rkxrprnwqktr
fix: Support unstable `UnsafePinned` struct in type layout calc
2 parents 66e3b58 + d16b862 commit c673dc8

File tree

5 files changed

+16
-14
lines changed

5 files changed

+16
-14
lines changed

crates/hir-def/src/lang_item.rs

+1
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ language_item_table! {
345345
IndexMut, sym::index_mut, index_mut_trait, Target::Trait, GenericRequirement::Exact(1);
346346

347347
UnsafeCell, sym::unsafe_cell, unsafe_cell_type, Target::Struct, GenericRequirement::None;
348+
UnsafePinned, sym::unsafe_pinned, unsafe_pinned_type, Target::Struct, GenericRequirement::None;
348349
VaList, sym::va_list, va_list, Target::Struct, GenericRequirement::None;
349350

350351
Deref, sym::deref, deref_trait, Target::Trait, GenericRequirement::Exact(0);

crates/hir-def/src/signatures.rs

+3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ bitflags! {
6262
const IS_MANUALLY_DROP = 1 << 5;
6363
/// Indicates whether this struct is `UnsafeCell`.
6464
const IS_UNSAFE_CELL = 1 << 6;
65+
/// Indicates whether this struct is `UnsafePinned`.
66+
const IS_UNSAFE_PINNED = 1 << 7;
6567
}
6668
}
6769

@@ -84,6 +86,7 @@ impl StructSignature {
8486
LangItem::OwnedBox => flags |= StructFlags::IS_BOX,
8587
LangItem::ManuallyDrop => flags |= StructFlags::IS_MANUALLY_DROP,
8688
LangItem::UnsafeCell => flags |= StructFlags::IS_UNSAFE_CELL,
89+
LangItem::UnsafePinned => flags |= StructFlags::IS_UNSAFE_PINNED,
8790
_ => (),
8891
}
8992
}

crates/hir-ty/src/lang_items.rs

-6
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,6 @@ pub fn is_box(db: &dyn HirDatabase, adt: AdtId) -> bool {
1111
db.struct_signature(id).flags.contains(StructFlags::IS_BOX)
1212
}
1313

14-
pub fn is_unsafe_cell(db: &dyn HirDatabase, adt: AdtId) -> bool {
15-
let AdtId::StructId(id) = adt else { return false };
16-
17-
db.struct_signature(id).flags.contains(StructFlags::IS_UNSAFE_CELL)
18-
}
19-
2014
pub fn lang_items_for_bin_op(op: syntax::ast::BinaryOp) -> Option<(Name, LangItem)> {
2115
use syntax::ast::{ArithOp, BinaryOp, CmpOp, Ordering};
2216
Some(match op {

crates/hir-ty/src/layout/adt.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::{cmp, ops::Bound};
55
use hir_def::{
66
AdtId, VariantId,
77
layout::{Integer, ReprOptions, TargetDataLayout},
8-
signatures::VariantFields,
8+
signatures::{StructFlags, VariantFields},
99
};
1010
use intern::sym;
1111
use rustc_index::IndexVec;
@@ -16,7 +16,6 @@ use triomphe::Arc;
1616
use crate::{
1717
Substitution, TraitEnvironment,
1818
db::HirDatabase,
19-
lang_items::is_unsafe_cell,
2019
layout::{Layout, LayoutError, field_ty},
2120
};
2221

@@ -40,18 +39,22 @@ pub fn layout_of_adt_query(
4039
.map(|(fd, _)| db.layout_of_ty(field_ty(db, def, fd, &subst), trait_env.clone()))
4140
.collect::<Result<Vec<_>, _>>()
4241
};
43-
let (variants, repr) = match def {
42+
let (variants, repr, is_special_no_niche) = match def {
4443
AdtId::StructId(s) => {
45-
let data = db.struct_signature(s);
44+
let sig = db.struct_signature(s);
4645
let mut r = SmallVec::<[_; 1]>::new();
4746
r.push(handle_variant(s.into(), &db.variant_fields(s.into()))?);
48-
(r, data.repr.unwrap_or_default())
47+
(
48+
r,
49+
sig.repr.unwrap_or_default(),
50+
sig.flags.intersects(StructFlags::IS_UNSAFE_CELL | StructFlags::IS_UNSAFE_PINNED),
51+
)
4952
}
5053
AdtId::UnionId(id) => {
5154
let data = db.union_signature(id);
5255
let mut r = SmallVec::new();
5356
r.push(handle_variant(id.into(), &db.variant_fields(id.into()))?);
54-
(r, data.repr.unwrap_or_default())
57+
(r, data.repr.unwrap_or_default(), false)
5558
}
5659
AdtId::EnumId(e) => {
5760
let variants = db.enum_variants(e);
@@ -60,7 +63,7 @@ pub fn layout_of_adt_query(
6063
.iter()
6164
.map(|&(v, _)| handle_variant(v.into(), &db.variant_fields(v.into())))
6265
.collect::<Result<SmallVec<_>, _>>()?;
63-
(r, db.enum_signature(e).repr.unwrap_or_default())
66+
(r, db.enum_signature(e).repr.unwrap_or_default(), false)
6467
}
6568
};
6669
let variants = variants
@@ -75,7 +78,7 @@ pub fn layout_of_adt_query(
7578
&repr,
7679
&variants,
7780
matches!(def, AdtId::EnumId(..)),
78-
is_unsafe_cell(db, def),
81+
is_special_no_niche,
7982
layout_scalar_valid_range(db, def),
8083
|min, max| repr_discr(dl, &repr, min, max).unwrap_or((Integer::I8, false)),
8184
variants.iter_enumerated().filter_map(|(id, _)| {

crates/intern/src/symbol/symbols.rs

+1
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,7 @@ define_symbols! {
512512
unreachable_2021,
513513
unreachable,
514514
unsafe_cell,
515+
unsafe_pinned,
515516
unsize,
516517
unstable,
517518
usize,

0 commit comments

Comments
 (0)