Skip to content

Commit 0e334c6

Browse files
committed
Fold and re-evaluate expr in tag discriminant.
1 parent 1dc3deb commit 0e334c6

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

src/comp/syntax/fold.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -469,9 +469,22 @@ fn noop_fold_variant(v: variant_, fld: ast_fold) -> variant_ {
469469
ret {ty: fld.fold_ty(va.ty), id: va.id};
470470
}
471471
let fold_variant_arg = bind fold_variant_arg_(_, fld);
472-
ret {name: v.name, args: vec::map(v.args, fold_variant_arg), id: v.id,
473-
disr_val: v.disr_val, disr_expr: v.disr_expr
474-
/* FIXME: is this right (copying disr_val and disr_expr) */};
472+
let args = vec::map(v.args, fold_variant_arg);
473+
let (de, dv) = alt v.disr_expr {
474+
some(e) {
475+
let de = fld.fold_expr(e);
476+
let dv = alt syntax::ast_util::eval_const_expr(e) {
477+
ast_util::const_int(val) {
478+
// FIXME (#1417): check that value is in range
479+
val as int
480+
}
481+
};
482+
(some(de), dv)
483+
}
484+
none. { (none, v.disr_val) }
485+
};
486+
ret {name: v.name, args: args, id: v.id,
487+
disr_val: dv, disr_expr: de};
475488
}
476489

477490
fn noop_fold_ident(&&i: ident, _fld: ast_fold) -> ident { ret i; }

src/comp/syntax/parse/parser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2117,8 +2117,8 @@ fn parse_item_tag(p: parser, attrs: [ast::attribute]) -> @ast::item {
21172117
// probably be doing." (See issue #1417)
21182118
alt syntax::ast_util::eval_const_expr(e) {
21192119
syntax::ast_util::const_int(val) {
2120+
// FIXME (#1417): check that value is in range
21202121
disr_val = val as int;
2121-
// FIXME: check that value is in range
21222122
}
21232123
}
21242124
if option::is_some

0 commit comments

Comments
 (0)