typeck/expr.rs: extract out check_expr_array.
This commit is contained in:
parent
fe004da37a
commit
877d834c65
1 changed files with 38 additions and 29 deletions
|
@ -125,35 +125,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
self.check_expr_with_expectation(e, expected)
|
self.check_expr_with_expectation(e, expected)
|
||||||
}
|
}
|
||||||
ExprKind::Array(ref args) => {
|
ExprKind::Array(ref args) => {
|
||||||
let uty = expected.to_option(self).and_then(|uty| {
|
self.check_expr_array(args, expected, expr)
|
||||||
match uty.sty {
|
|
||||||
ty::Array(ty, _) | ty::Slice(ty) => Some(ty),
|
|
||||||
_ => None
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let element_ty = if !args.is_empty() {
|
|
||||||
let coerce_to = uty.unwrap_or_else(|| {
|
|
||||||
self.next_ty_var(TypeVariableOrigin {
|
|
||||||
kind: TypeVariableOriginKind::TypeInference,
|
|
||||||
span: expr.span,
|
|
||||||
})
|
|
||||||
});
|
|
||||||
let mut coerce = CoerceMany::with_coercion_sites(coerce_to, args);
|
|
||||||
assert_eq!(self.diverges.get(), Diverges::Maybe);
|
|
||||||
for e in args {
|
|
||||||
let e_ty = self.check_expr_with_hint(e, coerce_to);
|
|
||||||
let cause = self.misc(e.span);
|
|
||||||
coerce.coerce(self, &cause, e, e_ty);
|
|
||||||
}
|
|
||||||
coerce.complete(self)
|
|
||||||
} else {
|
|
||||||
self.next_ty_var(TypeVariableOrigin {
|
|
||||||
kind: TypeVariableOriginKind::TypeInference,
|
|
||||||
span: expr.span,
|
|
||||||
})
|
|
||||||
};
|
|
||||||
tcx.mk_array(element_ty, args.len() as u64)
|
|
||||||
}
|
}
|
||||||
ExprKind::Repeat(ref element, ref count) => {
|
ExprKind::Repeat(ref element, ref count) => {
|
||||||
let count_def_id = tcx.hir().local_def_id_from_hir_id(count.hir_id);
|
let count_def_id = tcx.hir().local_def_id_from_hir_id(count.hir_id);
|
||||||
|
@ -815,4 +787,41 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn check_expr_array(
|
||||||
|
&self,
|
||||||
|
args: &'tcx [hir::Expr],
|
||||||
|
expected: Expectation<'tcx>,
|
||||||
|
expr: &'tcx hir::Expr
|
||||||
|
) -> Ty<'tcx> {
|
||||||
|
let uty = expected.to_option(self).and_then(|uty| {
|
||||||
|
match uty.sty {
|
||||||
|
ty::Array(ty, _) | ty::Slice(ty) => Some(ty),
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let element_ty = if !args.is_empty() {
|
||||||
|
let coerce_to = uty.unwrap_or_else(|| {
|
||||||
|
self.next_ty_var(TypeVariableOrigin {
|
||||||
|
kind: TypeVariableOriginKind::TypeInference,
|
||||||
|
span: expr.span,
|
||||||
|
})
|
||||||
|
});
|
||||||
|
let mut coerce = CoerceMany::with_coercion_sites(coerce_to, args);
|
||||||
|
assert_eq!(self.diverges.get(), Diverges::Maybe);
|
||||||
|
for e in args {
|
||||||
|
let e_ty = self.check_expr_with_hint(e, coerce_to);
|
||||||
|
let cause = self.misc(e.span);
|
||||||
|
coerce.coerce(self, &cause, e, e_ty);
|
||||||
|
}
|
||||||
|
coerce.complete(self)
|
||||||
|
} else {
|
||||||
|
self.next_ty_var(TypeVariableOrigin {
|
||||||
|
kind: TypeVariableOriginKind::TypeInference,
|
||||||
|
span: expr.span,
|
||||||
|
})
|
||||||
|
};
|
||||||
|
self.tcx.mk_array(element_ty, args.len() as u64)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue