|
12 | 12 | use middle::ty; |
13 | 13 | use middle::typeck::check::FnCtxt; |
14 | 14 | use middle::typeck::infer; |
| 15 | +use middle::typeck::infer::resolve_type; |
| 16 | +use middle::typeck::infer::resolve::try_resolve_tvar_shallow; |
15 | 17 |
|
16 | 18 | use std::result::{Err, Ok}; |
17 | 19 | use std::result; |
18 | 20 | use syntax::ast; |
19 | 21 | use syntax::codemap::Span; |
| 22 | +use util::ppaux::Repr; |
20 | 23 |
|
21 | 24 | // Requires that the two types unify, and prints an error message if they |
22 | 25 | // don't. |
@@ -58,6 +61,13 @@ pub fn eqtype(fcx: &FnCtxt, sp: Span, expected: ty::t, actual: ty::t) { |
58 | 61 | // Checks that the type `actual` can be coerced to `expected`. |
59 | 62 | pub fn coerce(fcx: &FnCtxt, sp: Span, expected: ty::t, expr: &ast::Expr) { |
60 | 63 | let expr_ty = fcx.expr_ty(expr); |
| 64 | + debug!("demand::coerce(expected = {}, expr_ty = {})", |
| 65 | + expected.repr(fcx.ccx.tcx), |
| 66 | + expr_ty.repr(fcx.ccx.tcx)); |
| 67 | + let expected = if ty::type_needs_infer(expected) { |
| 68 | + resolve_type(fcx.infcx(), expected, |
| 69 | + try_resolve_tvar_shallow).unwrap_or(expected) |
| 70 | + } else { expected }; |
61 | 71 | match fcx.mk_assignty(expr, expr_ty, expected) { |
62 | 72 | result::Ok(()) => { /* ok */ } |
63 | 73 | result::Err(ref err) => { |
|
0 commit comments