Merge branch 'master' of github.com:graydon/rust

This commit is contained in:
Eric Holk 2011-08-05 15:27:23 -07:00
commit 244efa6331
4 changed files with 41 additions and 9 deletions

View File

@ -183,6 +183,11 @@ fn kill_prestate(fcx: &fn_ctxt, id: node_id, c: &tsconstr) -> bool {
node_id_to_ts_ann(fcx.ccx, id).states);
}
fn kill_all_prestate(fcx: &fn_ctxt, id: node_id) {
tritv::tritv_kill(node_id_to_ts_ann(fcx.ccx, id).states.prestate);
}
fn kill_poststate(fcx: &fn_ctxt, id: node_id, c: &tsconstr) -> bool {
log "kill_poststate";
ret clear_in_poststate(bit_num(fcx, c),

View File

@ -594,6 +594,7 @@ fn find_pre_post_state_stmt(fcx: &fn_ctxt, pres: &prestate, s: @stmt)
-> bool {
let stmt_ann = stmt_to_ann(fcx.ccx, *s);
/*
log_err ("[" + fcx.name + "]");
log_err "*At beginning: stmt = ";
log_stmt_err(*s);
log_err "*prestate = ";
@ -617,7 +618,8 @@ fn find_pre_post_state_stmt(fcx: &fn_ctxt, pres: &prestate, s: @stmt)
let changed = (set_poststate(stmt_ann, c_and_p.post)
| c_and_p.changed);
/*
/*
log_err "Summary: stmt = ";
log_stmt_err(*s);
log_err "prestate = ";
@ -638,11 +640,12 @@ fn find_pre_post_state_stmt(fcx: &fn_ctxt, pres: &prestate, s: @stmt)
}
}
stmt_expr(ex, _) {
ret find_pre_post_state_expr(fcx, pres, ex) |
let changed = find_pre_post_state_expr(fcx, pres, ex) |
set_prestate(stmt_ann, expr_prestate(fcx.ccx, ex)) |
set_poststate(stmt_ann, expr_poststate(fcx.ccx, ex));
/*
log_err "Finally:";
/*
log_err "Finally:";
log_stmt_err(*s);
log_err("prestate = ");
// log_err(bitv::to_str(stmt_ann.states.prestate));
@ -651,8 +654,9 @@ fn find_pre_post_state_stmt(fcx: &fn_ctxt, pres: &prestate, s: @stmt)
// log_err(bitv::to_str(stmt_ann.states.poststate));
log_tritv_err(fcx, stmt_ann.states.poststate);
log_err("changed =");
log_err(changed);
*/
*/
ret changed;
}
_ { ret false; }
}
@ -707,9 +711,9 @@ fn find_pre_post_state_block(fcx: &fn_ctxt, pres0: &prestate, b: &blk) ->
fn find_pre_post_state_fn(fcx: &fn_ctxt, f: &_fn) -> bool {
let num_constrs = num_constraints(fcx.enclosing);
// make sure the return and diverge bits start out False
kill_prestate(fcx, f.body.node.id, fcx.enclosing.i_return);
kill_prestate(fcx, f.body.node.id, fcx.enclosing.i_diverge);
// All constraints are considered false until proven otherwise.
// This ensures that intersect works correctly.
kill_all_prestate(fcx, f.body.node.id);
// Instantiate any constraints on the arguments so we can use them
let block_pre = block_prestate(fcx.ccx, f.body);

View File

@ -16,6 +16,7 @@ export tritv_union;
export tritv_intersect;
export tritv_copy;
export tritv_clear;
export tritv_kill;
export tritv_doesntcare;
export to_str;
@ -218,6 +219,11 @@ fn tritv_clear(v: &t) {
while i < v.nbits { tritv_set(i, v, dont_care); i += 1u; }
}
fn tritv_kill(v: &t) {
let i: uint = 0u;
while i < v.nbits { tritv_set(i, v, tfalse); i += 1u; }
}
fn tritv_clone(v: &t) -> t {
ret {uncertain: bitv::clone(v.uncertain),
val: bitv::clone(v.val),

View File

@ -0,0 +1,17 @@
// error-pattern:Unsatisfied precondition constraint
// a good test that we merge paths correctly in the presence of a
// variable that's used before it's declared
// should be rejected by typestate because we use x without initializing it
fn my_fail() -> ! { fail; }
fn main() {
alt (true) {
false { my_fail(); }
true {}
}
log x;
let x:int;
}