Promote unreachable code to being a lint attribute

This commit is contained in:
Alex Crichton 2013-05-30 03:03:32 -05:00
parent 237dce12c9
commit aed53f9bf0
9 changed files with 37 additions and 21 deletions

View 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 @@ static lint_table: &'static [(&'static str, LintSpec)] = &[
desc: "detects missing documentation for public members",
default: allow
}),
("unreachable_code",
LintSpec {
lint: unreachable_code,
desc: "detects unreachable code",
default: warn
}),
];
/*

View File

@ -81,6 +81,7 @@ use core::prelude::*;
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) {

View 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
}

View 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() {}

View 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() { }

View 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() { }

View 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`

View 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`

View 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
}