!is_iterator_used_after_while_let(cx, iter_expr) {
let iterator = snippet(cx, method_args[0].span, "_");
let loop_var = snippet(cx, pat_args[0].span, "_");
- span_help_and_lint(cx,
+ span_lint_and_then(cx,
WHILE_LET_ON_ITERATOR,
expr.span,
"this loop could be written as a `for` loop",
- &format!("try\nfor {} in {} {{...}}", loop_var, iterator));
+ |db| {
+ db.span_suggestion(expr.span,
+ "try",
+ format!("for {} in {} {{ .. }}", loop_var, iterator));
+ });
}
}
}
|db| {
db.span_suggestion(expr.span,
"use the corresponding method",
- format!("for {} in {}.{}() {{...}}",
+ format!("for {} in {}.{}() {{ .. }}",
snippet(cx, *pat_span, ".."),
snippet(cx, arg_span, ".."),
kind));
let u: u32 = 42;
- u <= 0; //~ERROR this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
- u <= Z; //~ERROR this comparison involving
- u < Z; //~ERROR this comparison involving
- Z >= u; //~ERROR this comparison involving
- Z > u; //~ERROR this comparison involving
- u > std::u32::MAX; //~ERROR this comparison involving
- u >= std::u32::MAX; //~ERROR this comparison involving
- std::u32::MAX < u; //~ERROR this comparison involving
- std::u32::MAX <= u; //~ERROR this comparison involving
+ u <= 0;
+ //~^ ERROR this comparison involving the minimum or maximum element for this type contains a case that is always true or always false
+ //~| HELP using u == 0 instead
+ u <= Z;
+ //~^ ERROR this comparison involving
+ //~| HELP using u == Z instead
+ u < Z;
+ //~^ ERROR this comparison involving
+ //~| HELP comparison is always false
+ Z >= u;
+ //~^ ERROR this comparison involving
+ //~| HELP using Z == u instead
+ Z > u;
+ //~^ ERROR this comparison involving
+ //~| HELP comparison is always false
+ u > std::u32::MAX;
+ //~^ ERROR this comparison involving
+ //~| HELP comparison is always false
+ u >= std::u32::MAX;
+ //~^ ERROR this comparison involving
+ //~| HELP using u == std::u32::MAX instead
+ std::u32::MAX < u;
+ //~^ ERROR this comparison involving
+ //~| HELP comparison is always false
+ std::u32::MAX <= u;
+ //~^ ERROR this comparison involving
+ //~| HELP using std::u32::MAX == u instead
1-1 > u;
//~^ ERROR this comparison involving
//~| HELP because 12 - 2*6 is the minimum value for this type, the case where the two sides are not equal never occurs, consider using u == 12 - 2*6 instead
let i: i8 = 0;
- i < -127 - 1; //~ERROR this comparison involving
- std::i8::MAX >= i; //~ERROR this comparison involving
- 3-7 < std::i32::MIN; //~ERROR this comparison involving
+ i < -127 - 1;
+ //~^ ERROR this comparison involving
+ //~| HELP comparison is always false
+ std::i8::MAX >= i;
+ //~^ ERROR this comparison involving
+ //~| HELP comparison is always true
+ 3-7 < std::i32::MIN;
+ //~^ ERROR this comparison involving
+ //~| HELP comparison is always false
let b = false;
- b >= true; //~ERROR this comparison involving
- false > b; //~ERROR this comparison involving
+ b >= true;
+ //~^ ERROR this comparison involving
+ //~| HELP using b == true instead
+ false > b;
+ //~^ ERROR this comparison involving
+ //~| HELP comparison is always false
u > 0; // ok
let c: i32 = unimplemented!();
let d: i32 = unimplemented!();
let e: i32 = unimplemented!();
- let _ = a == b && a != b; //~ ERROR this boolean expression contains a logic bug
+ let _ = a == b && a != b;
+ //~^ ERROR this boolean expression contains a logic bug
//~| HELP this expression can be optimized out
//~| HELP it would look like the following
//~| SUGGESTION let _ = false;
- let _ = a == b && c == 5 && a == b; //~ ERROR this boolean expression can be simplified
+ let _ = a == b && c == 5 && a == b;
+ //~^ ERROR this boolean expression can be simplified
//~| HELP try
//~| SUGGESTION let _ = a == b && c == 5;
- let _ = a == b && c == 5 && b == a; //~ ERROR this boolean expression can be simplified
+ //~| HELP try
+ //~| SUGGESTION let _ = !(c != 5 || a != b);
+ let _ = a == b && c == 5 && b == a;
+ //~^ ERROR this boolean expression can be simplified
//~| HELP try
//~| SUGGESTION let _ = a == b && c == 5;
//~| HELP try
//~| SUGGESTION let _ = !(c != 5 || a != b);
- let _ = a < b && a >= b; //~ ERROR this boolean expression contains a logic bug
+ let _ = a < b && a >= b;
+ //~^ ERROR this boolean expression contains a logic bug
//~| HELP this expression can be optimized out
//~| HELP it would look like the following
//~| SUGGESTION let _ = false;
- let _ = a > b && a <= b; //~ ERROR this boolean expression contains a logic bug
+ let _ = a > b && a <= b;
+ //~^ ERROR this boolean expression contains a logic bug
//~| HELP this expression can be optimized out
//~| HELP it would look like the following
//~| SUGGESTION let _ = false;
let _ = a > b && a == b;
- let _ = a != b || !(a != b || c == d); //~ ERROR this boolean expression can be simplified
+ let _ = a != b || !(a != b || c == d);
+ //~^ ERROR this boolean expression can be simplified
//~| HELP try
//~| SUGGESTION let _ = c != d || a != b;
//~| HELP try
fn main() {
let x = "hello";
let y = "world";
- if x == "hello" { //~ERROR this if statement can be collapsed
+ if x == "hello" {
+ //~^ ERROR this if statement can be collapsed
+ //~| HELP try
+ //~| SUGGESTION if x == "hello" && y == "world" {
if y == "world" {
println!("Hello world!");
}
}
- if x == "hello" || x == "world" { //~ERROR this if statement can be collapsed
+ if x == "hello" || x == "world" {
+ //~^ ERROR this if statement can be collapsed
+ //~| HELP try
+ //~| SUGGESTION if (x == "hello" || x == "world") && (y == "world" || y == "hello") {
if y == "world" || y == "hello" {
println!("Hello world!");
}
}
// testing that the empty range lint folds constants
- for i in 10..5+4 { //~ERROR this range is empty so this for loop will never run
+ for i in 10..5+4 {
+ //~^ ERROR this range is empty so this for loop will never run
+ //~| HELP if you are attempting to iterate over this range in reverse
+ //~| SUGGESTION for i in (5+4..10).rev() {
println!("{}", i);
}
- for i in (5+2)..(3-1) { //~ERROR this range is empty so this for loop will never run
+ for i in (5+2)..(3-1) {
+ //~^ ERROR this range is empty so this for loop will never run
+ //~| HELP if you are attempting to iterate over this range in reverse
+ //~| SUGGESTION for i in ((3-1)..(5+2)).rev() {
println!("{}", i);
}
fn match_bool() {
let test: bool = true;
- match test { //~ ERROR you seem to be trying to match on a boolean expression
+ match test {
+ //~^ ERROR you seem to be trying to match on a boolean expression
+ //~| HELP try
+ //~| SUGGESTION if test { 0 } else { 42 };
true => 0,
false => 42,
};
let option = 1;
- match option == 1 { //~ ERROR you seem to be trying to match on a boolean expression
+ match option == 1 {
+ //~^ ERROR you seem to be trying to match on a boolean expression
+ //~| HELP try
+ //~| SUGGESTION if option == 1 { 1 } else { 0 };
true => 1,
false => 0,
};
- match test { //~ ERROR you seem to be trying to match on a boolean expression
+ match test {
+ //~^ ERROR you seem to be trying to match on a boolean expression
+ //~| HELP try
+ //~^^ SUGGESTION if !test { println!("Noooo!"); };
true => (),
false => { println!("Noooo!"); }
};
- match test { //~ ERROR you seem to be trying to match on a boolean expression
+ match test {
+ //~^ ERROR you seem to be trying to match on a boolean expression
+ //~| HELP try
+ //~^^ SUGGESTION if !test { println!("Noooo!"); };
false => { println!("Noooo!"); }
_ => (),
};
- match test { //~ ERROR you seem to be trying to match on a boolean expression
+ match test {
+ //~^ ERROR you seem to be trying to match on a boolean expression
+ //~| HELP try
+ //~| SUGGESTION if test { println!("Yes!"); } else { println!("Noooo!"); };
false => { println!("Noooo!"); }
true => { println!("Yes!"); }
};
11 ... 50 => println!("0 ... 10"),
_ => (),
}
-
+
if let None = Some(42) {
// nothing
} else if let None = Some(42) {
let mut z = mut_ptr!(&mut 3u32);
//~^ NOTE in this expansion of mut_ptr!
- //~| NOTE in this expansion of mut_ptr!
}