mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
autoderef final ty is already resolved
This commit is contained in:
@@ -202,14 +202,10 @@ pub fn structurally_normalize_ty(
|
||||
Some((normalized_ty, ocx.into_pending_obligations()))
|
||||
}
|
||||
|
||||
/// Returns the final type we ended up with, which may be an inference
|
||||
/// variable (we will resolve it first, if we want).
|
||||
pub fn final_ty(&self, resolve: bool) -> Ty<'tcx> {
|
||||
if resolve {
|
||||
self.infcx.resolve_vars_if_possible(self.state.cur_ty)
|
||||
} else {
|
||||
self.state.cur_ty
|
||||
}
|
||||
/// Returns the final type we ended up with, which may be an unresolved
|
||||
/// inference variable.
|
||||
pub fn final_ty(&self) -> Ty<'tcx> {
|
||||
self.state.cur_ty
|
||||
}
|
||||
|
||||
pub fn step_count(&self) -> usize {
|
||||
|
||||
@@ -42,7 +42,7 @@ pub(crate) fn adjust_steps_as_infer_ok(
|
||||
|
||||
let mut obligations = PredicateObligations::new();
|
||||
let targets =
|
||||
steps.iter().skip(1).map(|&(ty, _)| ty).chain(iter::once(autoderef.final_ty(false)));
|
||||
steps.iter().skip(1).map(|&(ty, _)| ty).chain(iter::once(autoderef.final_ty()));
|
||||
let steps: Vec<_> = steps
|
||||
.iter()
|
||||
.map(|&(source, kind)| {
|
||||
|
||||
@@ -86,7 +86,7 @@ pub(crate) fn check_expr_call(
|
||||
result = self.try_overloaded_call_step(call_expr, callee_expr, arg_exprs, &autoderef);
|
||||
}
|
||||
|
||||
match autoderef.final_ty(false).kind() {
|
||||
match autoderef.final_ty().kind() {
|
||||
ty::FnDef(def_id, _) => {
|
||||
let abi = self.tcx.fn_sig(def_id).skip_binder().skip_binder().abi;
|
||||
self.check_call_abi(abi, call_expr.span);
|
||||
@@ -200,8 +200,7 @@ fn try_overloaded_call_step(
|
||||
arg_exprs: &'tcx [hir::Expr<'tcx>],
|
||||
autoderef: &Autoderef<'a, 'tcx>,
|
||||
) -> Option<CallStep<'tcx>> {
|
||||
let adjusted_ty =
|
||||
self.structurally_resolve_type(autoderef.span(), autoderef.final_ty(false));
|
||||
let adjusted_ty = self.structurally_resolve_type(autoderef.span(), autoderef.final_ty());
|
||||
|
||||
// If the callee is a function pointer or a closure, then we're all set.
|
||||
match *adjusted_ty.kind() {
|
||||
|
||||
@@ -2918,7 +2918,7 @@ fn check_expr_field(
|
||||
// Emits an error if we deref an infer variable, like calling `.field` on a base type
|
||||
// of `&_`. We can also use this to suppress unnecessary "missing field" errors that
|
||||
// will follow ambiguity errors.
|
||||
let final_ty = self.structurally_resolve_type(autoderef.span(), autoderef.final_ty(false));
|
||||
let final_ty = self.structurally_resolve_type(autoderef.span(), autoderef.final_ty());
|
||||
if let ty::Error(_) = final_ty.kind() {
|
||||
return final_ty;
|
||||
}
|
||||
|
||||
@@ -629,7 +629,7 @@ pub(crate) fn method_autoderef_steps<'tcx>(
|
||||
.collect();
|
||||
(steps, autoderef_via_deref.reached_recursion_limit())
|
||||
};
|
||||
let final_ty = autoderef_via_deref.final_ty(true);
|
||||
let final_ty = autoderef_via_deref.final_ty();
|
||||
let opt_bad_ty = match final_ty.kind() {
|
||||
ty::Infer(ty::TyVar(_)) | ty::Error(_) => Some(MethodAutoderefBadTy {
|
||||
reached_raw_pointer,
|
||||
|
||||
@@ -109,8 +109,7 @@ fn try_index_step(
|
||||
index_ty: Ty<'tcx>,
|
||||
index_expr: &hir::Expr<'_>,
|
||||
) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
|
||||
let adjusted_ty =
|
||||
self.structurally_resolve_type(autoderef.span(), autoderef.final_ty(false));
|
||||
let adjusted_ty = self.structurally_resolve_type(autoderef.span(), autoderef.final_ty());
|
||||
debug!(
|
||||
"try_index_step(expr={:?}, base_expr={:?}, adjusted_ty={:?}, \
|
||||
index_ty={:?})",
|
||||
|
||||
Reference in New Issue
Block a user