diff options
| author | Joshua Wise <joshua@joshuawise.com> | 2011-11-08 18:26:02 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2011-11-09 14:33:05 -0800 |
| commit | e674a7e99f6dacd5a743e8255f2014321f88ccc1 (patch) | |
| tree | bd01ff49ca51a4105fad23c27cceeaea9c1bf0e4 /src/comp | |
| parent | ff5b319ce551e6b9b79ce8f127e25d26d0f4d085 (diff) | |
middle: Add a pass to reject bad const expressions earlier. Currently just rejects unimplemented const expressions, but will be needed later.
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/driver/rustc.rs | 2 | ||||
| -rw-r--r-- | src/comp/middle/check_const.rs | 42 | ||||
| -rw-r--r-- | src/comp/rustc.rc | 1 |
3 files changed, 45 insertions, 0 deletions
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs index ec715593ce7..0c12161661a 100644 --- a/src/comp/driver/rustc.rs +++ b/src/comp/driver/rustc.rs @@ -151,6 +151,8 @@ fn compile_input(sess: session::session, cfg: ast::crate_cfg, input: str, time(time_passes, "alias checking", bind middle::alias::check_crate(ty_cx, crate)); time(time_passes, "kind checking", bind kind::check_crate(ty_cx, crate)); + time(time_passes, "const checking", + bind middle::check_const::check_crate(ty_cx, crate)); if sess.get_opts().no_trans { ret; } let llmod = time(time_passes, "translation", diff --git a/src/comp/middle/check_const.rs b/src/comp/middle/check_const.rs new file mode 100644 index 00000000000..db6094abbdc --- /dev/null +++ b/src/comp/middle/check_const.rs @@ -0,0 +1,42 @@ +import syntax::ast::*; +import syntax::ast_util::{variant_def_ids, dummy_sp}; +import syntax::visit; + +fn check_crate(tcx: ty::ctxt, crate: @crate) { + let v = + @{visit_item: bind check_item(tcx, _, _, _) + with *visit::default_visitor::<()>()}; + visit::visit_crate(*crate, (), visit::mk_vt(v)); + tcx.sess.abort_if_errors(); +} + +fn check_item(tcx: ty::ctxt, it: @item, &&s: (), v: visit::vt<()>) { + visit::visit_item(it, s, v); + alt it.node { + item_const(_ /* ty */, ex) { + let v = + @{visit_expr: bind check_const_expr(tcx, _, _, _) + with *visit::default_visitor::<()>()}; + check_const_expr(tcx, ex, (), visit::mk_vt(v)); + } + _ { } + } +} + +fn check_const_expr(tcx: ty::ctxt, ex: @expr, &&s: (), v: visit::vt<()>) { + visit::visit_expr(ex, s, v); + alt ex.node { + expr_lit(_) { } + _ { tcx.sess.span_err(ex.span, + "constant contains unimplemented expression type"); } + } +} + +// Local Variables: +// mode: rust +// fill-column: 78; +// indent-tabs-mode: nil +// c-basic-offset: 4 +// buffer-file-coding-system: utf-8-unix +// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'"; +// End: diff --git a/src/comp/rustc.rc b/src/comp/rustc.rc index b54610dd5c3..9215cbcb9c1 100644 --- a/src/comp/rustc.rc +++ b/src/comp/rustc.rc @@ -27,6 +27,7 @@ mod middle { mod typeck; mod fn_usage; mod check_alt; + mod check_const; mod mut; mod alias; mod kind; |
