rustc: Propagate types for vector, tuple, record, assignment, and if expressions downward again
This commit is contained in:
parent
833af6f6f3
commit
7d0734bb96
1 changed files with 71 additions and 12 deletions
|
@ -1160,17 +1160,63 @@ fn demand_expr(&fn_ctxt fcx, @ty expected, @ast.expr e) -> @ast.expr {
|
||||||
auto e_1 = ast.expr_vec(v, ast.ann_none);
|
auto e_1 = ast.expr_vec(v, ast.ann_none);
|
||||||
|
|
||||||
alt (e.node) {
|
alt (e.node) {
|
||||||
case (ast.expr_vec(?es, ?ann)) {
|
case (ast.expr_vec(?es_0, ?ann)) {
|
||||||
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
||||||
e_1 = ast.expr_vec(es, ast.ann_type(t));
|
let vec[@ast.expr] es_1 = vec();
|
||||||
|
alt (t.struct) {
|
||||||
|
case (ty_vec(?subty)) {
|
||||||
|
for (@ast.expr e_0 in es_0) {
|
||||||
|
es_1 += vec(demand_expr(fcx, subty, e_0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case (_) {
|
||||||
|
log "vec expr doesn't have a vec type!";
|
||||||
|
fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e_1 = ast.expr_vec(es_1, ast.ann_type(t));
|
||||||
}
|
}
|
||||||
case (ast.expr_tup(?es, ?ann)) {
|
case (ast.expr_tup(?es_0, ?ann)) {
|
||||||
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
||||||
e_1 = ast.expr_tup(es, ast.ann_type(t));
|
let vec[ast.elt] elts_1 = vec();
|
||||||
|
alt (t.struct) {
|
||||||
|
case (ty_tup(?subtys)) {
|
||||||
|
auto i = 0u;
|
||||||
|
for (ast.elt elt_0 in es_0) {
|
||||||
|
auto e_1 = demand_expr(fcx, subtys.(i), elt_0.expr);
|
||||||
|
elts_1 += vec(rec(mut=elt_0.mut, expr=e_1));
|
||||||
|
i += 1u;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case (_) {
|
||||||
|
log "tup expr doesn't have a tup type!";
|
||||||
|
fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e_1 = ast.expr_tup(elts_1, ast.ann_type(t));
|
||||||
}
|
}
|
||||||
case (ast.expr_rec(?es, ?ann)) {
|
case (ast.expr_rec(?fields_0, ?ann)) {
|
||||||
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
||||||
e_1 = ast.expr_rec(es, ast.ann_type(t));
|
let vec[ast.field] fields_1 = vec();
|
||||||
|
alt (t.struct) {
|
||||||
|
case (ty_rec(?field_tys)) {
|
||||||
|
auto i = 0u;
|
||||||
|
for (ast.field field_0 in fields_0) {
|
||||||
|
check (_str.eq(field_0.ident, field_tys.(i).ident));
|
||||||
|
auto e_1 = demand_expr(fcx, field_tys.(i).ty,
|
||||||
|
field_0.expr);
|
||||||
|
fields_1 += vec(rec(mut=field_0.mut,
|
||||||
|
ident=field_0.ident,
|
||||||
|
expr=e_1));
|
||||||
|
i += 1u;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case (_) {
|
||||||
|
log "rec expr doesn't have a rec type!";
|
||||||
|
fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e_1 = ast.expr_rec(fields_1, ast.ann_type(t));
|
||||||
}
|
}
|
||||||
case (ast.expr_call(?sube, ?es, ?ann)) {
|
case (ast.expr_call(?sube, ?es, ?ann)) {
|
||||||
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
||||||
|
@ -1192,9 +1238,18 @@ fn demand_expr(&fn_ctxt fcx, @ty expected, @ast.expr e) -> @ast.expr {
|
||||||
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
||||||
e_1 = ast.expr_cast(sube, ast_ty, ast.ann_type(t));
|
e_1 = ast.expr_cast(sube, ast_ty, ast.ann_type(t));
|
||||||
}
|
}
|
||||||
case (ast.expr_if(?cond, ?then, ?els, ?ann)) {
|
case (ast.expr_if(?cond, ?then_0, ?else_0, ?ann)) {
|
||||||
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
||||||
e_1 = ast.expr_if(cond, then, els, ast.ann_type(t));
|
auto then_1 = demand_block(fcx, expected, then_0);
|
||||||
|
auto else_1;
|
||||||
|
alt (else_0) {
|
||||||
|
case (none[ast.block]) { else_1 = none[ast.block]; }
|
||||||
|
case (some[ast.block](?b_0)) {
|
||||||
|
auto b_1 = demand_block(fcx, expected, b_0);
|
||||||
|
else_1 = some[ast.block](b_1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e_1 = ast.expr_if(cond, then_1, else_1, ast.ann_type(t));
|
||||||
}
|
}
|
||||||
case (ast.expr_while(?cond, ?bloc, ?ann)) {
|
case (ast.expr_while(?cond, ?bloc, ?ann)) {
|
||||||
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
||||||
|
@ -1208,13 +1263,17 @@ fn demand_expr(&fn_ctxt fcx, @ty expected, @ast.expr e) -> @ast.expr {
|
||||||
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
||||||
e_1 = ast.expr_block(bloc, ast.ann_type(t));
|
e_1 = ast.expr_block(bloc, ast.ann_type(t));
|
||||||
}
|
}
|
||||||
case (ast.expr_assign(?lhs, ?rhs, ?ann)) {
|
case (ast.expr_assign(?lhs_0, ?rhs_0, ?ann)) {
|
||||||
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
||||||
e_1 = ast.expr_assign(lhs, rhs, ast.ann_type(t));
|
auto lhs_1 = demand_expr(fcx, expected, lhs_0);
|
||||||
|
auto rhs_1 = demand_expr(fcx, expected, rhs_0);
|
||||||
|
e_1 = ast.expr_assign(lhs_1, rhs_1, ast.ann_type(t));
|
||||||
}
|
}
|
||||||
case (ast.expr_assign_op(?op, ?lhs, ?rhs, ?ann)) {
|
case (ast.expr_assign_op(?op, ?lhs_0, ?rhs_0, ?ann)) {
|
||||||
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
||||||
e_1 = ast.expr_assign_op(op, lhs, rhs, ast.ann_type(t));
|
auto lhs_1 = demand_expr(fcx, expected, lhs_0);
|
||||||
|
auto rhs_1 = demand_expr(fcx, expected, rhs_0);
|
||||||
|
e_1 = ast.expr_assign_op(op, lhs_1, rhs_1, ast.ann_type(t));
|
||||||
}
|
}
|
||||||
case (ast.expr_field(?lhs, ?rhs, ?ann)) {
|
case (ast.expr_field(?lhs, ?rhs, ?ann)) {
|
||||||
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
|
||||||
|
|
Loading…
Reference in a new issue