Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/infer/pat.rs')
-rw-r--r--crates/hir-ty/src/infer/pat.rs49
1 files changed, 28 insertions, 21 deletions
diff --git a/crates/hir-ty/src/infer/pat.rs b/crates/hir-ty/src/infer/pat.rs
index a02e280ac6..1b8ce5ceaf 100644
--- a/crates/hir-ty/src/infer/pat.rs
+++ b/crates/hir-ty/src/infer/pat.rs
@@ -9,7 +9,7 @@ use hir_def::{
};
use hir_expand::name::Name;
use rustc_ast_ir::Mutability;
-use rustc_type_ir::inherent::{GenericArg as _, GenericArgs as _, IntoKind, SliceLike, Ty as _};
+use rustc_type_ir::inherent::{GenericArg as _, GenericArgs as _, IntoKind, Ty as _};
use stdx::TupleExt;
use crate::{
@@ -82,7 +82,7 @@ impl<'db> InferenceContext<'_, 'db> {
{
// FIXME(DIAGNOSE): private tuple field
}
- let f = field_types[local_id];
+ let f = field_types[local_id].get();
let expected_ty = match substs {
Some(substs) => f.instantiate(self.interner(), substs),
None => f.instantiate(self.interner(), &[]),
@@ -146,7 +146,7 @@ impl<'db> InferenceContext<'_, 'db> {
variant: def,
});
}
- let f = field_types[local_id];
+ let f = field_types[local_id].get();
let expected_ty = match substs {
Some(substs) => f.instantiate(self.interner(), substs),
None => f.instantiate(self.interner(), &[]),
@@ -234,7 +234,7 @@ impl<'db> InferenceContext<'_, 'db> {
}
if let Some(uncovered) = elements.get(element_tys.len()..) {
for &elem in uncovered {
- self.infer_pat(elem, self.types.error, default_bm, decl);
+ self.infer_pat(elem, self.types.types.error, default_bm, decl);
}
}
pat_ty
@@ -270,7 +270,7 @@ impl<'db> InferenceContext<'_, 'db> {
} else if self.is_non_ref_pat(self.body, pat) {
let mut pat_adjustments = Vec::new();
while let TyKind::Ref(_lifetime, inner, mutability) = expected.kind() {
- pat_adjustments.push(expected);
+ pat_adjustments.push(expected.store());
expected = self.table.try_structurally_resolve_type(inner);
default_bm = match default_bm {
BindingMode::Move => BindingMode::Ref(mutability),
@@ -333,7 +333,10 @@ impl<'db> InferenceContext<'_, 'db> {
Err(_) => {
self.result.type_mismatches.get_or_insert_default().insert(
pat.into(),
- TypeMismatch { expected, actual: ty_inserted_vars },
+ TypeMismatch {
+ expected: expected.store(),
+ actual: ty_inserted_vars.store(),
+ },
);
self.write_pat_ty(pat, ty);
// We return `expected` to prevent cascading errors. I guess an alternative is to
@@ -372,7 +375,7 @@ impl<'db> InferenceContext<'_, 'db> {
Some((adt, subst)) if adt == box_adt => {
(subst.type_at(0), subst.as_slice().get(1).and_then(|a| a.as_type()))
}
- _ => (self.types.error, None),
+ _ => (self.types.types.error, None),
};
let inner_ty = self.infer_pat(*inner, inner_ty, default_bm, decl);
@@ -413,10 +416,10 @@ impl<'db> InferenceContext<'_, 'db> {
) {
Ok(ty) => ty,
Err(_) => {
- self.result
- .type_mismatches
- .get_or_insert_default()
- .insert(pat.into(), TypeMismatch { expected, actual: lhs_ty });
+ self.result.type_mismatches.get_or_insert_default().insert(
+ pat.into(),
+ TypeMismatch { expected: expected.store(), actual: lhs_ty.store() },
+ );
// `rhs_ty` is returned so no further type mismatches are
// reported because of this mismatch.
expected
@@ -432,22 +435,22 @@ impl<'db> InferenceContext<'_, 'db> {
let ty = self.insert_type_vars_shallow(ty);
// FIXME: This never check is odd, but required with out we do inference right now
if !expected.is_never() && !self.unify(ty, expected) {
- self.result
- .type_mismatches
- .get_or_insert_default()
- .insert(pat.into(), TypeMismatch { expected, actual: ty });
+ self.result.type_mismatches.get_or_insert_default().insert(
+ pat.into(),
+ TypeMismatch { expected: expected.store(), actual: ty.store() },
+ );
}
self.write_pat_ty(pat, ty);
self.pat_ty_after_adjustment(pat)
}
fn pat_ty_after_adjustment(&self, pat: PatId) -> Ty<'db> {
- *self
- .result
+ self.result
.pat_adjustments
.get(&pat)
.and_then(|it| it.last())
- .unwrap_or(&self.result.type_of_pat[pat])
+ .unwrap_or_else(|| &self.result.type_of_pat[pat])
+ .as_ref()
}
fn infer_ref_pat(
@@ -571,10 +574,14 @@ impl<'db> InferenceContext<'_, 'db> {
{
let inner = self.table.try_structurally_resolve_type(inner);
if matches!(inner.kind(), TyKind::Slice(_)) {
- let elem_ty = self.types.u8;
+ let elem_ty = self.types.types.u8;
let slice_ty = Ty::new_slice(self.interner(), elem_ty);
- let ty =
- Ty::new_ref(self.interner(), self.types.re_static, slice_ty, Mutability::Not);
+ let ty = Ty::new_ref(
+ self.interner(),
+ self.types.regions.statik,
+ slice_ty,
+ Mutability::Not,
+ );
self.write_expr_ty(expr, ty);
return ty;
}