Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 13 additions & 14 deletions src/comp/driver/rustc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,26 +150,25 @@ fn compile_input(sess: session::session, cfg: ast::crate_cfg, input: str,
time(time_passes, "freevar finding",
bind freevars::annotate_freevars(sess, def_map, crate));
let ty_cx = ty::mk_ctxt(sess, def_map, ext_map, ast_map, freevars);
time::<()>(time_passes, "typechecking",
bind typeck::check_crate(ty_cx, crate));
time::<()>(time_passes, "alt checking",
bind middle::check_alt::check_crate(ty_cx, crate));
time(time_passes, "typechecking",
bind typeck::check_crate(ty_cx, crate));
time(time_passes, "alt checking",
bind middle::check_alt::check_crate(ty_cx, crate));
if sess.get_opts().run_typestate {
time(time_passes, "typestate checking",
bind middle::tstate::ck::check_crate(ty_cx, crate));
}
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));
let mut_map = 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));
if sess.get_opts().no_trans { ret; }
let llmod =
time::<llvm::llvm::ModuleRef>(time_passes, "translation",
bind trans::trans_crate(sess, crate,
ty_cx, output,
ast_map));
time::<()>(time_passes, "LLVM passes",
bind link::write::run_passes(sess, llmod, output));
time(time_passes, "translation",
bind trans::trans_crate(sess, crate, ty_cx, output,
ast_map, mut_map));
time(time_passes, "LLVM passes",
bind link::write::run_passes(sess, llmod, output));
}

fn pretty_print_input(sess: session::session, cfg: ast::crate_cfg, input: str,
Expand Down
13 changes: 10 additions & 3 deletions src/comp/middle/alias.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,25 @@ type scope = @[restrict];

tag local_info { arg(ast::mode); objfield(ast::mutability); }

type ctx = {tcx: ty::ctxt, local_map: std::map::hashmap<node_id, local_info>};
type mut_map = std::map::hashmap<node_id, ()>;
type ctx = {tcx: ty::ctxt,
local_map: std::map::hashmap<node_id, local_info>,
mut_map: mut_map};

fn check_crate(tcx: ty::ctxt, crate: &@ast::crate) {
fn check_crate(tcx: ty::ctxt, crate: &@ast::crate) -> mut_map {
// Stores information about object fields and function
// arguments that's otherwise not easily available.
let cx = @{tcx: tcx, local_map: std::map::new_int_hash()};
let cx = @{tcx: tcx,
local_map: std::map::new_int_hash(),
mut_map: std::map::new_int_hash()};
let v = @{visit_fn: bind visit_fn(cx, _, _, _, _, _, _, _),
visit_item: bind visit_item(cx, _, _, _),
visit_expr: bind visit_expr(cx, _, _, _),
visit_decl: bind visit_decl(cx, _, _, _)
with *visit::default_visitor::<scope>()};
visit::visit_crate(*crate, @~[], visit::mk_vt(v));
tcx.sess.abort_if_errors();
ret cx.mut_map;
}

fn visit_fn(cx: &@ctx, f: &ast::_fn, _tp: &[ast::ty_param], _sp: &span,
Expand Down Expand Up @@ -409,6 +415,7 @@ fn check_lval(cx: &@ctx, dest: &@ast::expr, sc: &scope, v: &vt<scope>) {
alt dest.node {
ast::expr_path(p) {
let dnum = ast::def_id_of_def(cx.tcx.def_map.get(dest.id)).node;
cx.mut_map.insert(dnum, ());
if is_immutable_alias(*cx, sc, dnum) {
cx.tcx.sess.span_err(dest.span, "assigning to immutable alias");
} else if (is_immutable_objfield(*cx, dnum)) {
Expand Down
Loading