about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libcore/priv.rs4
-rw-r--r--src/libcore/vec.rs4
-rw-r--r--src/librustsyntax/ast.rs6
-rw-r--r--src/librustsyntax/parse/parser.rs11
-rw-r--r--src/librustsyntax/print/pprust.rs1
-rw-r--r--src/rustc/metadata/creader.rs8
-rw-r--r--src/rustc/middle/infer.rs23
-rw-r--r--src/rustc/middle/kind.rs2
-rw-r--r--src/rustc/middle/ty.rs26
-rw-r--r--src/rustc/middle/typeck.rs139
-rw-r--r--src/test/compile-fail/issue-1763.rs7
-rw-r--r--src/test/compile-fail/issue-2163.rs2
-rw-r--r--src/test/compile-fail/region-unused.rs3
-rw-r--r--src/test/compile-fail/regions-blk.rs15
-rw-r--r--src/test/compile-fail/regions-in-consts.rs7
-rw-r--r--src/test/compile-fail/regions-in-type-items.rs2
-rw-r--r--src/test/compile-fail/regions-out-of-scope-slice.rs13
-rw-r--r--src/test/compile-fail/regions-var-type-out-of-scope.rs13
-rw-r--r--src/test/compile-fail/use-after-send.rs3
-rw-r--r--src/test/compile-fail/vector-no-ann.rs3
-rw-r--r--src/test/run-fail/bug-811.rs2
-rw-r--r--src/test/run-fail/issue-1763.rs14
-rw-r--r--src/test/run-fail/result-get-fail.rs2
-rw-r--r--src/test/run-pass/class-poly-methods-cross-crate.rs2
-rw-r--r--src/test/run-pass/iter-to-vec.rs5
-rw-r--r--src/test/run-pass/regions-mock-trans.rs2
-rw-r--r--src/test/run-pass/unreachable-code-1.rs (renamed from src/test/compile-fail/unreachable-code-1.rs)1
-rw-r--r--src/test/run-pass/unreachable-code.rs57
-rw-r--r--src/test/run-pass/vector-no-ann.rs4
-rw-r--r--src/test/run-pass/weird-exprs.rs7
30 files changed, 234 insertions, 154 deletions
diff --git a/src/libcore/priv.rs b/src/libcore/priv.rs
index 90fc9239e14..4aa8b57568f 100644
--- a/src/libcore/priv.rs
+++ b/src/libcore/priv.rs
@@ -14,7 +14,7 @@ native mod rustrt {
     fn rust_task_unweaken(ch: rust_port_id);
 }
 
-type global_ptr<T: send> = *libc::uintptr_t;
+type global_ptr = *libc::uintptr_t;
 
 #[doc = "
 Atomically gets a channel from a pointer to a pointer-sized memory location
@@ -22,7 +22,7 @@ or, if no channel exists creates and installs a new channel and sets up a new
 task to receive from it.
 "]
 unsafe fn chan_from_global_ptr<T: send>(
-    global: global_ptr<T>,
+    global: global_ptr,
     builder: fn() -> task::builder,
     f: fn~(comm::port<T>)
 ) -> comm::chan<T> {
diff --git a/src/libcore/vec.rs b/src/libcore/vec.rs
index ad1c3f2344a..3215f3b9f28 100644
--- a/src/libcore/vec.rs
+++ b/src/libcore/vec.rs
@@ -1168,7 +1168,9 @@ mod unsafe {
     #[inline(always)]
     unsafe fn form_slice<T,U>(p: *T, len: uint, f: fn([T]/&) -> U) -> U {
         let pair = (p, len * sys::size_of::<T>());
-        let v : *([T]/&) = ::unsafe::reinterpret_cast(ptr::addr_of(pair));
+        // FIXME: should use &blk not &static here, but a snapshot is req'd
+        let v : *([T]/&static) =
+            ::unsafe::reinterpret_cast(ptr::addr_of(pair));
         f(*v)
     }
 }
diff --git a/src/librustsyntax/ast.rs b/src/librustsyntax/ast.rs
index 48e8866d3f5..4a4b5ea4d38 100644
--- a/src/librustsyntax/ast.rs
+++ b/src/librustsyntax/ast.rs
@@ -452,11 +452,7 @@ enum prim_ty {
 type region = {id: node_id, node: region_};
 
 #[auto_serialize]
-enum region_ {
-    re_anon,
-    re_named(ident),
-    re_static
-}
+enum region_ { re_anon, re_named(ident) }
 
 #[auto_serialize]
 enum ty_ {
diff --git a/src/librustsyntax/parse/parser.rs b/src/librustsyntax/parse/parser.rs
index 890e59cbb14..0c681900dd5 100644
--- a/src/librustsyntax/parse/parser.rs
+++ b/src/librustsyntax/parse/parser.rs
@@ -250,16 +250,7 @@ fn parse_ret_ty(p: parser) -> (ast::ret_style, @ast::ty) {
 
 fn region_from_name(p: parser, s: option<str>) -> @ast::region {
     let r = alt s {
-      some (string) {
-        // FIXME: To be consistent with our type resolution, the
-        // static region should probably be resolved during type
-        // checking, not in the parser. (Issue #2256)
-        if string == "static" {
-            ast::re_static
-        } else {
-            ast::re_named(string)
-        }
-      }
+      some (string) { ast::re_named(string) }
       none { ast::re_anon }
     };
 
diff --git a/src/librustsyntax/print/pprust.rs b/src/librustsyntax/print/pprust.rs
index 6310a8b08a3..d67a2c822d0 100644
--- a/src/librustsyntax/print/pprust.rs
+++ b/src/librustsyntax/print/pprust.rs
@@ -329,7 +329,6 @@ fn print_native_mod(s: ps, nmod: ast::native_mod, attrs: [ast::attribute]) {
 fn print_region(s: ps, region: @ast::region) {
     alt region.node {
       ast::re_anon { word_space(s, "&"); }
-      ast::re_static { word_space(s, "&static"); }
       ast::re_named(name) {
         word(s.s, "&");
         word_space(s, name);
diff --git a/src/rustc/metadata/creader.rs b/src/rustc/metadata/creader.rs
index 1f4bc2cdcf7..bae50d13d17 100644
--- a/src/rustc/metadata/creader.rs
+++ b/src/rustc/metadata/creader.rs
@@ -251,23 +251,23 @@ fn find_library_crate_aux(sess: session::session,
         if !(str::starts_with(f, prefix) && str::ends_with(f, suffix)) {
             #debug("skipping %s, doesn't look like %s*%s", path, prefix,
                    suffix);
-            option::none
+            option::none::<()>
         } else {
             #debug("%s is a candidate", path);
             alt get_metadata_section(sess, path) {
               option::some(cvec) {
                 if !crate_matches(cvec, metas, hash) {
                     #debug("skipping %s, metadata doesn't match", path);
-                    option::none
+                    option::none::<()>
                 } else {
                     #debug("found %s with matching metadata", path);
                     matches += [{ident: path, data: cvec}];
-                    option::none
+                    option::none::<()>
                 }
               }
               _ {
                 #debug("could not load metadata for %s", path);
-                option::none
+                option::none::<()>
               }
             }
         }
diff --git a/src/rustc/middle/infer.rs b/src/rustc/middle/infer.rs
index d5e22815b7b..0477f6469cc 100644
--- a/src/rustc/middle/infer.rs
+++ b/src/rustc/middle/infer.rs
@@ -579,11 +579,8 @@ impl unify_methods for infer_ctxt {
 // [B].  Deep resolution, on the other hand, would yield [int].
 //
 // But there is one more knob: the force_vars variable controls the
-// behavior in the face of unconstrained variables.  If we have A, B
-// and only the constraint that A <: B, then the result is [_|_] if
-// force_vars is true and [B] otherwise.  We use force_vars == true
-// when resolving types after typeck, but false otherwise (for
-// example, when pretty-printing them for errors).
+// behavior in the face of unconstrained variables.  If it is true,
+// then unconstrained variables result in an error.
 
 type resolve_state = @{
     infcx: infer_ctxt,
@@ -673,8 +670,12 @@ impl methods for resolve_state {
             let r1 = alt bounds {
               { ub:_, lb:some(t) } { self.resolve_region(t) }
               { ub:some(t), lb:_ } { self.resolve_region(t) }
-              { ub:none, lb:none } if self.force_vars { ty::re_static }
-              { ub:none, lb:none } { ty::re_var(rid) }
+              { ub:none, lb:none } {
+                if self.force_vars {
+                    self.err = some(unresolved_region(rid));
+                }
+                ty::re_var(rid)
+              }
             };
             vec::pop(self.r_seen);
             ret r1;
@@ -700,8 +701,12 @@ impl methods for resolve_state {
               { ub:_, lb:some(t) } if !type_is_bot(t) { self.resolve1(t) }
               { ub:some(t), lb:_ } { self.resolve1(t) }
               { ub:_, lb:some(t) } { self.resolve1(t) }
-              { ub:none, lb:none } if self.force_vars { ty::mk_bot(tcx) }
-              { ub:none, lb:none } { ty::mk_var(tcx, vid) }
+              { ub:none, lb:none } {
+                if self.force_vars {
+                    self.err = some(unresolved_ty(vid));
+                }
+                ty::mk_var(tcx, vid)
+              }
             };
             vec::pop(self.v_seen);
             ret t1;
diff --git a/src/rustc/middle/kind.rs b/src/rustc/middle/kind.rs
index 0b29b0c52cd..dee278e7ed0 100644
--- a/src/rustc/middle/kind.rs
+++ b/src/rustc/middle/kind.rs
@@ -4,6 +4,7 @@ import syntax::codemap::span;
 import ty::{kind, kind_copyable, kind_sendable, kind_noncopyable};
 import driver::session::session;
 import std::map::hashmap;
+import syntax::print::pprust::expr_to_str;
 
 // Kind analysis pass. There are three kinds:
 //
@@ -138,6 +139,7 @@ fn check_block(b: blk, cx: ctx, v: visit::vt<ctx>) {
 }
 
 fn check_expr(e: @expr, cx: ctx, v: visit::vt<ctx>) {
+    #debug["kind::check_expr(%s)", expr_to_str(e)];
     alt e.node {
       expr_assign(_, ex) | expr_assign_op(_, _, ex) |
       expr_unary(box(_), ex) | expr_unary(uniq(_), ex) |
diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs
index 9830fe9c36b..cf8f223afd9 100644
--- a/src/rustc/middle/ty.rs
+++ b/src/rustc/middle/ty.rs
@@ -37,7 +37,7 @@ export expr_ty_params_and_ty;
 export expr_is_lval;
 export field_ty;
 export fold_ty, fold_sty_to_ty, fold_region, fold_regions, fold_ty_var;
-export fold_regions_and_ty;
+export fold_regions_and_ty, walk_regions_and_ty;
 export field;
 export field_idx;
 export get_field;
@@ -97,7 +97,7 @@ export ty_tup, mk_tup;
 export ty_type, mk_type;
 export ty_uint, mk_uint, mk_mach_uint;
 export ty_uniq, mk_uniq, mk_imm_uniq, type_is_unique_box;
-export ty_var, mk_var;
+export ty_var, mk_var, type_is_var;
 export ty_self, mk_self;
 export region, bound_region;
 export get, type_has_params, type_has_vars, type_has_regions;
@@ -818,6 +818,21 @@ fn fold_ty_var(cx: ctxt, t0: t, fldop: fn(ty_vid) -> t) -> t {
     }
 }
 
+fn walk_regions_and_ty(
+    cx: ctxt,
+    ty: t,
+    walkr: fn(r: region),
+    walkt: fn(t: t) -> bool) {
+
+    if (walkt(ty)) {
+        fold_regions_and_ty(
+            cx, ty,
+            { |r| walkr(r); r },
+            { |t| walkt(t); walk_regions_and_ty(cx, t, walkr, walkt); t },
+            { |t| walkt(t); walk_regions_and_ty(cx, t, walkr, walkt); t });
+    }
+}
+
 fn fold_regions_and_ty(
     cx: ctxt,
     ty: t,
@@ -1000,6 +1015,13 @@ fn type_is_nil(ty: t) -> bool { get(ty).struct == ty_nil }
 
 fn type_is_bot(ty: t) -> bool { get(ty).struct == ty_bot }
 
+fn type_is_var(ty: t) -> bool {
+    alt get(ty).struct {
+      ty_var(_) { true }
+      _ { false }
+    }
+}
+
 fn type_is_bool(ty: t) -> bool { get(ty).struct == ty_bool }
 
 fn type_is_structural(ty: t) -> bool {
diff --git a/src/rustc/middle/typeck.rs b/src/rustc/middle/typeck.rs
index d8c275bfd04..931d3d9e790 100644
--- a/src/rustc/middle/typeck.rs
+++ b/src/rustc/middle/typeck.rs
@@ -105,6 +105,7 @@ type fn_ctxt =
      ty_var_counter: @mut uint,
      region_var_counter: @mut uint,
 
+     mut blocks: [ast::node_id], // stack of blocks in scope, may be empty
      in_scope_regions: isr_alist,
 
      // While type checking a function, the intermediate types for the
@@ -276,10 +277,8 @@ fn instantiate_path(fcx: @fn_ctxt,
 
 // Type tests
 fn structurally_resolved_type(fcx: @fn_ctxt, sp: span, tp: ty::t) -> ty::t {
-    alt infer::resolve_shallow(fcx.infcx, tp, true) {
-      // note: the bot type doesn't count as resolved; it's what we use when
-      // there is no information about a variable.
-      result::ok(t_s) if !ty::type_is_bot(t_s) { ret t_s; }
+    alt infer::resolve_shallow(fcx.infcx, tp, false) {
+      result::ok(t_s) if !ty::type_is_var(t_s) { ret t_s; }
       _ {
         fcx.ccx.tcx.sess.span_fatal
             (sp, "the type of this value must be known in this context");
@@ -322,7 +321,16 @@ fn ast_expr_vstore_to_vstore(fcx: @fn_ctxt, e: @ast::expr, n: uint,
       ast::vstore_uniq { ty::vstore_uniq }
       ast::vstore_box { ty::vstore_box }
       ast::vstore_slice(r) {
-        ty::vstore_slice(ast_region_to_region(fcx, fcx, e.span, r))
+        alt fcx.block_region() {
+          result::ok(b_r) {
+            let rscope = in_anon_rscope(fcx, b_r);
+            ty::vstore_slice(ast_region_to_region(fcx, rscope, e.span, r))
+          }
+          result::err(msg) {
+            fcx.ccx.tcx.sess.span_err(e.span, msg);
+            ty::vstore_slice(ty::re_static)
+          }
+        }
       }
     }
 }
@@ -386,8 +394,9 @@ impl of region_scope for empty_rscope {
     fn anon_region() -> result<ty::region, str> {
         result::err("region types are not allowed here")
     }
-    fn named_region(_id: str) -> result<ty::region, str> {
-        result::err("region types are not allowed here")
+    fn named_region(id: str) -> result<ty::region, str> {
+        if id == "static" { result::ok(ty::re_static) }
+        else { result::err("only the static region is allowed here") }
     }
 }
 
@@ -395,9 +404,7 @@ enum type_rscope = ast::region_param;
 impl of region_scope for type_rscope {
     fn anon_region() -> result<ty::region, str> {
         alt *self {
-          ast::rp_self {
-            result::ok(ty::re_bound(ty::br_self))
-          }
+          ast::rp_self { result::ok(ty::re_bound(ty::br_self)) }
           ast::rp_none {
             result::err("to use region types here, the containing type \
                          must be declared with a region bound")
@@ -405,11 +412,12 @@ impl of region_scope for type_rscope {
         }
     }
     fn named_region(id: str) -> result<ty::region, str> {
-        if id == "self" {
-            self.anon_region()
-        } else {
-            result::err("named regions other than `self` are not \
-                         allowed as part of a type declaration")
+        empty_rscope.named_region(id).chain_err { |_e|
+            if id == "self" { self.anon_region() }
+            else {
+                result::err("named regions other than `self` are not \
+                             allowed as part of a type declaration")
+            }
         }
     }
 }
@@ -419,11 +427,14 @@ impl of region_scope for @fn_ctxt {
         result::ok(self.next_region_var())
     }
     fn named_region(id: str) -> result<ty::region, str> {
-        alt self.in_scope_regions.find(ty::br_named(id)) {
-          some(r) { result::ok(r) }
-          none {
-            result::err(#fmt["named region `%s` not in scope here", id])
-          }
+        empty_rscope.named_region(id).chain_err { |_e|
+            alt self.in_scope_regions.find(ty::br_named(id)) {
+              some(r) { result::ok(r) }
+              none if id == "blk" { self.block_region() }
+              none {
+                result::err(#fmt["named region `%s` not in scope here", id])
+              }
+            }
         }
     }
 }
@@ -477,7 +488,6 @@ fn ast_region_to_region<AC: ast_conv, RS: region_scope>(
     let res = alt a_r.node {
       ast::re_anon { rscope.anon_region() }
       ast::re_named(id) { rscope.named_region(id) }
-      ast::re_static { result::ok(ty::re_static) }
     };
 
     get_region_reporting_err(self.tcx(), span, res)
@@ -772,6 +782,49 @@ fn ast_ty_to_ty<AC: ast_conv, RS: region_scope copy>(
     ret typ;
 }
 
+fn check_bounds_are_used(ccx: @crate_ctxt,
+                         span: span,
+                         tps: [ast::ty_param],
+                         rp: ast::region_param,
+                         ty: ty::t) {
+    let mut r_used = alt rp {
+      ast::rp_self { false }
+      ast::rp_none { true }
+    };
+
+    if tps.len() == 0u && r_used { ret; }
+    let tps_used = vec::to_mut(vec::from_elem(tps.len(), false));
+
+    ty::walk_regions_and_ty(
+        ccx.tcx, ty,
+        { |r|
+            alt r {
+              ty::re_bound(_) { r_used = true; }
+              _ { }
+            }
+        },
+        { |t|
+            alt ty::get(t).struct {
+              ty::ty_param(idx, _) { tps_used[idx] = true; }
+              _ { }
+            }
+            true
+        });
+
+    if !r_used {
+        ccx.tcx.sess.span_err(
+            span, "lifetime `self` unused inside \
+                   reference-parameterized type.");
+    }
+
+    for tps_used.eachi { |i, b|
+        if !b {
+            ccx.tcx.sess.span_err(
+                span, #fmt["Type parameter %s is unused.", tps[i].ident]);
+        }
+    }
+}
+
 fn ty_of_item(ccx: @crate_ctxt, it: @ast::item)
     -> ty::ty_param_bounds_and_ty {
 
@@ -816,6 +869,9 @@ fn ty_of_item(ccx: @crate_ctxt, it: @ast::item)
             };
             {bounds: ty_param_bounds(ccx, tps), rp: rp, ty: ty}
         };
+
+        check_bounds_are_used(ccx, t.span, tps, rp, tpt.ty);
+
         tcx.tcache.insert(local_def(it.id), tpt);
         ret tpt;
       }
@@ -1125,6 +1181,12 @@ impl methods for @fn_ctxt {
     fn ty_to_str(t: ty::t) -> str {
         ty_to_str(self.ccx.tcx, resolve_type_vars_if_possible(self, t))
     }
+    fn block_region() -> result<ty::region, str> {
+        alt vec::last_opt(self.blocks) {
+          some(bid) { result::ok(ty::re_scope(bid)) }
+          none { result::err("no block is in scope here") }
+        }
+    }
     fn write_ty(node_id: ast::node_id, ty: ty::t) {
         #debug["write_ty(%d, %s) in fcx %s",
                node_id, ty_to_str(self.tcx(), ty), self.tag()];
@@ -3144,7 +3206,7 @@ fn check_expr_with_unifier(fcx: @fn_ctxt,
         -> option<O> {
         alt expected {
           some(t) {
-            alt infer::resolve_shallow(fcx.infcx, t, true) {
+            alt infer::resolve_shallow(fcx.infcx, t, false) {
               result::ok(t) { unpack(ty::get(t).struct) }
               _ { none }
             }
@@ -3913,6 +3975,7 @@ fn check_block(fcx0: @fn_ctxt, blk: ast::blk) -> bool {
       ast::unsafe_blk { @{purity: ast::unsafe_fn with *fcx0} }
       ast::default_blk { fcx0 }
     };
+    vec::push(fcx.blocks, blk.node.id);
     let mut bot = false;
     let mut warned = false;
     for blk.node.stmts.each {|s|
@@ -3943,6 +4006,7 @@ fn check_block(fcx0: @fn_ctxt, blk: ast::blk) -> bool {
     if bot {
         fcx.write_bot(blk.node.id);
     }
+    vec::pop(fcx.blocks);
     ret bot;
 }
 
@@ -3960,6 +4024,7 @@ fn check_const(ccx: @crate_ctxt, _sp: span, e: @ast::expr, id: ast::node_id) {
           locals: int_hash(),
           ty_var_counter: @mut 0u,
           region_var_counter: @mut 0u,
+          mut blocks: [],
           in_scope_regions: @nil,
           node_types: smallintmap::mk(),
           node_type_substs: map::int_hash(),
@@ -4000,6 +4065,7 @@ fn check_enum_variants(ccx: @crate_ctxt,
           locals: int_hash(),
           ty_var_counter: @mut 0u,
           region_var_counter: @mut 0u,
+          mut blocks: [],
           in_scope_regions: @nil,
           node_types: smallintmap::mk(),
           node_type_substs: map::int_hash(),
@@ -4262,6 +4328,7 @@ fn check_fn(ccx: @crate_ctxt,
           locals: locals,
           ty_var_counter: tvc,
           region_var_counter: rvc,
+          mut blocks: [],
           in_scope_regions: isr,
           node_types: node_types,
           node_type_substs: node_type_substs,
@@ -4350,21 +4417,27 @@ fn check_fn(ccx: @crate_ctxt,
             visit::visit_pat(p, e, v);
         };
 
+        let visit_block = fn@(b: ast::blk, &&e: (), v: visit::vt<()>) {
+            vec::push(fcx.blocks, b.node.id);
+            visit::visit_block(b, e, v);
+            vec::pop(fcx.blocks);
+        };
+
         // Don't descend into fns and items
-        fn visit_fn<T>(_fk: visit::fn_kind, _decl: ast::fn_decl,
-                       _body: ast::blk, _sp: span,
-                       _id: ast::node_id, _t: T, _v: visit::vt<T>) {
+        fn visit_fn(_fk: visit::fn_kind, _decl: ast::fn_decl,
+                    _body: ast::blk, _sp: span,
+                    _id: ast::node_id, &&_t: (), _v: visit::vt<()>) {
         }
-        fn visit_item<E>(_i: @ast::item, _e: E, _v: visit::vt<E>) { }
+        fn visit_item(_i: @ast::item, &&_e: (), _v: visit::vt<()>) { }
 
-        let visit =
-            @{visit_local: visit_local,
-              visit_pat: visit_pat,
-              visit_fn: bind visit_fn(_, _, _, _, _, _, _),
-              visit_item: bind visit_item(_, _, _)
-              with *visit::default_visitor()};
+        let visit = visit::mk_vt(@{visit_local: visit_local,
+                                   visit_pat: visit_pat,
+                                   visit_fn: visit_fn,
+                                   visit_item: visit_item,
+                                   visit_block: visit_block
+                                   with *visit::default_visitor()});
 
-        visit::visit_block(body, (), visit::mk_vt(visit));
+        visit.visit_block(body, (), visit);
     }
 }
 
diff --git a/src/test/compile-fail/issue-1763.rs b/src/test/compile-fail/issue-1763.rs
new file mode 100644
index 00000000000..678e3cc57ea
--- /dev/null
+++ b/src/test/compile-fail/issue-1763.rs
@@ -0,0 +1,7 @@
+// Issue #1763 - infer types correctly
+
+type actor<T> = { //! ERROR Type parameter T is unused.
+    unused: bool
+};
+
+fn main() {}
diff --git a/src/test/compile-fail/issue-2163.rs b/src/test/compile-fail/issue-2163.rs
index 89437289ebc..15b3d6d96c7 100644
--- a/src/test/compile-fail/issue-2163.rs
+++ b/src/test/compile-fail/issue-2163.rs
@@ -1,5 +1,5 @@
 fn main(s: [str]) {
-    let a = [];
+    let a: [int] = [];
     vec::each(a) { |x| //! ERROR in function `anon`, not all control paths
     }                  //! ERROR see function return type of `bool`
 }
diff --git a/src/test/compile-fail/region-unused.rs b/src/test/compile-fail/region-unused.rs
new file mode 100644
index 00000000000..617315853af
--- /dev/null
+++ b/src/test/compile-fail/region-unused.rs
@@ -0,0 +1,3 @@
+type foo/& = {f: int}; //! ERROR lifetime `self` unused
+
+fn main() {}
\ No newline at end of file
diff --git a/src/test/compile-fail/regions-blk.rs b/src/test/compile-fail/regions-blk.rs
new file mode 100644
index 00000000000..0d0cdb6d93f
--- /dev/null
+++ b/src/test/compile-fail/regions-blk.rs
@@ -0,0 +1,15 @@
+fn foo(cond: bool) {
+    let x = 5;
+    let mut y: &blk.int = &x;
+
+    let mut z: &blk.int;
+    if cond {
+        z = &x;
+    } else {
+        let w: &blk.int = &x;
+        z = w; //! ERROR mismatched types
+    }
+}
+
+fn main() {
+}
\ No newline at end of file
diff --git a/src/test/compile-fail/regions-in-consts.rs b/src/test/compile-fail/regions-in-consts.rs
new file mode 100644
index 00000000000..c48fec0f8ac
--- /dev/null
+++ b/src/test/compile-fail/regions-in-consts.rs
@@ -0,0 +1,7 @@
+// xfail-test
+
+const c_x: &blk.int = 22; //! ERROR only the static region is allowed here
+const c_y: &static.int = &22; //! ERROR only the static region is allowed here
+
+fn main() {
+}
\ No newline at end of file
diff --git a/src/test/compile-fail/regions-in-type-items.rs b/src/test/compile-fail/regions-in-type-items.rs
index 49202a340a1..c4619001e7c 100644
--- a/src/test/compile-fail/regions-in-type-items.rs
+++ b/src/test/compile-fail/regions-in-type-items.rs
@@ -18,7 +18,7 @@ type item_ty_yes1/& = {
     x: &self.uint
 };
 
-type item_ty_yes2/& = {
+type item_ty_yes2/& = { //! ERROR lifetime `self` unused inside reference-parameterized type
     x: &foo.uint //! ERROR named regions other than `self` are not allowed as part of a type declaration
 };
 
diff --git a/src/test/compile-fail/regions-out-of-scope-slice.rs b/src/test/compile-fail/regions-out-of-scope-slice.rs
new file mode 100644
index 00000000000..5f5aadaa107
--- /dev/null
+++ b/src/test/compile-fail/regions-out-of-scope-slice.rs
@@ -0,0 +1,13 @@
+// xfail-test
+
+fn foo(cond: bool) {
+    // Here we will infer a type that uses the
+    // region of the if stmt then block, but in the scope:
+    let mut x; //! ERROR foo
+
+    if cond {
+        x = [1,2,3]/&blk;
+    }
+}
+
+fn main() {}
\ No newline at end of file
diff --git a/src/test/compile-fail/regions-var-type-out-of-scope.rs b/src/test/compile-fail/regions-var-type-out-of-scope.rs
new file mode 100644
index 00000000000..b8aecb05e89
--- /dev/null
+++ b/src/test/compile-fail/regions-var-type-out-of-scope.rs
@@ -0,0 +1,13 @@
+// xfail-test
+
+fn foo(cond: bool) {
+    // Here we will infer a type that uses the
+    // region of the if stmt then block:
+    let mut x; //! ERROR foo
+
+    if cond {
+        x = &3;
+    }
+}
+
+fn main() {}
\ No newline at end of file
diff --git a/src/test/compile-fail/use-after-send.rs b/src/test/compile-fail/use-after-send.rs
index 3f1c0ab41e6..4fe164878a8 100644
--- a/src/test/compile-fail/use-after-send.rs
+++ b/src/test/compile-fail/use-after-send.rs
@@ -4,7 +4,8 @@ fn send<T: send>(ch: _chan<T>, -data: T) {
     log(debug, data);
     fail;
 }
-type _chan<T> = int;
+
+enum _chan<T> = int;
 
 // Tests that "log(debug, message);" is flagged as using
 // message after the send deinitializes it
diff --git a/src/test/compile-fail/vector-no-ann.rs b/src/test/compile-fail/vector-no-ann.rs
new file mode 100644
index 00000000000..8d4478d949f
--- /dev/null
+++ b/src/test/compile-fail/vector-no-ann.rs
@@ -0,0 +1,3 @@
+fn main() {
+    let _foo = []; //! ERROR unconstrained type
+}
diff --git a/src/test/run-fail/bug-811.rs b/src/test/run-fail/bug-811.rs
index 62206f93994..a7d360ff8fc 100644
--- a/src/test/run-fail/bug-811.rs
+++ b/src/test/run-fail/bug-811.rs
@@ -4,7 +4,7 @@ fn test00_start(ch: chan_t<int>, message: int) { send(ch, copy message); }
 type task_id = int;
 type port_id = int;
 
-type chan_t<T: send> = {task: task_id, port: port_id};
+enum chan_t<T: send> = {task: task_id, port: port_id};
 
 fn send<T: send>(ch: chan_t<T>, -data: T) { fail; }
 
diff --git a/src/test/run-fail/issue-1763.rs b/src/test/run-fail/issue-1763.rs
deleted file mode 100644
index 36ea0d961b7..00000000000
--- a/src/test/run-fail/issue-1763.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-// Issue #1763 - infer types correctly
-// error-pattern:explicit failure
-
-type actor<T> = {
-    unused: bool
-};
-
-fn act2<T>() -> actor<T> {
-    fail;
-}
-
-fn main() {
-    let a: actor<int> = act2();
-}
diff --git a/src/test/run-fail/result-get-fail.rs b/src/test/run-fail/result-get-fail.rs
index 3b8e693e969..6f614258bcb 100644
--- a/src/test/run-fail/result-get-fail.rs
+++ b/src/test/run-fail/result-get-fail.rs
@@ -1,4 +1,4 @@
 // error-pattern:get called on error result: "kitty"
 fn main() {
-  log(error, result::get(result::err("kitty")));
+  log(error, result::get(result::err::<int,str>("kitty")));
 }
\ No newline at end of file
diff --git a/src/test/run-pass/class-poly-methods-cross-crate.rs b/src/test/run-pass/class-poly-methods-cross-crate.rs
index 28ddbfdd1e2..d46f501f0fa 100644
--- a/src/test/run-pass/class-poly-methods-cross-crate.rs
+++ b/src/test/run-pass/class-poly-methods-cross-crate.rs
@@ -1,3 +1,5 @@
+// xfail-test
+
 // xfail-fast
 // aux-build:cci_class_6.rs
 use cci_class_6;
diff --git a/src/test/run-pass/iter-to-vec.rs b/src/test/run-pass/iter-to-vec.rs
index 1f7afdb1c7b..3b2f1b2ced5 100644
--- a/src/test/run-pass/iter-to-vec.rs
+++ b/src/test/run-pass/iter-to-vec.rs
@@ -1,7 +1,8 @@
 fn main() {
     assert [1u, 3u].to_vec() == [1u, 3u];
-    assert [].to_vec() == [];
-    assert none.to_vec() == [];
+    let e: [uint] = [];
+    assert e.to_vec() == [];
+    assert none::<uint>.to_vec() == [];
     assert some(1u).to_vec() == [1u];
     assert some(2u).to_vec() == [2u];
 }
\ No newline at end of file
diff --git a/src/test/run-pass/regions-mock-trans.rs b/src/test/run-pass/regions-mock-trans.rs
index 4568bca444c..822ed735f77 100644
--- a/src/test/run-pass/regions-mock-trans.rs
+++ b/src/test/run-pass/regions-mock-trans.rs
@@ -16,7 +16,7 @@ type ccx = {
 };
 
 fn alloc(_bcx : &a.arena) -> &a.bcx unsafe {
-    ret unsafe::reinterpret_cast(libc::malloc(sys::size_of::<bcx>()));
+    ret unsafe::reinterpret_cast(libc::malloc(sys::size_of::<bcx/&blk>()));
 }
 
 fn h(bcx : &a.bcx) -> &a.bcx {
diff --git a/src/test/compile-fail/unreachable-code-1.rs b/src/test/run-pass/unreachable-code-1.rs
index 1dba6f952b5..38b97b47e4b 100644
--- a/src/test/compile-fail/unreachable-code-1.rs
+++ b/src/test/run-pass/unreachable-code-1.rs
@@ -8,7 +8,6 @@ fn call_id() {
 }
 
 fn call_id_3() { id(ret) && id(ret); }
-    //!^ ERROR the type of this value must be known
 
 fn main() {
 }
diff --git a/src/test/run-pass/unreachable-code.rs b/src/test/run-pass/unreachable-code.rs
deleted file mode 100644
index c97224144e2..00000000000
--- a/src/test/run-pass/unreachable-code.rs
+++ /dev/null
@@ -1,57 +0,0 @@
-// xfail-pretty
-
-fn id(x: bool) -> bool { x }
-
-fn call_id() {
-    let c <- fail;
-    id(c);
-}
-
-fn call_id_2() { id(true) && id(ret); }
-
-fn call_id_4() { while id(ret) { } }
-
-fn bind_id_1() { bind id(fail); }
-
-fn bind_id_2() { bind id(ret); }
-
-fn fail_fail() { fail fail; }
-
-fn log_fail() { log(error, fail); }
-
-fn log_ret() { log(error, ret); }
-
-fn log_break() { loop { log(error, break); } }
-
-fn log_cont() { do { log(error, cont); } while false }
-
-fn ret_ret() -> int { ret 3 + (ret 2); }
-
-fn ret_guard() {
-    alt check 2 {
-      x if (ret) { x; }
-    }
-}
-
-fn rec_ret() { let _r: {c: int} = {c: ret}; }
-
-fn vec_ret() { let _v: [int] = [1, 2, ret, 4]; }
-
-fn fail_then_concat() {
-    let mut x = [], y = [3];
-    fail;
-    x += y;
-    "good" + "bye";
-}
-
-fn main() {
-  // Call the functions that don't fail.
-  rec_ret();
-  vec_ret();
-  ret_ret();
-  log_ret();
-  call_id_2();
-  call_id_4();
-  bind_id_2();
-  ret_guard();
-}
diff --git a/src/test/run-pass/vector-no-ann.rs b/src/test/run-pass/vector-no-ann.rs
deleted file mode 100644
index dec8ca27db6..00000000000
--- a/src/test/run-pass/vector-no-ann.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-fn main() {
-    // We will infer this to have the type vec[bot]
-    let _foo = [];
-}
diff --git a/src/test/run-pass/weird-exprs.rs b/src/test/run-pass/weird-exprs.rs
index e13c1a0d6af..bf3bd4c8ae6 100644
--- a/src/test/run-pass/weird-exprs.rs
+++ b/src/test/run-pass/weird-exprs.rs
@@ -1,6 +1,6 @@
 // Just a grab bag of stuff that you wouldn't want to actually write.
 
-fn strange() -> bool { let _x = ret true; }
+fn strange() -> bool { let _x: bool = ret true; }
 
 fn funny() {
     fn f(_x: ()) { }
@@ -20,13 +20,14 @@ fn zombiejesus() {
         while (ret) {
             if (ret) {
                 alt (ret) {
-                    _ {
+                    1 {
                         if (ret) {
                             ret
                         } else {
                             ret
                         }
                     }
+                    _ { ret }
                 };
             } else if (ret) {
                 ret;
@@ -51,7 +52,7 @@ fn canttouchthis() -> uint {
     pure fn p() -> bool { true }
     let _a = (assert (true)) == (check (p()));
     let _c = (check (p())) == ();
-    let _b = (log(debug, 0) == (ret 0u));
+    let _b: bool = (log(debug, 0) == (ret 0u));
 }
 
 fn angrydome() {