Skip to content

Commit 3732d60

Browse files
committed
---
yaml --- r: 7523 b: refs/heads/master c: c759280 h: refs/heads/master i: 7521: ba39898 7519: 686bcea v: v3
1 parent 2ecf271 commit 3732d60

File tree

3 files changed

+42
-51
lines changed

3 files changed

+42
-51
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: b58f2b7bfb4e1a48540c5fd9d444f2a45590da35
2+
refs/heads/master: c7592803d9b6da9e3d3a89342104de6bb4c59334

trunk/src/comp/middle/tstate/states.rs

Lines changed: 36 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import syntax::ast::*;
1010
import syntax::ast_util::*;
1111
import syntax::codemap::span;
1212
import middle::ty::{expr_ty, type_is_bot};
13-
import util::common::{field_exprs, has_nonlocal_exits};
13+
import util::common::*;
1414
import driver::session::session;
1515

1616
fn forbid_upvar(fcx: fn_ctxt, rhs_id: node_id, sp: span, t: oper_type) {
@@ -384,20 +384,19 @@ fn find_pre_post_state_expr(fcx: fn_ctxt, pres: prestate, e: @expr) -> bool {
384384
set_poststate_ann(fcx.ccx, e.id, block_poststate(fcx.ccx, b));
385385
}
386386
expr_rec(fields, maybe_base) {
387+
let exs = field_exprs(fields);
387388
let changed =
388389
find_pre_post_state_exprs(fcx, pres, e.id,
389390
vec::init_elt(init_assign,
390391
vec::len(fields)),
391-
field_exprs(fields), return_val);
392-
alt maybe_base {
393-
none {/* do nothing */ }
394-
some(base) {
395-
changed |=
396-
find_pre_post_state_expr(fcx, pres, base) |
397-
set_poststate_ann(fcx.ccx, e.id,
398-
expr_poststate(fcx.ccx, base));
399-
}
400-
}
392+
exs, return_val);
393+
394+
let base_pres = alt vec::last(exs) { none { pres }
395+
some(f) { expr_poststate(fcx.ccx, f) }};
396+
option::may(maybe_base, {|base|
397+
changed |= find_pre_post_state_expr(fcx, base_pres, base) |
398+
set_poststate_ann(fcx.ccx, e.id,
399+
expr_poststate(fcx.ccx, base))});
401400
ret changed;
402401
}
403402
expr_tup(elts) {
@@ -591,12 +590,8 @@ fn find_pre_post_state_expr(fcx: fn_ctxt, pres: prestate, e: @expr) -> bool {
591590
}
592591
ret set_prestate_ann(fcx.ccx, e.id, pres) |
593592
set_poststate_ann(fcx.ccx, e.id, post) |
594-
alt maybe_fail_val {
595-
none { false }
596-
some(fail_val) {
597-
find_pre_post_state_expr(fcx, pres, fail_val)
598-
}
599-
}
593+
option::maybe(false, maybe_fail_val, {|fail_val|
594+
find_pre_post_state_expr(fcx, pres, fail_val)});
600595
}
601596
expr_assert(p) {
602597
ret find_pre_post_state_sub(fcx, pres, p, e.id, none);
@@ -617,18 +612,14 @@ fn find_pre_post_state_expr(fcx: fn_ctxt, pres: prestate, e: @expr) -> bool {
617612
fn find_pre_post_state_stmt(fcx: fn_ctxt, pres: prestate, s: @stmt) -> bool {
618613
let stmt_ann = stmt_to_ann(fcx.ccx, *s);
619614

620-
/*
621-
log(error, ("[" + fcx.name + "]"));
622-
#error("*At beginning: stmt = ");
623-
log_stmt_err(*s);
624-
#error("*prestate = ");
625-
log_tritv_err(fcx, stmt_ann.states.prestate);
626-
#error("*poststate =");
627-
log_tritv_err(fcx, stmt_ann.states.poststate);
628-
#error("pres = ");
629-
log_tritv_err(fcx, pres);
630-
*/
631-
615+
log(debug, "[" + fcx.name + "]");
616+
#debug("*At beginning: stmt = ");
617+
log_stmt(*s);
618+
#debug("*prestate = ");
619+
log(debug, tritv::to_str(stmt_ann.states.prestate));
620+
#debug("*poststate =");
621+
log(debug, tritv::to_str(stmt_ann.states.prestate));
622+
632623
alt s.node {
633624
stmt_decl(adecl, id) {
634625
alt adecl.node {
@@ -643,16 +634,14 @@ fn find_pre_post_state_stmt(fcx: fn_ctxt, pres: prestate, s: @stmt) -> bool {
643634
let changed =
644635
set_poststate(stmt_ann, c_and_p.post) | c_and_p.changed;
645636

646-
/*
647-
#error("Summary: stmt = ");
648-
log_stmt_err(*s);
649-
#error("prestate = ");
650-
log_tritv_err(fcx, stmt_ann.states.prestate);
651-
#error("poststate =");
652-
log_tritv_err(fcx, stmt_ann.states.poststate);
653-
#error("changed =");
654-
log(error, changed);
655-
*/
637+
#debug("Summary: stmt = ");
638+
log_stmt(*s);
639+
#debug("prestate = ");
640+
log(debug, tritv::to_str(stmt_ann.states.prestate));
641+
#debug("poststate =");
642+
log(debug, tritv::to_str(stmt_ann.states.prestate));
643+
#debug("changed =");
644+
log(debug, changed);
656645

657646
ret changed;
658647
}
@@ -668,17 +657,14 @@ fn find_pre_post_state_stmt(fcx: fn_ctxt, pres: prestate, s: @stmt) -> bool {
668657
set_prestate(stmt_ann, expr_prestate(fcx.ccx, ex)) |
669658
set_poststate(stmt_ann, expr_poststate(fcx.ccx, ex));
670659

671-
/*
672-
#error("Finally:");
673-
log_stmt_err(*s);
674-
log_err("prestate = ");
675-
log_err(bitv::to_str(stmt_ann.states.prestate));
676-
log_tritv_err(fcx, stmt_ann.states.prestate);
677-
log_err("poststate =");
678-
log_err(bitv::to_str(stmt_ann.states.poststate));
679-
log_tritv_err(fcx, stmt_ann.states.poststate);
680-
log_err("changed =");
681-
*/
660+
661+
#debug("Finally:");
662+
log_stmt(*s);
663+
log(debug, "prestate = ");
664+
log(debug, tritv::to_str(stmt_ann.states.prestate));
665+
#debug("poststate =");
666+
log(debug, (tritv::to_str(stmt_ann.states.poststate)));
667+
#debug("changed =");
682668

683669
ret changed;
684670
}

trunk/src/test/run-fail/issue-948.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// error-pattern:beep boop
2+
fn main() {
3+
let origin = {x: 0, y: 0};
4+
let f = {x: (fail "beep boop") with origin};
5+
}

0 commit comments

Comments
 (0)