Rename resolve_type_vars_with_obligations to
resolve_vars_with_obligations, as it now also resolves const variables.
This commit is contained in:
parent
925e3042f6
commit
9cefcd3051
@ -811,7 +811,7 @@ pub fn try_coerce(
|
||||
target: Ty<'tcx>,
|
||||
allow_two_phase: AllowTwoPhase,
|
||||
) -> RelateResult<'tcx, Ty<'tcx>> {
|
||||
let source = self.resolve_type_vars_with_obligations(expr_ty);
|
||||
let source = self.resolve_vars_with_obligations(expr_ty);
|
||||
debug!("coercion::try({:?}: {:?} -> {:?})", expr, source, target);
|
||||
|
||||
let cause = self.cause(expr.span, ObligationCauseCode::ExprAssignable);
|
||||
@ -829,7 +829,7 @@ pub fn try_coerce(
|
||||
|
||||
/// Same as `try_coerce()`, but without side-effects.
|
||||
pub fn can_coerce(&self, expr_ty: Ty<'tcx>, target: Ty<'tcx>) -> bool {
|
||||
let source = self.resolve_type_vars_with_obligations(expr_ty);
|
||||
let source = self.resolve_vars_with_obligations(expr_ty);
|
||||
debug!("coercion::can({:?} -> {:?})", source, target);
|
||||
|
||||
let cause = self.cause(syntax_pos::DUMMY_SP, ObligationCauseCode::ExprAssignable);
|
||||
@ -853,8 +853,8 @@ fn try_find_coercion_lub<E>(&self,
|
||||
-> RelateResult<'tcx, Ty<'tcx>>
|
||||
where E: AsCoercionSite
|
||||
{
|
||||
let prev_ty = self.resolve_type_vars_with_obligations(prev_ty);
|
||||
let new_ty = self.resolve_type_vars_with_obligations(new_ty);
|
||||
let prev_ty = self.resolve_vars_with_obligations(prev_ty);
|
||||
let new_ty = self.resolve_vars_with_obligations(new_ty);
|
||||
debug!("coercion::try_find_coercion_lub({:?}, {:?})", prev_ty, new_ty);
|
||||
|
||||
// Special-case that coercion alone cannot handle:
|
||||
@ -1333,7 +1333,7 @@ fn report_return_mismatched_types<'a>(
|
||||
err.span_label(return_sp, "expected because this return type...");
|
||||
err.span_label( *sp, format!(
|
||||
"...is found to be `{}` here",
|
||||
fcx.resolve_type_vars_with_obligations(expected),
|
||||
fcx.resolve_vars_with_obligations(expected),
|
||||
));
|
||||
}
|
||||
err
|
||||
|
@ -108,7 +108,7 @@ pub fn demand_coerce_diag(&self,
|
||||
expected: Ty<'tcx>,
|
||||
allow_two_phase: AllowTwoPhase)
|
||||
-> (Ty<'tcx>, Option<DiagnosticBuilder<'tcx>>) {
|
||||
let expected = self.resolve_type_vars_with_obligations(expected);
|
||||
let expected = self.resolve_vars_with_obligations(expected);
|
||||
|
||||
let e = match self.try_coerce(expr, checked_ty, expected, allow_two_phase) {
|
||||
Ok(ty) => return (ty, None),
|
||||
@ -117,7 +117,7 @@ pub fn demand_coerce_diag(&self,
|
||||
|
||||
let expr = expr.peel_drop_temps();
|
||||
let cause = self.misc(expr.span);
|
||||
let expr_ty = self.resolve_type_vars_with_obligations(checked_ty);
|
||||
let expr_ty = self.resolve_vars_with_obligations(checked_ty);
|
||||
let mut err = self.report_mismatched_types(&cause, expected, expr_ty, e);
|
||||
|
||||
if self.is_assign_to_bool(expr, expected) {
|
||||
|
@ -1010,7 +1010,7 @@ fn check_expr_tuple(
|
||||
expr: &'tcx hir::Expr,
|
||||
) -> Ty<'tcx> {
|
||||
let flds = expected.only_has_type(self).and_then(|ty| {
|
||||
let ty = self.resolve_type_vars_with_obligations(ty);
|
||||
let ty = self.resolve_vars_with_obligations(ty);
|
||||
match ty.kind {
|
||||
ty::Tuple(ref flds) => Some(&flds[..]),
|
||||
_ => None
|
||||
|
@ -919,7 +919,7 @@ fn is_local(ty: Ty<'_>) -> bool {
|
||||
// This occurs for UFCS desugaring of `T::method`, where there is no
|
||||
// receiver expression for the method call, and thus no autoderef.
|
||||
if let SelfSource::QPath(_) = source {
|
||||
return is_local(self.resolve_type_vars_with_obligations(rcvr_ty));
|
||||
return is_local(self.resolve_vars_with_obligations(rcvr_ty));
|
||||
}
|
||||
|
||||
self.autoderef(span, rcvr_ty).any(|(ty, _)| is_local(ty))
|
||||
|
@ -2440,23 +2440,23 @@ pub fn misc(&self, span: Span) -> ObligationCause<'tcx> {
|
||||
self.cause(span, ObligationCauseCode::MiscObligation)
|
||||
}
|
||||
|
||||
/// Resolves type variables in `ty` if possible. Unlike the infcx
|
||||
/// Resolves type and const variables in `ty` if possible. Unlike the infcx
|
||||
/// version (resolve_vars_if_possible), this version will
|
||||
/// also select obligations if it seems useful, in an effort
|
||||
/// to get more type information.
|
||||
fn resolve_type_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
debug!("resolve_type_vars_with_obligations(ty={:?})", ty);
|
||||
fn resolve_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
debug!("resolve_vars_with_obligations(ty={:?})", ty);
|
||||
|
||||
// No Infer()? Nothing needs doing.
|
||||
if !ty.has_infer_types() && !ty.has_infer_consts() {
|
||||
debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
|
||||
debug!("resolve_vars_with_obligations: ty={:?}", ty);
|
||||
return ty;
|
||||
}
|
||||
|
||||
// If `ty` is a type variable, see whether we already know what it is.
|
||||
ty = self.resolve_vars_if_possible(&ty);
|
||||
if !ty.has_infer_types() && !ty.has_infer_consts() {
|
||||
debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
|
||||
debug!("resolve_vars_with_obligations: ty={:?}", ty);
|
||||
return ty;
|
||||
}
|
||||
|
||||
@ -2467,7 +2467,7 @@ fn resolve_type_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
self.select_obligations_where_possible(false, |_| {});
|
||||
ty = self.resolve_vars_if_possible(&ty);
|
||||
|
||||
debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
|
||||
debug!("resolve_vars_with_obligations: ty={:?}", ty);
|
||||
ty
|
||||
}
|
||||
|
||||
@ -3668,7 +3668,7 @@ fn expected_inputs_for_expected_output(&self,
|
||||
formal_ret: Ty<'tcx>,
|
||||
formal_args: &[Ty<'tcx>])
|
||||
-> Vec<Ty<'tcx>> {
|
||||
let formal_ret = self.resolve_type_vars_with_obligations(formal_ret);
|
||||
let formal_ret = self.resolve_vars_with_obligations(formal_ret);
|
||||
let ret_ty = match expected_ret.only_has_type(self) {
|
||||
Some(ret) => ret,
|
||||
None => return Vec::new()
|
||||
@ -4517,7 +4517,7 @@ fn suggest_missing_return_type(
|
||||
err.span_suggestion(
|
||||
span,
|
||||
"try adding a return type",
|
||||
format!("-> {} ", self.resolve_type_vars_with_obligations(found)),
|
||||
format!("-> {} ", self.resolve_vars_with_obligations(found)),
|
||||
Applicability::MachineApplicable);
|
||||
true
|
||||
}
|
||||
@ -4993,7 +4993,7 @@ fn check_rustc_args_require_const(&self,
|
||||
// If no resolution is possible, then an error is reported.
|
||||
// Numeric inference variables may be left unresolved.
|
||||
pub fn structurally_resolved_type(&self, sp: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
|
||||
let ty = self.resolve_type_vars_with_obligations(ty);
|
||||
let ty = self.resolve_vars_with_obligations(ty);
|
||||
if !ty.is_ty_var() {
|
||||
ty
|
||||
} else {
|
||||
|
@ -179,7 +179,7 @@ fn check_overloaded_binop(
|
||||
self.check_expr_with_needs(lhs_expr, Needs::MutPlace)
|
||||
}
|
||||
};
|
||||
let lhs_ty = self.resolve_type_vars_with_obligations(lhs_ty);
|
||||
let lhs_ty = self.resolve_vars_with_obligations(lhs_ty);
|
||||
|
||||
// N.B., as we have not yet type-checked the RHS, we don't have the
|
||||
// type at hand. Make a variable to represent it. The whole reason
|
||||
@ -196,7 +196,7 @@ fn check_overloaded_binop(
|
||||
|
||||
// see `NB` above
|
||||
let rhs_ty = self.check_expr_coercable_to_type(rhs_expr, rhs_ty_var);
|
||||
let rhs_ty = self.resolve_type_vars_with_obligations(rhs_ty);
|
||||
let rhs_ty = self.resolve_vars_with_obligations(rhs_ty);
|
||||
|
||||
let return_ty = match result {
|
||||
Ok(method) => {
|
||||
|
@ -251,7 +251,7 @@ fn peel_off_references(
|
||||
expected: Ty<'tcx>,
|
||||
mut def_bm: BindingMode,
|
||||
) -> (Ty<'tcx>, BindingMode) {
|
||||
let mut expected = self.resolve_type_vars_with_obligations(&expected);
|
||||
let mut expected = self.resolve_vars_with_obligations(&expected);
|
||||
|
||||
// Peel off as many `&` or `&mut` from the scrutinee type as possible. For example,
|
||||
// for `match &&&mut Some(5)` the loop runs three times, aborting when it reaches
|
||||
|
Loading…
Reference in New Issue
Block a user