Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/mir/eval/shim.rs')
-rw-r--r--crates/hir-ty/src/mir/eval/shim.rs40
1 files changed, 19 insertions, 21 deletions
diff --git a/crates/hir-ty/src/mir/eval/shim.rs b/crates/hir-ty/src/mir/eval/shim.rs
index 9586d38abc..b4a5aa8a87 100644
--- a/crates/hir-ty/src/mir/eval/shim.rs
+++ b/crates/hir-ty/src/mir/eval/shim.rs
@@ -4,9 +4,8 @@
use std::cmp::{self, Ordering};
use hir_def::{attrs::AttrFlags, signatures::FunctionSignature};
-use hir_expand::name::Name;
-use intern::sym;
-use rustc_type_ir::inherent::{AdtDef, GenericArgs as _, IntoKind, SliceLike, Ty as _};
+use rustc_abi::ExternAbi;
+use rustc_type_ir::inherent::{GenericArgs as _, IntoKind, SliceLike, Ty as _};
use stdx::never;
use crate::{
@@ -29,13 +28,13 @@ enum EvalLangItem {
DropInPlace,
}
-impl<'db> Evaluator<'db> {
+impl<'a, 'db: 'a> Evaluator<'a, 'db> {
pub(super) fn detect_and_exec_special_function(
&mut self,
def: FunctionId,
args: &[IntervalAndTy<'db>],
generic_args: GenericArgs<'db>,
- locals: &Locals,
+ locals: &Locals<'a>,
destination: Interval,
span: MirSpan,
) -> Result<'db, bool> {
@@ -60,7 +59,9 @@ impl<'db> Evaluator<'db> {
);
}
let is_extern_c = match def.lookup(self.db).container {
- hir_def::ItemContainerId::ExternBlockId(block) => block.abi(self.db) == Some(sym::C),
+ hir_def::ItemContainerId::ExternBlockId(block) => {
+ matches!(block.abi(self.db), ExternAbi::C { .. })
+ }
_ => false,
};
if is_extern_c {
@@ -132,7 +133,7 @@ impl<'db> Evaluator<'db> {
def: FunctionId,
args: &[IntervalAndTy<'db>],
self_ty: Ty<'db>,
- locals: &Locals,
+ locals: &Locals<'a>,
destination: Interval,
span: MirSpan,
) -> Result<'db, ()> {
@@ -190,7 +191,7 @@ impl<'db> Evaluator<'db> {
layout: Arc<Layout>,
addr: Address,
def: FunctionId,
- locals: &Locals,
+ locals: &Locals<'a>,
destination: Interval,
span: MirSpan,
) -> Result<'db, ()> {
@@ -296,7 +297,7 @@ impl<'db> Evaluator<'db> {
it: EvalLangItem,
generic_args: GenericArgs<'db>,
args: &[IntervalAndTy<'db>],
- locals: &Locals,
+ locals: &Locals<'a>,
span: MirSpan,
) -> Result<'db, Vec<u8>> {
use EvalLangItem::*;
@@ -368,7 +369,7 @@ impl<'db> Evaluator<'db> {
id: i64,
args: &[IntervalAndTy<'db>],
destination: Interval,
- _locals: &Locals,
+ _locals: &Locals<'a>,
_span: MirSpan,
) -> Result<'db, ()> {
match id {
@@ -399,7 +400,7 @@ impl<'db> Evaluator<'db> {
args: &[IntervalAndTy<'db>],
_generic_args: GenericArgs<'db>,
destination: Interval,
- locals: &Locals,
+ locals: &Locals<'a>,
span: MirSpan,
) -> Result<'db, ()> {
match as_str {
@@ -563,7 +564,7 @@ impl<'db> Evaluator<'db> {
args: &[IntervalAndTy<'db>],
generic_args: GenericArgs<'db>,
destination: Interval,
- locals: &Locals,
+ locals: &Locals<'a>,
span: MirSpan,
needs_override: bool,
) -> Result<'db, bool> {
@@ -1202,11 +1203,7 @@ impl<'db> Evaluator<'db> {
let addr = tuple.interval.addr.offset(offset);
args.push(IntervalAndTy::new(addr, field, self, locals)?);
}
- if let Some(target) = self.lang_items().FnOnce
- && let Some(def) = target
- .trait_items(self.db)
- .method_by_name(&Name::new_symbol_root(sym::call_once))
- {
+ if let Some(def) = self.lang_items().FnOnce_call_once {
self.exec_fn_trait(
def,
&args,
@@ -1345,7 +1342,7 @@ impl<'db> Evaluator<'db> {
&mut self,
ty: Ty<'db>,
metadata: Interval,
- locals: &Locals,
+ locals: &Locals<'a>,
) -> Result<'db, (usize, usize)> {
Ok(match ty.kind() {
TyKind::Str => (from_bytes!(usize, metadata.get(self)?), 1),
@@ -1360,7 +1357,7 @@ impl<'db> Evaluator<'db> {
"dyn concrete type",
)?,
TyKind::Adt(adt_def, subst) => {
- let id = adt_def.def_id().0;
+ let id = adt_def.def_id();
let layout = self.layout_adt(id, subst)?;
let id = match id {
AdtId::StructId(s) => s,
@@ -1373,7 +1370,8 @@ impl<'db> Evaluator<'db> {
.unwrap()
.1
.get()
- .instantiate(self.interner(), subst);
+ .instantiate(self.interner(), subst)
+ .skip_norm_wip();
let sized_part_size =
layout.fields.offset(field_types.iter().count() - 1).bytes_usize();
let sized_part_align = layout.align.bytes() as usize;
@@ -1404,7 +1402,7 @@ impl<'db> Evaluator<'db> {
args: &[IntervalAndTy<'db>],
generic_args: GenericArgs<'db>,
destination: Interval,
- locals: &Locals,
+ locals: &Locals<'a>,
_span: MirSpan,
) -> Result<'db, ()> {
// We are a single threaded runtime with no UB checking and no optimization, so