]> git.lizzy.rs Git - rust.git/commitdiff
Promote unreachable code to being a lint attribute
authorAlex Crichton <alex@alexcrichton.com>
Thu, 30 May 2013 08:03:32 +0000 (03:03 -0500)
committerAlex Crichton <alex@alexcrichton.com>
Fri, 31 May 2013 01:45:13 +0000 (20:45 -0500)
src/librustc/middle/lint.rs
src/librustc/middle/typeck/check/mod.rs
src/test/compile-fail/dead-code-ret.rs
src/test/compile-fail/issue-2150.rs
src/test/compile-fail/issue-897-2.rs
src/test/compile-fail/issue-897.rs
src/test/compile-fail/liveness-break-uninit-2.rs
src/test/compile-fail/liveness-break-uninit.rs
src/test/compile-fail/unreachable-code.rs

index 6dd911e8ef321672732e3074e1e5e105d1c7d15e..c460ec89e4e9e0bd404da06107e277e99728795e 100644 (file)
@@ -96,6 +96,7 @@ pub enum lint {
     unnecessary_allocation,
 
     missing_doc,
+    unreachable_code,
 }
 
 pub fn level_to_str(lv: level) -> &'static str {
@@ -273,6 +274,13 @@ enum LintSource {
         desc: "detects missing documentation for public members",
         default: allow
     }),
+
+    ("unreachable_code",
+     LintSpec {
+        lint: unreachable_code,
+        desc: "detects unreachable code",
+        default: warn
+    }),
 ];
 
 /*
index 61da263e8439a96d7c6577f1a92a9ae24e3d3122..f8481d4cf904d0e8b195052c93f93183dbbafc5d 100644 (file)
@@ -81,6 +81,7 @@
 use middle::const_eval;
 use middle::pat_util::pat_id_map;
 use middle::pat_util;
+use middle::lint::unreachable_code;
 use middle::ty::{FnSig, VariantInfo_};
 use middle::ty::{ty_param_bounds_and_ty, ty_param_substs_and_ty};
 use middle::ty::{substs, param_ty};
@@ -2937,7 +2938,8 @@ pub fn check_block_with_expected(fcx: @mut FnCtxt,
         let mut any_err = false;
         for blk.node.stmts.each |s| {
             check_stmt(fcx, *s);
-            let s_ty = fcx.node_ty(ast_util::stmt_id(*s));
+            let s_id = ast_util::stmt_id(*s);
+            let s_ty = fcx.node_ty(s_id);
             if last_was_bot && !warned && match s.node {
                   ast::stmt_decl(@codemap::spanned { node: ast::decl_local(_),
                                                  _}, _) |
@@ -2946,7 +2948,8 @@ pub fn check_block_with_expected(fcx: @mut FnCtxt,
                   }
                   _ => false
                 } {
-                fcx.ccx.tcx.sess.span_warn(s.span, "unreachable statement");
+                fcx.ccx.tcx.sess.add_lint(unreachable_code, s_id, s.span,
+                                          ~"unreachable statement");
                 warned = true;
             }
             if ty::type_is_bot(s_ty) {
index 5fa796db884446639c8bb821d3daeb636aab7db5..91b89a67ee3484859ab65123cef0a0bfbb85c366 100644 (file)
@@ -9,13 +9,9 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-
-fn f(caller: &str) {
-    debug!(caller);
-    let x: uint = 0u32; // induce type error //~ ERROR mismatched types
-}
+#[deny(unreachable_code)];
 
 fn main() {
-    return f("main");
-    debug!("Paul is dead"); //~ WARNING unreachable
+    return;
+    debug!("Paul is dead"); //~ ERROR: unreachable
 }
index 9f2f9a855ed52e6dc39e7c1644d651239929586d..0b35104841e64b678e6104cbb0a7c67a043fc05d 100644 (file)
@@ -8,11 +8,14 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#[deny(unreachable_code)];
+#[allow(unused_variable)];
+
 fn fail_len(v: ~[int]) -> uint {
-    let mut i = fail!();
+    let mut i = 3;
+    fail!();
     for v.each |x| { i += 1u; }
-    //~^ WARNING unreachable statement
-    //~^^ ERROR the type of this value must be known
+    //~^ ERROR: unreachable statement
     return i;
 }
 fn main() {}
index 253563c12195ce6ca11e3f0b76dee7186c3484c7..eb60e34df8f14e5f4259634f7d6bb5673b41fd41 100644 (file)
@@ -8,9 +8,11 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#[deny(unreachable_code)];
+
 fn g() -> ! { fail!(); }
 fn f() -> ! {
-    return 42i; //~ ERROR expected `!` but found `int`
-    g(); //~ WARNING unreachable statement
+    return g();
+    g(); //~ ERROR: unreachable statement
 }
 fn main() { }
index 503574fce877356ab59ab10c8e45b3a208ae7a2a..103156175a3fd0d8447568173f6cb8b0be90310f 100644 (file)
@@ -8,8 +8,10 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#[deny(unreachable_code)];
+
 fn f() -> ! {
-    return 42i; //~ ERROR expected `!` but found `int`
-    fail!(); //~ WARNING unreachable statement
+    return fail!();
+    fail!(); //~ ERROR: unreachable statement
 }
 fn main() { }
index c87439db6173a8c9547b5ae3d7f29c87c7f679ac..2ed02e2cdd7db3e3f54ef6d82afcf4c8a0ade012 100644 (file)
@@ -13,7 +13,7 @@ fn foo() -> int {
 
     while 1 != 2  {
         break;
-        x = 0; //~ WARNING unreachable statement
+        x = 0;
     }
 
     debug!(x); //~ ERROR use of possibly uninitialized variable: `x`
index 07075e4ef63989d3e1c55ef27925d355d8eefcc0..2dcbad2804c16e7eb70c553d651950f5b3be188b 100644 (file)
@@ -13,7 +13,7 @@ fn foo() -> int {
 
     loop {
         break;
-        x = 0;  //~ WARNING unreachable statement
+        x = 0;
     }
 
     debug!(x); //~ ERROR use of possibly uninitialized variable: `x`
index f1fbc5b009e0a98a7f64d67c1f468bafdd56455d..a9365eeda1c55a62aa350340763c7205d3435def 100644 (file)
@@ -8,9 +8,11 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-// error-pattern:unreachable statement
+#[deny(unreachable_code)];
+#[allow(unused_variable)];
+
 fn main() {
   loop{}
-             // red herring to make sure compilation fails
-  error!(42 == 'c');
+
+  let a = 3; //~ ERROR: unreachable statement
 }