mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-29 02:52:11 +00:00
fix: Support unstable UnsafePinned struct in type layout calc
This commit is contained in:
parent
66e3b5819e
commit
d16b862ea5
5 changed files with 16 additions and 14 deletions
|
|
@ -345,6 +345,7 @@ language_item_table! {
|
||||||
IndexMut, sym::index_mut, index_mut_trait, Target::Trait, GenericRequirement::Exact(1);
|
IndexMut, sym::index_mut, index_mut_trait, Target::Trait, GenericRequirement::Exact(1);
|
||||||
|
|
||||||
UnsafeCell, sym::unsafe_cell, unsafe_cell_type, Target::Struct, GenericRequirement::None;
|
UnsafeCell, sym::unsafe_cell, unsafe_cell_type, Target::Struct, GenericRequirement::None;
|
||||||
|
UnsafePinned, sym::unsafe_pinned, unsafe_pinned_type, Target::Struct, GenericRequirement::None;
|
||||||
VaList, sym::va_list, va_list, Target::Struct, GenericRequirement::None;
|
VaList, sym::va_list, va_list, Target::Struct, GenericRequirement::None;
|
||||||
|
|
||||||
Deref, sym::deref, deref_trait, Target::Trait, GenericRequirement::Exact(0);
|
Deref, sym::deref, deref_trait, Target::Trait, GenericRequirement::Exact(0);
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,8 @@ bitflags! {
|
||||||
const IS_MANUALLY_DROP = 1 << 5;
|
const IS_MANUALLY_DROP = 1 << 5;
|
||||||
/// Indicates whether this struct is `UnsafeCell`.
|
/// Indicates whether this struct is `UnsafeCell`.
|
||||||
const IS_UNSAFE_CELL = 1 << 6;
|
const IS_UNSAFE_CELL = 1 << 6;
|
||||||
|
/// Indicates whether this struct is `UnsafePinned`.
|
||||||
|
const IS_UNSAFE_PINNED = 1 << 7;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -84,6 +86,7 @@ impl StructSignature {
|
||||||
LangItem::OwnedBox => flags |= StructFlags::IS_BOX,
|
LangItem::OwnedBox => flags |= StructFlags::IS_BOX,
|
||||||
LangItem::ManuallyDrop => flags |= StructFlags::IS_MANUALLY_DROP,
|
LangItem::ManuallyDrop => flags |= StructFlags::IS_MANUALLY_DROP,
|
||||||
LangItem::UnsafeCell => flags |= StructFlags::IS_UNSAFE_CELL,
|
LangItem::UnsafeCell => flags |= StructFlags::IS_UNSAFE_CELL,
|
||||||
|
LangItem::UnsafePinned => flags |= StructFlags::IS_UNSAFE_PINNED,
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,6 @@ pub fn is_box(db: &dyn HirDatabase, adt: AdtId) -> bool {
|
||||||
db.struct_signature(id).flags.contains(StructFlags::IS_BOX)
|
db.struct_signature(id).flags.contains(StructFlags::IS_BOX)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_unsafe_cell(db: &dyn HirDatabase, adt: AdtId) -> bool {
|
|
||||||
let AdtId::StructId(id) = adt else { return false };
|
|
||||||
|
|
||||||
db.struct_signature(id).flags.contains(StructFlags::IS_UNSAFE_CELL)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn lang_items_for_bin_op(op: syntax::ast::BinaryOp) -> Option<(Name, LangItem)> {
|
pub fn lang_items_for_bin_op(op: syntax::ast::BinaryOp) -> Option<(Name, LangItem)> {
|
||||||
use syntax::ast::{ArithOp, BinaryOp, CmpOp, Ordering};
|
use syntax::ast::{ArithOp, BinaryOp, CmpOp, Ordering};
|
||||||
Some(match op {
|
Some(match op {
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ use std::{cmp, ops::Bound};
|
||||||
use hir_def::{
|
use hir_def::{
|
||||||
AdtId, VariantId,
|
AdtId, VariantId,
|
||||||
layout::{Integer, ReprOptions, TargetDataLayout},
|
layout::{Integer, ReprOptions, TargetDataLayout},
|
||||||
signatures::VariantFields,
|
signatures::{StructFlags, VariantFields},
|
||||||
};
|
};
|
||||||
use intern::sym;
|
use intern::sym;
|
||||||
use rustc_index::IndexVec;
|
use rustc_index::IndexVec;
|
||||||
|
|
@ -16,7 +16,6 @@ use triomphe::Arc;
|
||||||
use crate::{
|
use crate::{
|
||||||
Substitution, TraitEnvironment,
|
Substitution, TraitEnvironment,
|
||||||
db::HirDatabase,
|
db::HirDatabase,
|
||||||
lang_items::is_unsafe_cell,
|
|
||||||
layout::{Layout, LayoutError, field_ty},
|
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()))
|
.map(|(fd, _)| db.layout_of_ty(field_ty(db, def, fd, &subst), trait_env.clone()))
|
||||||
.collect::<Result<Vec<_>, _>>()
|
.collect::<Result<Vec<_>, _>>()
|
||||||
};
|
};
|
||||||
let (variants, repr) = match def {
|
let (variants, repr, is_special_no_niche) = match def {
|
||||||
AdtId::StructId(s) => {
|
AdtId::StructId(s) => {
|
||||||
let data = db.struct_signature(s);
|
let sig = db.struct_signature(s);
|
||||||
let mut r = SmallVec::<[_; 1]>::new();
|
let mut r = SmallVec::<[_; 1]>::new();
|
||||||
r.push(handle_variant(s.into(), &db.variant_fields(s.into()))?);
|
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) => {
|
AdtId::UnionId(id) => {
|
||||||
let data = db.union_signature(id);
|
let data = db.union_signature(id);
|
||||||
let mut r = SmallVec::new();
|
let mut r = SmallVec::new();
|
||||||
r.push(handle_variant(id.into(), &db.variant_fields(id.into()))?);
|
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) => {
|
AdtId::EnumId(e) => {
|
||||||
let variants = db.enum_variants(e);
|
let variants = db.enum_variants(e);
|
||||||
|
|
@ -60,7 +63,7 @@ pub fn layout_of_adt_query(
|
||||||
.iter()
|
.iter()
|
||||||
.map(|&(v, _)| handle_variant(v.into(), &db.variant_fields(v.into())))
|
.map(|&(v, _)| handle_variant(v.into(), &db.variant_fields(v.into())))
|
||||||
.collect::<Result<SmallVec<_>, _>>()?;
|
.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
|
let variants = variants
|
||||||
|
|
@ -75,7 +78,7 @@ pub fn layout_of_adt_query(
|
||||||
&repr,
|
&repr,
|
||||||
&variants,
|
&variants,
|
||||||
matches!(def, AdtId::EnumId(..)),
|
matches!(def, AdtId::EnumId(..)),
|
||||||
is_unsafe_cell(db, def),
|
is_special_no_niche,
|
||||||
layout_scalar_valid_range(db, def),
|
layout_scalar_valid_range(db, def),
|
||||||
|min, max| repr_discr(dl, &repr, min, max).unwrap_or((Integer::I8, false)),
|
|min, max| repr_discr(dl, &repr, min, max).unwrap_or((Integer::I8, false)),
|
||||||
variants.iter_enumerated().filter_map(|(id, _)| {
|
variants.iter_enumerated().filter_map(|(id, _)| {
|
||||||
|
|
|
||||||
|
|
@ -512,6 +512,7 @@ define_symbols! {
|
||||||
unreachable_2021,
|
unreachable_2021,
|
||||||
unreachable,
|
unreachable,
|
||||||
unsafe_cell,
|
unsafe_cell,
|
||||||
|
unsafe_pinned,
|
||||||
unsize,
|
unsize,
|
||||||
unstable,
|
unstable,
|
||||||
usize,
|
usize,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue