about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2011-04-22 11:08:47 -0700
committerGraydon Hoare <graydon@mozilla.com>2011-04-28 13:26:19 -0700
commit707cd0281da28596f6f4b5e9cdf0af4f17bf50f0 (patch)
treeee8a3221c24c1069e738ef6a02d59018c4e87f09
parent0190ebfe0748f28c290eb4759a03ffbd416cbeac (diff)
downloadrust-707cd0281da28596f6f4b5e9cdf0af4f17bf50f0.tar.gz
rust-707cd0281da28596f6f4b5e9cdf0af4f17bf50f0.zip
Fixed bug in typeck that wasn't filling in anns for stmts
(needed for typestate_check).

Also changed a (log; fail) to (log_err; fail) in typestate_check,
and added some more logging funs in util.common.
-rw-r--r--src/comp/middle/typeck.rs9
-rw-r--r--src/comp/middle/typestate_check.rs18
-rw-r--r--src/comp/util/common.rs20
3 files changed, 39 insertions, 8 deletions
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index ce229999695..0f96c3eb6b7 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -2623,22 +2623,25 @@ fn check_stmt(&@fn_ctxt fcx, &@ast.stmt stmt) -> @ast.stmt {
                 case (ast.decl_local(_)) {
                     auto decl_1 = check_decl_local(fcx, decl);
                     ret @fold.respan[ast.stmt_](stmt.span,
-                                                ast.stmt_decl(decl_1, a));
+                           ast.stmt_decl(decl_1, plain_ann(fcx.ccx.tystore)));
                 }
 
                 case (ast.decl_item(_)) {
                     // Ignore for now. We'll return later.
+                    ret @fold.respan[ast.stmt_](stmt.span,
+                           ast.stmt_decl(decl, plain_ann(fcx.ccx.tystore)));
                 }
             }
 
-            ret stmt;
+            //         ret stmt;
         }
 
         case (ast.stmt_expr(?expr,?a)) {
             auto expr_t = check_expr(fcx, expr);
             expr_t = Pushdown.pushdown_expr(fcx, expr_ty(fcx.ccx.tcx, expr_t),
                                             expr_t);
-            ret @fold.respan[ast.stmt_](stmt.span, ast.stmt_expr(expr_t, a));
+            ret @fold.respan[ast.stmt_](stmt.span,
+                   ast.stmt_expr(expr_t, plain_ann(fcx.ccx.tystore)));
         }
     }
 
diff --git a/src/comp/middle/typestate_check.rs b/src/comp/middle/typestate_check.rs
index 693521778dd..7ddfa94b1d0 100644
--- a/src/comp/middle/typestate_check.rs
+++ b/src/comp/middle/typestate_check.rs
@@ -105,6 +105,8 @@ import util.common.log_expr_err;
 import util.common.log_stmt;
 import util.common.log_block;
 import util.common.log_stmt_err;
+import util.common.log_fn_err;
+import util.common.log_fn;
 import util.common.log_block_err;
 import util.common.has_nonlocal_exits;
 import util.common.decl_lhs;
@@ -889,11 +891,11 @@ fn find_pre_post_expr(&fn_info_map fm, &fn_info enclosing, &expr e) -> () {
     fn pp_one(&@expr e) -> pre_and_post {
         ret expr_pp(*e);
     }
-    /*
+    
         log("find_pre_post_expr (num_locals =" +
              uistr(num_local_vars) + "):");
-          log_expr(e);
-    */
+        log_expr(e);
+    
     alt (e.node) {
         case (expr_call(?operator, ?operands, ?a)) {
             auto args = _vec.clone[@expr](operands);
@@ -1201,6 +1203,9 @@ fn gen_poststate(&fn_info enclosing, &ann a, def_id id) -> bool {
 
 fn find_pre_post_stmt(fn_info_map fm, &fn_info enclosing, &ast.stmt s)
     -> () {
+    log("stmt =");
+    log_stmt(s);
+
   auto num_local_vars = num_locals(enclosing);
   alt(s.node) {
     case(ast.stmt_decl(?adecl, ?a)) {
@@ -1311,6 +1316,9 @@ fn find_pre_post_fn(&fn_info_map fm, &fn_info fi, &_fn f) -> () {
 fn check_item_fn(&fn_info_map fm, &span sp, ident i, &ast._fn f,
                  vec[ast.ty_param] ty_params, def_id id, ann a) -> @item {
 
+    log("check_item_fn:");
+    log_fn(f, i, ty_params);
+
   check (fm.contains_key(id));
   find_pre_post_fn(fm, fm.get(id), f);  
 
@@ -1413,7 +1421,7 @@ fn set_pre_and_post(&ann a, pre_and_post pp) -> () {
             set_postcondition(t, pp.postcondition);
         }
         case (ann_none) {
-            log("set_pre_and_post: expected an ann_type here");
+            log_err("set_pre_and_post: expected an ann_type here");
             fail;
         }
     }
@@ -1749,7 +1757,7 @@ fn find_pre_post_state_expr(&fn_info_map fm, &fn_info enclosing,
                 changed = find_pre_post_state_block(fm, enclosing, e_post,
                                                     an_alt.block) || changed;
                 changed = intersect(a_post, block_poststate(an_alt.block))
-                    || changed;
+                    || changed; 
             }
         }
         else {
diff --git a/src/comp/util/common.rs b/src/comp/util/common.rs
index fd0d688bab8..7484b4cf76f 100644
--- a/src/comp/util/common.rs
+++ b/src/comp/util/common.rs
@@ -16,6 +16,7 @@ import std.io.string_writer;
 import pretty.pprust.print_block;
 import pretty.pprust.print_expr;
 import pretty.pprust.print_decl;
+import pretty.pprust.print_fn;
 import pretty.pp.mkstate;
 
 type filename = str;
@@ -169,6 +170,25 @@ fn log_ann(&ast.ann a) -> () {
     }
 }
 
+fn fun_to_str(&ast._fn f, str name, vec[ast.ty_param] params) -> str {
+ let str_writer s = string_writer();
+  auto out_ = mkstate(s.get_writer(), 80u);
+  auto out = @rec(s=out_,
+                  comments=none[vec[front.lexer.cmnt]],
+                  mutable cur_cmnt=0u);
+
+  print_fn(out, f.decl, name, params);
+  ret s.get_str();
+}
+
+fn log_fn(&ast._fn f, str name, vec[ast.ty_param] params) -> () {
+    log(fun_to_str(f, name, params));
+}
+
+fn log_fn_err(&ast._fn f, str name, vec[ast.ty_param] params) -> () {
+    log_err(fun_to_str(f, name, params));
+}
+
 fn stmt_to_str(&ast.stmt st) -> str {
   let str_writer s = string_writer();
   auto out_ = mkstate(s.get_writer(), 80u);