Skip to content

Commit 348ec1a

Browse files
committed
---
yaml --- r: 2533 b: refs/heads/master c: ef75860 h: refs/heads/master i: 2531: a88f5ab v: v3
1 parent 33fbbab commit 348ec1a

File tree

5 files changed

+102
-45
lines changed

5 files changed

+102
-45
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: 5679f5c55e15e4a42542c36b1abc86b469903d19
2+
refs/heads/master: ef75860a0a72f79f97216f8aaa5b388d98da6480

trunk/src/comp/middle/ty.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1492,6 +1492,12 @@ fn triv_ann(uint node_id, t typ) -> ast::ann {
14921492
ret ast::ann_type(node_id, typ, none[vec[t]], none[@ts_ann]);
14931493
}
14941494

1495+
// Creates a nil type annotation.
1496+
fn plain_ann(uint node_id, ctxt tcx) -> ast::ann {
1497+
ret ast::ann_type(node_id, mk_nil(tcx), none[vec[ty::t]], none[@ts_ann]);
1498+
}
1499+
1500+
14951501
// Returns the number of distinct type parameters in the given type.
14961502
fn count_ty_params(ctxt cx, t ty) -> uint {
14971503
fn counter(ctxt cx, @mutable vec[uint] param_indices, t ty) {

trunk/src/comp/middle/typeck.rs

Lines changed: 94 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import middle::fold;
77
import driver::session;
88
import util::common;
99
import util::common::span;
10-
import util::common::plain_ann;
1110
import util::common::new_def_hash;
1211
import util::common::log_expr_err;
1312

@@ -25,6 +24,7 @@ import middle::ty::mo_either;
2524
import middle::ty::node_type_table;
2625
import middle::ty::pat_ty;
2726
import middle::ty::path_to_str;
27+
import middle::ty::plain_ann;
2828
import middle::ty::struct;
2929
import middle::ty::triv_ann;
3030
import middle::ty::ty_param_substs_opt_and_ty;
@@ -387,6 +387,11 @@ fn write_type_only(&node_type_table ntt, uint node_id, ty::t ty) {
387387
be write_type(ntt, node_id, tup(none[vec[ty::t]], ty));
388388
}
389389

390+
// Writes a nil type into the node type table.
391+
fn write_nil_type(ty::ctxt tcx, &node_type_table ntt, uint node_id) {
392+
be write_type_only(ntt, node_id, ty::mk_nil(tcx));
393+
}
394+
390395

391396
// Item collection - a pair of bootstrap passes:
392397
//
@@ -1631,15 +1636,20 @@ mod Pushdown {
16311636
auto e_1 = pushdown_expr(fcx, expected, e_0);
16321637
auto block_ = rec(stmts=bloc.node.stmts,
16331638
expr=some[@ast::expr](e_1),
1634-
a=plain_ann(bloc.node.a, fcx.ccx.tcx));
1639+
a=plain_ann(ast::ann_tag(bloc.node.a),
1640+
fcx.ccx.tcx));
1641+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types,
1642+
ast::ann_tag(bloc.node.a));
16351643
ret fold::respan[ast::block_](bloc.span, block_);
16361644
}
16371645
case (none[@ast::expr]) {
16381646
Demand::simple(fcx, bloc.span, expected,
16391647
ty::mk_nil(fcx.ccx.tcx));
1640-
ret fold::respan(bloc.span,
1641-
rec(a = plain_ann(bloc.node.a, fcx.ccx.tcx)
1642-
with bloc.node));
1648+
auto new_ann = plain_ann(ast::ann_tag(bloc.node.a),
1649+
fcx.ccx.tcx);
1650+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types,
1651+
ast::ann_tag(bloc.node.a));
1652+
ret fold::respan(bloc.span, rec(a=new_ann with bloc.node));
16431653

16441654
}
16451655
}
@@ -2158,21 +2168,29 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) -> @ast::expr {
21582168
}
21592169

21602170
case (ast::expr_fail(?a)) {
2161-
ret @fold::respan[ast::expr_](expr.span,
2162-
ast::expr_fail(plain_ann(a, fcx.ccx.tcx)));
2171+
// TODO: should be something like 'a or noret
2172+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
2173+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types, ast::ann_tag(a));
2174+
ret @fold::respan[ast::expr_](expr.span, ast::expr_fail(new_ann));
21632175
}
21642176

21652177
case (ast::expr_break(?a)) {
2178+
// TODO: should be something like 'a or noret
2179+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
2180+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types, ast::ann_tag(a));
21662181
ret @fold::respan[ast::expr_](expr.span,
2167-
ast::expr_break(plain_ann(a, fcx.ccx.tcx)));
2182+
ast::expr_break(new_ann));
21682183
}
21692184

21702185
case (ast::expr_cont(?a)) {
2171-
ret @fold::respan[ast::expr_](expr.span,
2172-
ast::expr_cont(plain_ann(a, fcx.ccx.tcx)));
2186+
// TODO: should be something like 'a or noret
2187+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
2188+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types, ast::ann_tag(a));
2189+
ret @fold::respan[ast::expr_](expr.span, ast::expr_cont(new_ann));
21732190
}
21742191

21752192
case (ast::expr_ret(?expr_opt, ?a)) {
2193+
// TODO: should be something like 'a or noret
21762194
alt (expr_opt) {
21772195
case (none[@ast::expr]) {
21782196
auto nil = ty::mk_nil(fcx.ccx.tcx);
@@ -2181,19 +2199,26 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) -> @ast::expr {
21812199
+ "returning non-nil");
21822200
}
21832201

2202+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
2203+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types,
2204+
ast::ann_tag(a));
2205+
21842206
ret @fold::respan[ast::expr_]
21852207
(expr.span,
2186-
ast::expr_ret(none[@ast::expr],
2187-
plain_ann(a, fcx.ccx.tcx)));
2208+
ast::expr_ret(none[@ast::expr], new_ann));
21882209
}
21892210

21902211
case (some[@ast::expr](?e)) {
21912212
auto expr_0 = check_expr(fcx, e);
21922213
auto expr_1 = Pushdown::pushdown_expr(fcx, fcx.ret_ty,
21932214
expr_0);
2215+
2216+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
2217+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types,
2218+
ast::ann_tag(a));
2219+
21942220
ret @fold::respan[ast::expr_]
2195-
(expr.span, ast::expr_ret(some(expr_1),
2196-
plain_ann(a, fcx.ccx.tcx)));
2221+
(expr.span, ast::expr_ret(some(expr_1), new_ann));
21972222
}
21982223
}
21992224
}
@@ -2209,18 +2234,25 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) -> @ast::expr {
22092234
+ "putting non-nil");
22102235
}
22112236

2237+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
2238+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types,
2239+
ast::ann_tag(a));
2240+
22122241
ret @fold::respan[ast::expr_]
2213-
(expr.span, ast::expr_put(none[@ast::expr],
2214-
plain_ann(a, fcx.ccx.tcx)));
2242+
(expr.span, ast::expr_put(none[@ast::expr], new_ann));
22152243
}
22162244

22172245
case (some[@ast::expr](?e)) {
22182246
auto expr_0 = check_expr(fcx, e);
22192247
auto expr_1 = Pushdown::pushdown_expr(fcx, fcx.ret_ty,
22202248
expr_0);
2249+
2250+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
2251+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types,
2252+
ast::ann_tag(a));
2253+
22212254
ret @fold::respan[ast::expr_]
2222-
(expr.span, ast::expr_put(some(expr_1),
2223-
plain_ann(a, fcx.ccx.tcx)));
2255+
(expr.span, ast::expr_put(some(expr_1), new_ann));
22242256
}
22252257
}
22262258
}
@@ -2230,15 +2262,21 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) -> @ast::expr {
22302262
assert (ast::is_call_expr(e));
22312263
auto expr_0 = check_expr(fcx, e);
22322264
auto expr_1 = Pushdown::pushdown_expr(fcx, fcx.ret_ty, expr_0);
2233-
ret @fold::respan(expr.span,
2234-
ast::expr_be(expr_1, plain_ann(a, fcx.ccx.tcx)));
2265+
2266+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
2267+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types, ast::ann_tag(a));
2268+
2269+
ret @fold::respan(expr.span, ast::expr_be(expr_1, new_ann));
22352270
}
22362271

22372272
case (ast::expr_log(?l, ?e, ?a)) {
22382273
auto expr_t = check_expr(fcx, e);
2239-
ret @fold::respan[ast::expr_]
2240-
(expr.span, ast::expr_log(l, expr_t,
2241-
plain_ann(a, fcx.ccx.tcx)));
2274+
2275+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
2276+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types, ast::ann_tag(a));
2277+
2278+
ret @fold::respan[ast::expr_](expr.span,
2279+
ast::expr_log(l, expr_t, new_ann));
22422280
}
22432281

22442282
case (ast::expr_check(?e, ?a)) {
@@ -2265,9 +2303,13 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) -> @ast::expr {
22652303

22662304
require_pure_function(fcx.ccx, d_id, expr.span);
22672305

2306+
auto new_ann = plain_ann(ast::ann_tag(a),
2307+
fcx.ccx.tcx);
2308+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types,
2309+
ast::ann_tag(a));
2310+
22682311
ret @fold::respan[ast::expr_]
2269-
(expr.span, ast::expr_check(expr_t,
2270-
plain_ann(a, fcx.ccx.tcx)));
2312+
(expr.span, ast::expr_check(expr_t, new_ann));
22712313
}
22722314
case (_) {
22732315
fcx.ccx.sess.span_err(expr.span,
@@ -2287,9 +2329,12 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) -> @ast::expr {
22872329
auto expr_t = check_expr(fcx, e);
22882330
Demand::simple(fcx, expr.span, ty::mk_bool(fcx.ccx.tcx),
22892331
expr_ty(fcx.ccx.tcx, fcx.ccx.node_types, expr_t));
2290-
ret @fold::respan[ast::expr_]
2291-
(expr.span, ast::expr_assert(expr_t,
2292-
plain_ann(a, fcx.ccx.tcx)));
2332+
2333+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
2334+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types, ast::ann_tag(a));
2335+
2336+
ret @fold::respan[ast::expr_](expr.span,
2337+
ast::expr_assert(expr_t, new_ann));
22932338
}
22942339

22952340
case (ast::expr_assign(?lhs, ?rhs, ?a)) {
@@ -3033,16 +3078,23 @@ fn check_stmt(&@fn_ctxt fcx, &@ast::stmt stmt) -> @ast::stmt {
30333078
alt (decl.node) {
30343079
case (ast::decl_local(_)) {
30353080
auto decl_1 = check_decl_local(fcx, decl);
3081+
3082+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
3083+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types,
3084+
ast::ann_tag(a));
3085+
30363086
ret @fold::respan[ast::stmt_](stmt.span,
3037-
ast::stmt_decl(decl_1,
3038-
plain_ann(a, fcx.ccx.tcx)));
3087+
ast::stmt_decl(decl_1, new_ann));
30393088
}
30403089

30413090
case (ast::decl_item(_)) {
30423091
// Ignore for now. We'll return later.
3092+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
3093+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types,
3094+
ast::ann_tag(a));
3095+
30433096
ret @fold::respan[ast::stmt_](stmt.span,
3044-
ast::stmt_decl(decl,
3045-
plain_ann(a, fcx.ccx.tcx)));
3097+
ast::stmt_decl(decl, new_ann));
30463098
}
30473099
}
30483100

@@ -3053,9 +3105,11 @@ fn check_stmt(&@fn_ctxt fcx, &@ast::stmt stmt) -> @ast::stmt {
30533105
auto expr_t = check_expr(fcx, expr);
30543106
expr_t = Pushdown::pushdown_expr(fcx,
30553107
expr_ty(fcx.ccx.tcx, fcx.ccx.node_types, expr_t), expr_t);
3056-
ret @fold::respan(stmt.span,
3057-
ast::stmt_expr(expr_t,
3058-
plain_ann(a, fcx.ccx.tcx)));
3108+
3109+
auto new_ann = plain_ann(ast::ann_tag(a), fcx.ccx.tcx);
3110+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types, ast::ann_tag(a));
3111+
3112+
ret @fold::respan(stmt.span, ast::stmt_expr(expr_t, new_ann));
30593113
}
30603114
}
30613115

@@ -3079,9 +3133,11 @@ fn check_block(&@fn_ctxt fcx, &ast::block block) -> ast::block {
30793133
}
30803134
}
30813135

3082-
ret fold::respan(block.span,
3083-
rec(stmts=stmts, expr=expr,
3084-
a=plain_ann(block.node.a, fcx.ccx.tcx)));
3136+
auto new_ann = plain_ann(ast::ann_tag(block.node.a), fcx.ccx.tcx);
3137+
write_nil_type(fcx.ccx.tcx, fcx.ccx.node_types,
3138+
ast::ann_tag(block.node.a));
3139+
3140+
ret fold::respan(block.span, rec(stmts=stmts, expr=expr, a=new_ann));
30853141
}
30863142

30873143
fn check_const(&@crate_ctxt ccx, &span sp, &ast::ident ident, &@ast::ty t,

trunk/src/comp/middle/typestate_check.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2078,7 +2078,7 @@ fn init_block(&fn_info fi, &span sp, &block_ b) -> block {
20782078
log("init_block: shouldn't see ann_none");
20792079
fail;
20802080
}
2081-
case (ann_type(_, ?t,?ps,_)) {
2081+
case (ann_type(_, _, ?ps, _)) {
20822082
auto fld0 = fold::new_identity_fold[fn_info]();
20832083

20842084
fld0 = @rec(fold_ann = bind init_ann(_,_) with *fld0);

trunk/src/comp/util/common.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,6 @@ fn field_exprs(vec[ast::field] fields) -> vec [@ast::expr] {
117117
ret _vec::map[ast::field, @ast::expr](f, fields);
118118
}
119119

120-
fn plain_ann(&ast::ann old, middle::ty::ctxt tcx) -> ast::ann {
121-
ret ast::ann_type(ast::ann_tag(old), middle::ty::mk_nil(tcx),
122-
none[vec[middle::ty::t]], none[@ts_ann]);
123-
}
124-
125120
fn expr_to_str(&@ast::expr e) -> str {
126121
let str_writer s = string_writer();
127122
auto out_ = mkstate(s.get_writer(), 80u);

0 commit comments

Comments
 (0)