use super::{BindingMode, Expectation, InferenceContext, TypeMismatch};
use crate::{
- lower::lower_to_chalk_mutability, static_lifetime, Interner, Substitution, Ty, TyBuilder,
- TyExt, TyKind,
+ infer::{Adjust, Adjustment, AutoBorrow},
+ lower::lower_to_chalk_mutability,
+ static_lifetime, Interner, Substitution, Ty, TyBuilder, TyExt, TyKind,
};
impl<'a> InferenceContext<'a> {
id: PatId,
ellipsis: Option<usize>,
) -> Ty {
- let (ty, def) = self.resolve_variant(path);
+ let (ty, def) = self.resolve_variant(path, true);
let var_data = def.map(|it| it.variant_data(self.db.upcast()));
if let Some(variant) = def {
self.write_variant_resolution(id.into(), variant);
default_bm: BindingMode,
id: PatId,
) -> Ty {
- let (ty, def) = self.resolve_variant(path);
+ let (ty, def) = self.resolve_variant(path, false);
let var_data = def.map(|it| it.variant_data(self.db.upcast()));
if let Some(variant) = def {
self.write_variant_resolution(id.into(), variant);
if is_non_ref_pat(&body, pat) {
let mut pat_adjustments = Vec::new();
while let Some((inner, _lifetime, mutability)) = expected.as_reference() {
- pat_adjustments.push(expected.clone());
+ pat_adjustments.push(Adjustment {
+ target: expected.clone(),
+ kind: Adjust::Borrow(AutoBorrow::Ref(mutability)),
+ });
expected = self.resolve_ty_shallow(inner);
default_bm = match default_bm {
BindingMode::Move => BindingMode::Ref(mutability),
Pat::Path(path) => {
// FIXME use correct resolver for the surrounding expression
let resolver = self.resolver.clone();
- self.infer_path(&resolver, path, pat.into()).unwrap_or(self.err_ty())
+ self.infer_path(&resolver, path, pat.into()).unwrap_or_else(|| self.err_ty())
}
Pat::Bind { mode, name: _, subpat } => {
let mode = if mode == &BindingAnnotation::Unannotated {