Skip to content

Commit 3e14ada

Browse files
committed
rustc: Implement let assignability. r=nmatsakis
1 parent bad62dc commit 3e14ada

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

src/librustc/middle/typeck/check.rs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,16 @@ fn check_expr_with(fcx: @fn_ctxt, expr: @ast::expr, expected: ty::t) -> bool {
868868
check_expr(fcx, expr, Some(expected))
869869
}
870870

871+
fn check_expr_with_assignability(fcx: @fn_ctxt,
872+
expr: @ast::expr,
873+
expected: ty::t)
874+
-> bool {
875+
do check_expr_with_unifier(fcx, expr, Some(expected)) {
876+
demand::assign(fcx, expr.span, expected, expr)
877+
}
878+
}
879+
880+
871881
fn check_expr(fcx: @fn_ctxt, expr: @ast::expr,
872882
expected: Option<ty::t>) -> bool {
873883
return do check_expr_with_unifier(fcx, expr, expected) {
@@ -1072,11 +1082,7 @@ fn check_expr_with_unifier(fcx: @fn_ctxt,
10721082
DontDerefArgs => {}
10731083
}
10741084
1075-
bot |= check_expr_with_unifier(
1076-
fcx, *arg, Some(formal_ty),
1077-
|| demand::assign(fcx, arg.span,
1078-
formal_ty, *arg)
1079-
);
1085+
bot |= check_expr_with_assignability(fcx, *arg, formal_ty);
10801086
fcx.write_ty(arg.id, fcx.expr_ty(*arg));
10811087
10821088
}
@@ -1087,10 +1093,14 @@ fn check_expr_with_unifier(fcx: @fn_ctxt,
10871093
}
10881094
10891095
// A generic function for checking assignment expressions
1090-
fn check_assignment(fcx: @fn_ctxt, _sp: span, lhs: @ast::expr,
1091-
rhs: @ast::expr, id: ast::node_id) -> bool {
1096+
fn check_assignment(fcx: @fn_ctxt,
1097+
lhs: @ast::expr,
1098+
rhs: @ast::expr,
1099+
id: ast::node_id)
1100+
-> bool {
10921101
let mut bot = check_expr(fcx, lhs, None);
1093-
bot |= check_expr_with(fcx, rhs, fcx.expr_ty(lhs));
1102+
let lhs_type = fcx.expr_ty(lhs);
1103+
bot |= check_expr_with_assignability(fcx, rhs, lhs_type);
10941104
fcx.write_ty(id, ty::mk_nil(fcx.ccx.tcx));
10951105
return bot;
10961106
}
@@ -1908,10 +1918,10 @@ fn check_expr_with_unifier(fcx: @fn_ctxt,
19081918
};
19091919
}
19101920
ast::expr_assign(lhs, rhs) => {
1911-
bot = check_assignment(fcx, expr.span, lhs, rhs, id);
1921+
bot = check_assignment(fcx, lhs, rhs, id);
19121922
}
19131923
ast::expr_swap(lhs, rhs) => {
1914-
bot = check_assignment(fcx, expr.span, lhs, rhs, id);
1924+
bot = check_assignment(fcx, lhs, rhs, id);
19151925
}
19161926
ast::expr_if(cond, thn, elsopt) => {
19171927
bot = check_expr_with(fcx, cond, ty::mk_bool(tcx)) |
@@ -2246,7 +2256,7 @@ fn require_integral(fcx: @fn_ctxt, sp: span, t: ty::t) {
22462256
fn check_decl_initializer(fcx: @fn_ctxt, nid: ast::node_id,
22472257
init: @ast::expr) -> bool {
22482258
let lty = ty::mk_var(fcx.ccx.tcx, lookup_local(fcx, init.span, nid));
2249-
return check_expr_with(fcx, init, lty);
2259+
return check_expr_with_assignability(fcx, init, lty);
22502260
}
22512261

22522262
fn check_decl_local(fcx: @fn_ctxt, local: @ast::local) -> bool {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
fn f() {
2+
let a = ~"hello";
3+
let b: &str = a;
4+
io::println(b);
5+
}
6+
7+
fn g() {
8+
let c = ~"world";
9+
let d: &str;
10+
d = c;
11+
io::println(d);
12+
}
13+
14+
fn main() {
15+
f();
16+
g();
17+
}
18+

0 commit comments

Comments
 (0)