From 13c924c049465f91dda8b7cee416d1fceaf4a596 Mon Sep 17 00:00:00 2001 From: Paul Stansifer Date: Wed, 9 May 2012 09:17:27 -0700 Subject: [PATCH] Remove `do { ... } while ...` from the language. --- src/fuzzer/fuzzer.rs | 3 -- src/librustsyntax/ast.rs | 1 - src/librustsyntax/fold.rs | 3 -- src/librustsyntax/parse/classify.rs | 4 +-- src/librustsyntax/parse/parser.rs | 11 ------ src/librustsyntax/print/pprust.rs | 8 ----- src/librustsyntax/visit.rs | 1 - src/rustc/middle/alias.rs | 2 +- src/rustc/middle/borrowck.rs | 6 ++-- src/rustc/middle/check_loop.rs | 2 +- src/rustc/middle/last_use.rs | 2 +- src/rustc/middle/trans/base.rs | 21 ------------ src/rustc/middle/trans/type_use.rs | 7 ++-- .../middle/tstate/pre_post_conditions.rs | 19 ----------- src/rustc/middle/tstate/states.rs | 34 ------------------- src/rustc/middle/typeck.rs | 5 --- 16 files changed, 11 insertions(+), 118 deletions(-) diff --git a/src/fuzzer/fuzzer.rs b/src/fuzzer/fuzzer.rs index 594748e2eb9..dd65b0142ea 100644 --- a/src/fuzzer/fuzzer.rs +++ b/src/fuzzer/fuzzer.rs @@ -74,9 +74,6 @@ fn dsl(l: ast::lit_) -> ast::lit { ast::expr_alt(_, _, _) { false } ast::expr_while(_, _) { false } - // https://github.com/mozilla/rust/issues/955 - ast::expr_do_while(_, _) { false } - // https://github.com/mozilla/rust/issues/929 ast::expr_cast(_, _) { false } ast::expr_assert(_) { false } diff --git a/src/librustsyntax/ast.rs b/src/librustsyntax/ast.rs index 210244eca91..fb97751fd51 100644 --- a/src/librustsyntax/ast.rs +++ b/src/librustsyntax/ast.rs @@ -305,7 +305,6 @@ enum expr_ { expr_cast(@expr, @ty), expr_if(@expr, blk, option<@expr>), expr_while(@expr, blk), - expr_do_while(blk, @expr), /* Conditionless loop (can be exited with break, cont, ret, or fail) Same semantics as while(true) { body }, but typestate knows that the (implicit) condition is always true. */ diff --git a/src/librustsyntax/fold.rs b/src/librustsyntax/fold.rs index ebc65c9db38..7e5a315a1e1 100644 --- a/src/librustsyntax/fold.rs +++ b/src/librustsyntax/fold.rs @@ -444,9 +444,6 @@ fn fold_field_(field: field, fld: ast_fold) -> field { expr_while(cond, body) { expr_while(fld.fold_expr(cond), fld.fold_block(body)) } - expr_do_while(blk, expr) { - expr_do_while(fld.fold_block(blk), fld.fold_expr(expr)) - } expr_loop(body) { expr_loop(fld.fold_block(body)) } diff --git a/src/librustsyntax/parse/classify.rs b/src/librustsyntax/parse/classify.rs index 99a6462bfca..70f89a38f47 100644 --- a/src/librustsyntax/parse/classify.rs +++ b/src/librustsyntax/parse/classify.rs @@ -7,8 +7,8 @@ fn expr_requires_semi_to_be_stmt(e: @ast::expr) -> bool { alt e.node { ast::expr_if(_, _, _) | ast::expr_if_check(_, _, _) | ast::expr_alt(_, _, _) | ast::expr_block(_) - | ast::expr_do_while(_, _) | ast::expr_while(_, _) - | ast::expr_loop(_) | ast::expr_call(_, _, true) { + | ast::expr_while(_, _) | ast::expr_loop(_) + | ast::expr_call(_, _, true) { false } _ { true } diff --git a/src/librustsyntax/parse/parser.rs b/src/librustsyntax/parse/parser.rs index 7b1b9823a1f..125dbb927f4 100644 --- a/src/librustsyntax/parse/parser.rs +++ b/src/librustsyntax/parse/parser.rs @@ -727,8 +727,6 @@ fn parse_bottom_expr(p: parser) -> pexpr { ret pexpr(parse_for_expr(p)); } else if eat_keyword(p, "while") { ret pexpr(parse_while_expr(p)); - } else if eat_keyword(p, "do") { - ret pexpr(parse_do_while_expr(p)); } else if eat_keyword(p, "loop") { ret pexpr(parse_loop_expr(p)); } else if eat_keyword(p, "alt") { @@ -1233,15 +1231,6 @@ fn parse_while_expr(p: parser) -> @expr { ret mk_expr(p, lo, hi, expr_while(cond, body)); } -fn parse_do_while_expr(p: parser) -> @expr { - let lo = p.last_span.lo; - let body = parse_block_no_value(p); - expect_keyword(p, "while"); - let cond = parse_expr(p); - let mut hi = cond.span.hi; - ret mk_expr(p, lo, hi, expr_do_while(body, cond)); -} - fn parse_loop_expr(p: parser) -> @expr { let lo = p.last_span.lo; let body = parse_block_no_value(p); diff --git a/src/librustsyntax/print/pprust.rs b/src/librustsyntax/print/pprust.rs index 9af860e8872..46745b7e28c 100644 --- a/src/librustsyntax/print/pprust.rs +++ b/src/librustsyntax/print/pprust.rs @@ -975,14 +975,6 @@ fn print_opt(s: ps, expr: option<@ast::expr>) { space(s.s); print_block(s, blk); } - ast::expr_do_while(blk, expr) { - head(s, "do"); - space(s.s); - print_block(s, blk); - space(s.s); - word_space(s, "while"); - print_expr(s, expr); - } ast::expr_alt(expr, arms, mode) { cbox(s, alt_indent_unit); ibox(s, 4u); diff --git a/src/librustsyntax/visit.rs b/src/librustsyntax/visit.rs index 2468ab68aa3..c9c751900c8 100644 --- a/src/librustsyntax/visit.rs +++ b/src/librustsyntax/visit.rs @@ -376,7 +376,6 @@ fn visit_expr(ex: @expr, e: E, v: vt) { } expr_while(x, b) { v.visit_expr(x, e, v); v.visit_block(b, e, v); } expr_loop(b) { v.visit_block(b, e, v); } - expr_do_while(b, x) { v.visit_block(b, e, v); v.visit_expr(x, e, v); } expr_alt(x, arms, _) { v.visit_expr(x, e, v); for arms.each {|a| v.visit_arm(a, e, v); } diff --git a/src/rustc/middle/alias.rs b/src/rustc/middle/alias.rs index 444947c471b..f3b6cbf6efc 100644 --- a/src/rustc/middle/alias.rs +++ b/src/rustc/middle/alias.rs @@ -122,7 +122,7 @@ fn visit_expr(cx: @ctx, ex: @ast::expr, sc: scope, v: vt) { check_lval(cx, dest, sc, v); } ast::expr_if(c, then, els) { check_if(c, then, els, sc, v); } - ast::expr_while(_, _) | ast::expr_do_while(_, _) { + ast::expr_while(_, _) { check_loop(*cx, sc) {|| visit::visit_expr(ex, sc, v); } } _ { handled = false; } diff --git a/src/rustc/middle/borrowck.rs b/src/rustc/middle/borrowck.rs index 021f0cd4b77..9e87cbc0bcd 100644 --- a/src/rustc/middle/borrowck.rs +++ b/src/rustc/middle/borrowck.rs @@ -761,9 +761,9 @@ fn cat_expr(expr: @ast::expr) -> cmt { ast::expr_vstore(*) | ast::expr_vec(*) | ast::expr_tup(*) | ast::expr_if_check(*) | ast::expr_if(*) | ast::expr_log(*) | ast::expr_new(*) | ast::expr_binary(*) | ast::expr_while(*) | - ast::expr_do_while(*) | ast::expr_block(*) | ast::expr_loop(*) | - ast::expr_alt(*) | ast::expr_lit(*) | ast::expr_break | - ast::expr_mac(*) | ast::expr_cont | ast::expr_rec(*) { + ast::expr_block(*) | ast::expr_loop(*) | ast::expr_alt(*) | + ast::expr_lit(*) | ast::expr_break | ast::expr_mac(*) | + ast::expr_cont | ast::expr_rec(*) { @{id:expr.id, span:expr.span, cat:cat_rvalue(rv_misc), lp:none, mutbl:m_imm, ty:expr_ty} diff --git a/src/rustc/middle/check_loop.rs b/src/rustc/middle/check_loop.rs index 99dadb5922a..b815afd3646 100644 --- a/src/rustc/middle/check_loop.rs +++ b/src/rustc/middle/check_loop.rs @@ -11,7 +11,7 @@ fn check_crate(tcx: ty::ctxt, crate: @crate) { }, visit_expr: {|e: @expr, cx: ctx, v: visit::vt| alt e.node { - expr_while(e, b) | expr_do_while(b, e) { + expr_while(e, b) { v.visit_expr(e, cx, v); v.visit_block(b, {in_loop: true with cx}, v); } diff --git a/src/rustc/middle/last_use.rs b/src/rustc/middle/last_use.rs index df24a98c923..4454c76d656 100644 --- a/src/rustc/middle/last_use.rs +++ b/src/rustc/middle/last_use.rs @@ -103,7 +103,7 @@ fn visit_expr(ex: @expr, cx: ctx, v: visit::vt) { leave_fn(cx); } expr_break { add_block_exit(cx, lp); } - expr_while(_, _) | expr_do_while(_, _) | expr_loop(_) { + expr_while(_, _) | expr_loop(_) { visit_block(lp, cx) {|| visit::visit_expr(ex, cx, v);} } expr_alt(input, arms, _) { diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs index f79cba16510..1df25c9e93e 100644 --- a/src/rustc/middle/trans/base.rs +++ b/src/rustc/middle/trans/base.rs @@ -1761,23 +1761,6 @@ fn trans_while(cx: block, cond: @ast::expr, body: ast::blk) ret next_cx; } -fn trans_do_while(cx: block, body: ast::blk, cond: @ast::expr) -> - block { - let _icx = cx.insn_ctxt("trans_do_while"); - let next_cx = sub_block(cx, "next"); - let body_cx = - loop_scope_block(cx, cont_self, next_cx, - "do-while loop body", body.span); - let body_end = trans_block(body_cx, body, ignore); - let cond_cx = scope_block(body_cx, "do-while cond"); - cleanup_and_Br(body_end, body_cx, cond_cx.llbb); - let cond_res = trans_temp_expr(cond_cx, cond); - let cond_bcx = trans_block_cleanups(cond_res.bcx, cond_cx); - CondBr(cond_bcx, cond_res.val, body_cx.llbb, next_cx.llbb); - Br(cx, body_cx.llbb); - ret next_cx; -} - fn trans_loop(cx:block, body: ast::blk) -> block { let _icx = cx.insn_ctxt("trans_loop"); let next_cx = sub_block(cx, "next"); @@ -3285,10 +3268,6 @@ fn trans_expr(bcx: block, e: @ast::expr, dest: dest) -> block { assert dest == ignore; ret trans_loop(bcx, body); } - ast::expr_do_while(body, cond) { - assert dest == ignore; - ret trans_do_while(bcx, body, cond); - } ast::expr_assign(dst, src) { assert dest == ignore; let src_r = trans_temp_lval(bcx, src); diff --git a/src/rustc/middle/trans/type_use.rs b/src/rustc/middle/trans/type_use.rs index 3ec11d5b0c4..4b57f33af7d 100644 --- a/src/rustc/middle/trans/type_use.rs +++ b/src/rustc/middle/trans/type_use.rs @@ -212,10 +212,9 @@ fn mark_for_expr(cx: ctx, e: @expr) { } } } - expr_do_while(_, _) | expr_alt(_, _, _) | - expr_block(_) | expr_if(_, _, _) | expr_while(_, _) | - expr_fail(_) | expr_break | expr_cont | expr_unary(_, _) | - expr_lit(_) | expr_assert(_) | expr_check(_, _) | + expr_alt(_, _, _) | expr_block(_) | expr_if(_, _, _) | + expr_while(_, _) | expr_fail(_) | expr_break | expr_cont | + expr_unary(_, _) | expr_lit(_) | expr_assert(_) | expr_check(_, _) | expr_if_check(_, _, _) | expr_mac(_) | expr_addr_of(_, _) | expr_ret(_) | expr_loop(_) | expr_bind(_, _) | expr_loop_body(_) {} } diff --git a/src/rustc/middle/tstate/pre_post_conditions.rs b/src/rustc/middle/tstate/pre_post_conditions.rs index 415dda8992a..559e8587cef 100644 --- a/src/rustc/middle/tstate/pre_post_conditions.rs +++ b/src/rustc/middle/tstate/pre_post_conditions.rs @@ -425,25 +425,6 @@ fn find_pre_post_expr(fcx: fn_ctxt, e: @expr) { intersect_states(expr_postcond(fcx.ccx, test), block_postcond(fcx.ccx, body))); } - expr_do_while(body, test) { - find_pre_post_block(fcx, body); - find_pre_post_expr(fcx, test); - let mut loop_postcond = - seq_postconds(fcx, - [block_postcond(fcx.ccx, body), - expr_postcond(fcx.ccx, test)]); - /* conservative approximation: if the body - could break or cont, the test may never be executed */ - - if has_nonlocal_exits(body) { - loop_postcond = empty_poststate(num_local_vars); - } - set_pre_and_post(fcx.ccx, e.id, - seq_preconds(fcx, - [block_pp(fcx.ccx, body), - expr_pp(fcx.ccx, test)]), - loop_postcond); - } expr_loop(body) { find_pre_post_block(fcx, body); /* Infinite loop: if control passes it, everything is true. */ diff --git a/src/rustc/middle/tstate/states.rs b/src/rustc/middle/tstate/states.rs index 58dd1031faa..8fbdec3d9b5 100644 --- a/src/rustc/middle/tstate/states.rs +++ b/src/rustc/middle/tstate/states.rs @@ -540,40 +540,6 @@ fn find_pre_post_state_expr(fcx: fn_ctxt, pres: prestate, e: @expr) -> bool { intersect_states(e_post, b_post)); } } - expr_do_while(body, test) { - let loop_pres = intersect_states(expr_poststate(fcx.ccx, test), pres); - - let mut changed = set_prestate_ann(fcx.ccx, e.id, loop_pres); - changed |= find_pre_post_state_block(fcx, loop_pres, body); - /* conservative approximination: if the body of the loop - could break or cont, we revert to the prestate - (TODO: could treat cont differently from break, since - if there's a cont, the test will execute) */ - - changed |= - find_pre_post_state_expr(fcx, block_poststate(fcx.ccx, body), - test); - - let breaks = has_nonlocal_exits(body); - if breaks { - // this should probably be true_poststate and not pres, - // b/c the body could invalidate stuff - // FIXME [Break-unsound] - // This is unsound as it is -- consider - // while (true) { - // x <- y; - // break; - // } - // The poststate wouldn't take into account that - // y gets deinitialized - changed |= set_poststate_ann(fcx.ccx, e.id, pres); - } else { - changed |= - set_poststate_ann(fcx.ccx, e.id, - expr_poststate(fcx.ccx, test)); - } - ret changed; - } expr_loop(body) { let loop_pres = intersect_states(block_poststate(fcx.ccx, body), pres); diff --git a/src/rustc/middle/typeck.rs b/src/rustc/middle/typeck.rs index 584a45bc6b7..472a4f43e2c 100644 --- a/src/rustc/middle/typeck.rs +++ b/src/rustc/middle/typeck.rs @@ -3444,11 +3444,6 @@ fn check_expr_fn(fcx: @fn_ctxt, check_block_no_value(fcx, body); fcx.write_ty(id, ty::mk_nil(tcx)); } - ast::expr_do_while(body, cond) { - bot = check_expr_with(fcx, cond, ty::mk_bool(tcx)) | - check_block_no_value(fcx, body); - fcx.write_ty(id, fcx.node_ty(body.node.id)); - } ast::expr_loop(body) { check_block_no_value(fcx, body); fcx.write_ty(id, ty::mk_nil(tcx));