about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorJoshua Wise <joshua@joshuawise.com>2011-11-08 18:26:02 -0800
committerBrian Anderson <banderson@mozilla.com>2011-11-09 14:33:05 -0800
commite674a7e99f6dacd5a743e8255f2014321f88ccc1 (patch)
treebd01ff49ca51a4105fad23c27cceeaea9c1bf0e4 /src/comp
parentff5b319ce551e6b9b79ce8f127e25d26d0f4d085 (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.rs2
-rw-r--r--src/comp/middle/check_const.rs42
-rw-r--r--src/comp/rustc.rc1
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;