提交 aed53f9b 编写于 作者: A Alex Crichton

Promote unreachable code to being a lint attribute

上级 237dce12
......@@ -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
}),
];
/*
......
......@@ -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) {
......
......@@ -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
}
......@@ -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() {}
......@@ -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() { }
......@@ -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() { }
......@@ -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`
......
......@@ -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`
......
......@@ -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
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册