Skip to content

Commit b9b674a

Browse files
committed
Start adding support for multiple variable declarations per stmt
This adds parser support and most of the machinery for auto x = 10, y = 20; However, the above still goes wrong somewhere in typestate, causing the state checker to believe only the last variable in the list is initialized after the statement. Tim, if you have a moment, could you go over the changes to the tstate code in this patch and see where I'm going wrong? Multi-var-decls without the typestate extension Add a loop
1 parent b45d973 commit b9b674a

File tree

13 files changed

+81
-46
lines changed

13 files changed

+81
-46
lines changed

src/comp/middle/alias.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,17 +133,19 @@ fn visit_expr(&@ctx cx, &@ast::expr ex, &scope sc, &vt[scope] v) {
133133
fn visit_decl(&@ctx cx, &@ast::decl d, &scope sc, &vt[scope] v) {
134134
visit::visit_decl(d, sc, v);
135135
alt (d.node) {
136-
ast::decl_local(?loc) {
136+
ast::decl_local(?locs) {
137+
for (@ast::local loc in locs) {
137138
alt (loc.node.init) {
138-
some(?init) {
139-
if (init.op == ast::init_move) {
140-
check_move_rhs(cx, init.expr, sc, v);
141-
}
139+
some(?init) {
140+
if (init.op == ast::init_move) {
141+
check_move_rhs(cx, init.expr, sc, v);
142142
}
143-
none {}
143+
}
144+
none {}
144145
}
145146
}
146-
_ {}
147+
}
148+
_ {}
147149
}
148150
}
149151

src/comp/middle/resolve.rs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -787,10 +787,13 @@ fn lookup_in_block(&ident name, &ast::block_ b, namespace ns) ->
787787
alt (st.node) {
788788
case (ast::stmt_decl(?d, _)) {
789789
alt (d.node) {
790-
case (ast::decl_local(?loc)) {
791-
if (ns == ns_value && str::eq(name, loc.node.ident)) {
792-
ret some(ast::def_local(local_def(loc.node.id)));
793-
}
790+
ast::decl_local(?locs) {
791+
for (@ast::local loc in locs) {
792+
if ns == ns_value && str::eq(name, loc.node.ident) {
793+
ret some(ast::def_local
794+
(local_def(loc.node.id)));
795+
}
796+
}
794797
}
795798
case (ast::decl_item(?it)) {
796799
alt (it.node) {
@@ -1325,8 +1328,10 @@ fn check_block(@env e, &ast::block b, &() x, &vt[()] v) {
13251328
alt (st.node) {
13261329
case (ast::stmt_decl(?d, _)) {
13271330
alt (d.node) {
1328-
ast::decl_local(?loc) {
1329-
add_name(values, d.span, loc.node.ident);
1331+
ast::decl_local(?locs) {
1332+
for (@ast::local loc in locs) {
1333+
add_name(values, d.span, loc.node.ident);
1334+
}
13301335
}
13311336
ast::decl_item(?it) {
13321337
alt (it.node) {

src/comp/middle/trans.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6157,8 +6157,10 @@ fn trans_stmt(&@block_ctxt cx, &ast::stmt s) -> result {
61576157
case (ast::stmt_expr(?e, _)) { bcx = trans_expr(cx, e).bcx; }
61586158
case (ast::stmt_decl(?d, _)) {
61596159
alt (d.node) {
6160-
case (ast::decl_local(?local)) {
6161-
bcx = init_local(bcx, local).bcx;
6160+
case (ast::decl_local(?locals)) {
6161+
for (@ast::local local in locals) {
6162+
bcx = init_local(bcx, local).bcx;
6163+
}
61626164
}
61636165
case (ast::decl_item(?i)) { trans_item(cx.fcx.lcx, *i); }
61646166
}
@@ -6263,7 +6265,11 @@ iter block_locals(&ast::block b) -> @ast::local {
62636265
alt (s.node) {
62646266
case (ast::stmt_decl(?d, _)) {
62656267
alt (d.node) {
6266-
case (ast::decl_local(?local)) { put local; }
6268+
case (ast::decl_local(?locals)) {
6269+
for (@ast::local local in locals) {
6270+
put local;
6271+
}
6272+
}
62676273
case (_) {/* fall through */ }
62686274
}
62696275
}

src/comp/middle/trans_dps.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -597,12 +597,16 @@ fn trans_stmt(&@block_ctxt cx, &@ast::stmt stmt) -> @block_ctxt {
597597
}
598598
ast::stmt_decl(?d, _) {
599599
alt (d.node) {
600-
ast::decl_local(?local) { ret trans_init_local(bcx, local); }
600+
ast::decl_local(?locals) {
601+
for (@ast::local local in locals) {
602+
bcx = trans_init_local(bcx, local);
603+
}
604+
}
601605
ast::decl_item(?item) {
602606
trans::trans_item(bcx_lcx(bcx), *item);
603-
ret bcx;
604607
}
605608
}
609+
ret bcx;
606610
}
607611
}
608612
}

src/comp/middle/tstate/pre_post_conditions.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,8 @@ fn find_pre_post_stmt(&fn_ctxt fcx, &stmt s) {
585585
alt (s.node) {
586586
case (stmt_decl(?adecl, ?id)) {
587587
alt (adecl.node) {
588-
case (decl_local(?alocal)) {
588+
case (decl_local(?alocals)) {
589+
for (@local alocal in alocals) {
589590
alt (alocal.node.init) {
590591
case (some(?an_init)) {
591592
/* LHS always becomes initialized,
@@ -628,6 +629,7 @@ fn find_pre_post_stmt(&fn_ctxt fcx, &stmt s) {
628629
.conditions);
629630
}
630631
}
632+
}
631633
}
632634
case (decl_item(?anitem)) {
633635
clear_pp(node_id_to_ts_ann(fcx.ccx, id).conditions);

src/comp/middle/tstate/states.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,9 @@ fn find_pre_post_state_stmt(&fn_ctxt fcx, &prestate pres, @stmt s) -> bool {
596596
alt (s.node) {
597597
case (stmt_decl(?adecl, ?id)) {
598598
alt (adecl.node) {
599-
case (decl_local(?alocal)) {
599+
case (decl_local(?alocals)) {
600+
auto changed = false;
601+
for (@local alocal in alocals) {
600602
alt (alocal.node.init) {
601603
case (some(?an_init)) {
602604
auto changed = set_prestate(stmt_ann, pres) |
@@ -646,19 +648,18 @@ fn find_pre_post_state_stmt(&fn_ctxt fcx, &prestate pres, @stmt s) -> bool {
646648
/* important to do this in one step to ensure
647649
termination (don't want to set changed to true
648650
for intermediate changes) */
649-
ret changed | set_poststate(stmt_ann, post);
650-
651-
651+
changed |= set_poststate(stmt_ann, post);
652652
}
653653
case (none) {
654654
// let int = x; => x is uninit in poststate
655655
set_poststate_ann(fcx.ccx, id, pres);
656656
clear_in_poststate_ident(fcx, alocal.node.id,
657657
alocal.node.ident, id);
658658
set_prestate(stmt_ann, pres);
659-
ret false;
660659
}
661660
}
661+
}
662+
ret changed;
662663
}
663664
case (decl_item(?an_item)) {
664665
ret set_prestate(stmt_ann, pres) |

src/comp/middle/typeck.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2584,7 +2584,9 @@ fn check_stmt(&@fn_ctxt fcx, &@ast::stmt stmt) {
25842584
case (ast::stmt_decl(?decl, ?id)) {
25852585
node_id = id;
25862586
alt (decl.node) {
2587-
case (ast::decl_local(?l)) { check_decl_local(fcx, l); }
2587+
case (ast::decl_local(?ls)) {
2588+
for (@ast::local l in ls) { check_decl_local(fcx, l); }
2589+
}
25882590
case (ast::decl_item(_)) {/* ignore for now */ }
25892591
}
25902592
}

src/comp/syntax/ast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ type local = spanned[local_];
252252
253253
type decl = spanned[decl_];
254254
255-
tag decl_ { decl_local(@local); decl_item(@item); }
255+
tag decl_ { decl_local((@local)[]); decl_item(@item); }
256256
257257
type arm = rec((@pat)[] pats, block block);
258258

src/comp/syntax/fold.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -298,9 +298,8 @@ fn noop_fold_pat(&pat_ p, ast_fold fld) -> pat_ {
298298

299299
fn noop_fold_decl(&decl_ d, ast_fold fld) -> decl_ {
300300
ret alt (d) {
301-
// local really doesn't need its own fold...
302-
case (decl_local(?l)) {
303-
decl_local(fld.fold_local(l))
301+
case (decl_local(?ls)) {
302+
decl_local(ivec::map(fld.fold_local, ls))
304303
}
305304
case (decl_item(?it)) { decl_item(fld.fold_item(it)) }
306305
}

src/comp/syntax/parse/parser.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,14 +1543,22 @@ fn parse_auto_local(&parser p) -> @ast::local {
15431543

15441544
fn parse_let(&parser p) -> @ast::decl {
15451545
auto lo = p.get_last_lo_pos();
1546-
auto local = parse_typed_local(p);
1547-
ret @spanned(lo, p.get_hi_pos(), ast::decl_local(local));
1546+
auto locals = ~[parse_typed_local(p)];
1547+
while p.peek() == token::COMMA {
1548+
p.bump();
1549+
locals += ~[parse_typed_local(p)];
1550+
}
1551+
ret @spanned(lo, p.get_hi_pos(), ast::decl_local(locals));
15481552
}
15491553

15501554
fn parse_auto(&parser p) -> @ast::decl {
15511555
auto lo = p.get_last_lo_pos();
1552-
auto local = parse_auto_local(p);
1553-
ret @spanned(lo, p.get_hi_pos(), ast::decl_local(local));
1556+
auto locals = ~[parse_auto_local(p)];
1557+
while p.peek() == token::COMMA {
1558+
p.bump();
1559+
locals += ~[parse_auto_local(p)];
1560+
}
1561+
ret @spanned(lo, p.get_hi_pos(), ast::decl_local(locals));
15541562
}
15551563

15561564
fn parse_stmt(&parser p) -> @ast::stmt {

src/comp/syntax/print/pprust.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,10 +1045,10 @@ fn print_expr(&ps s, &@ast::expr expr) {
10451045
fn print_decl(&ps s, &@ast::decl decl) {
10461046
maybe_print_comment(s, decl.span.lo);
10471047
alt (decl.node) {
1048-
case (ast::decl_local(?loc)) {
1048+
case (ast::decl_local(?locs)) {
10491049
space_if_not_hardbreak(s);
10501050
ibox(s, indent_unit);
1051-
alt (loc.node.ty) {
1051+
alt (locs.(0).node.ty) {
10521052
case (some(?ty)) {
10531053
word_nbsp(s, "let");
10541054
print_type(s, *ty);
@@ -1058,19 +1058,23 @@ fn print_decl(&ps s, &@ast::decl decl) {
10581058
word_nbsp(s, "auto");
10591059
}
10601060
}
1061-
word(s.s, loc.node.ident);
1062-
alt (loc.node.init) {
1063-
case (some(?init)) {
1061+
fn print_local(&ps s, &@ast::local loc) {
1062+
word(s.s, loc.node.ident);
1063+
alt loc.node.init {
1064+
some(?init) {
10641065
space(s.s);
1065-
alt (init.op) {
1066-
case (ast::init_assign) { word_space(s, "="); }
1067-
case (ast::init_move) { word_space(s, "<-"); }
1068-
case (ast::init_recv) { word_space(s, "|>"); }
1066+
alt init.op {
1067+
ast::init_assign { word_space(s, "="); }
1068+
ast::init_move { word_space(s, "<-"); }
1069+
ast::init_recv { word_space(s, "|>"); }
10691070
}
10701071
print_expr(s, init.expr);
1072+
}
1073+
_ { }
10711074
}
1072-
case (_) { }
10731075
}
1076+
fn local_span(&@ast::local loc) -> codemap::span { ret loc.span; }
1077+
commasep_cmnt(s, consistent, locs, print_local, local_span);
10741078
end(s);
10751079
}
10761080
case (ast::decl_item(?item)) { print_item(s, item); }

src/comp/syntax/visit.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,8 @@ fn visit_stmt[E](&@stmt s, &E e, &vt[E] v) {
249249

250250
fn visit_decl[E](&@decl d, &E e, &vt[E] v) {
251251
alt (d.node) {
252-
case (decl_local(?loc)) {
253-
v.visit_local(loc, e, v);
252+
case (decl_local(?locs)) {
253+
for (@ast::local loc in locs) { v.visit_local(loc, e, v); }
254254
}
255255
case (decl_item(?it)) { v.visit_item(it, e, v); }
256256
}

src/comp/syntax/walk.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,9 @@ fn walk_decl(&ast_visitor v, @ast::decl d) {
256256
if (!v.keep_going()) { ret; }
257257
v.visit_decl_pre(d);
258258
alt (d.node) {
259-
case (ast::decl_local(?loc)) { walk_local(v, loc); }
259+
case (ast::decl_local(?locs)) {
260+
for (@ast::local loc in locs) { walk_local(v, loc); }
261+
}
260262
case (ast::decl_item(?it)) { walk_item(v, it); }
261263
}
262264
v.visit_decl_post(d);

0 commit comments

Comments
 (0)