Merge pull request #2991 from mikerite/issue2979

Fix #2979
This commit is contained in:
Philipp Hansch 2018-08-05 20:35:55 +01:00 committed by GitHub
commit a016d4efe0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 28 deletions

View file

@ -1047,10 +1047,21 @@ fn lint_expect_fun_call(cx: &LateContext<'_, '_>, expr: &hir::Expr, method_span:
return; return;
} }
// don't lint for constant values fn is_call(node: &hir::ExprKind) -> bool {
let owner_def = cx.tcx.hir.get_parent_did(arg.id); match node {
let promotable = cx.tcx.rvalue_promotable_map(owner_def).contains(&arg.hir_id.local_id); hir::ExprKind::AddrOf(_, expr) => {
if promotable { is_call(&expr.node)
},
hir::ExprKind::Call(..)
| hir::ExprKind::MethodCall(..)
// These variants are debatable or require further examination
| hir::ExprKind::If(..)
| hir::ExprKind::Match(..) => true,
_ => false,
}
}
if !is_call(&arg.node) {
return; return;
} }

View file

@ -389,6 +389,10 @@ fn expect_fun_call() {
let with_dummy_type_and_as_str = Foo::new(); let with_dummy_type_and_as_str = Foo::new();
with_dummy_type_and_as_str.expect(format!("Error {}: fake error", error_code).as_str()); with_dummy_type_and_as_str.expect(format!("Error {}: fake error", error_code).as_str());
//Issue #2979 - this should not lint
let msg = "bar";
Some("foo").expect(msg);
} }
/// Checks implementation of `ITER_NTH` lint /// Checks implementation of `ITER_NTH` lint

View file

@ -358,79 +358,79 @@ error: use of `expect` followed by a function call
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| panic!(format!("Error {}: fake error", error_code).as_str()))` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `unwrap_or_else(|_| panic!(format!("Error {}: fake error", error_code).as_str()))`
error: called `.iter().nth()` on a Vec. Calling `.get()` is both faster and more readable error: called `.iter().nth()` on a Vec. Calling `.get()` is both faster and more readable
--> $DIR/methods.rs:402:23 --> $DIR/methods.rs:406:23
| |
402 | let bad_vec = some_vec.iter().nth(3); 406 | let bad_vec = some_vec.iter().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^
| |
= note: `-D iter-nth` implied by `-D warnings` = note: `-D iter-nth` implied by `-D warnings`
error: called `.iter().nth()` on a slice. Calling `.get()` is both faster and more readable error: called `.iter().nth()` on a slice. Calling `.get()` is both faster and more readable
--> $DIR/methods.rs:403:26 --> $DIR/methods.rs:407:26
| |
403 | let bad_slice = &some_vec[..].iter().nth(3); 407 | let bad_slice = &some_vec[..].iter().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `.iter().nth()` on a slice. Calling `.get()` is both faster and more readable error: called `.iter().nth()` on a slice. Calling `.get()` is both faster and more readable
--> $DIR/methods.rs:404:31 --> $DIR/methods.rs:408:31
| |
404 | let bad_boxed_slice = boxed_slice.iter().nth(3); 408 | let bad_boxed_slice = boxed_slice.iter().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `.iter().nth()` on a VecDeque. Calling `.get()` is both faster and more readable error: called `.iter().nth()` on a VecDeque. Calling `.get()` is both faster and more readable
--> $DIR/methods.rs:405:29 --> $DIR/methods.rs:409:29
| |
405 | let bad_vec_deque = some_vec_deque.iter().nth(3); 409 | let bad_vec_deque = some_vec_deque.iter().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `.iter_mut().nth()` on a Vec. Calling `.get_mut()` is both faster and more readable error: called `.iter_mut().nth()` on a Vec. Calling `.get_mut()` is both faster and more readable
--> $DIR/methods.rs:410:23 --> $DIR/methods.rs:414:23
| |
410 | let bad_vec = some_vec.iter_mut().nth(3); 414 | let bad_vec = some_vec.iter_mut().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `.iter_mut().nth()` on a slice. Calling `.get_mut()` is both faster and more readable error: called `.iter_mut().nth()` on a slice. Calling `.get_mut()` is both faster and more readable
--> $DIR/methods.rs:413:26 --> $DIR/methods.rs:417:26
| |
413 | let bad_slice = &some_vec[..].iter_mut().nth(3); 417 | let bad_slice = &some_vec[..].iter_mut().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `.iter_mut().nth()` on a VecDeque. Calling `.get_mut()` is both faster and more readable error: called `.iter_mut().nth()` on a VecDeque. Calling `.get_mut()` is both faster and more readable
--> $DIR/methods.rs:416:29 --> $DIR/methods.rs:420:29
| |
416 | let bad_vec_deque = some_vec_deque.iter_mut().nth(3); 420 | let bad_vec_deque = some_vec_deque.iter_mut().nth(3);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)` error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)`
--> $DIR/methods.rs:428:13 --> $DIR/methods.rs:432:13
| |
428 | let _ = some_vec.iter().skip(42).next(); 432 | let _ = some_vec.iter().skip(42).next();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
= note: `-D iter-skip-next` implied by `-D warnings` = note: `-D iter-skip-next` implied by `-D warnings`
error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)` error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)`
--> $DIR/methods.rs:429:13 --> $DIR/methods.rs:433:13
| |
429 | let _ = some_vec.iter().cycle().skip(42).next(); 433 | let _ = some_vec.iter().cycle().skip(42).next();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)` error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)`
--> $DIR/methods.rs:430:13 --> $DIR/methods.rs:434:13
| |
430 | let _ = (1..10).skip(10).next(); 434 | let _ = (1..10).skip(10).next();
| ^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^
error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)` error: called `skip(x).next()` on an iterator. This is more succinctly expressed by calling `nth(x)`
--> $DIR/methods.rs:431:14 --> $DIR/methods.rs:435:14
| |
431 | let _ = &some_vec[..].iter().skip(3).next(); 435 | let _ = &some_vec[..].iter().skip(3).next();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: used unwrap() on an Option value. If you don't want to handle the None case gracefully, consider using expect() to provide a better panic message error: used unwrap() on an Option value. If you don't want to handle the None case gracefully, consider using expect() to provide a better panic message
--> $DIR/methods.rs:440:13 --> $DIR/methods.rs:444:13
| |
440 | let _ = opt.unwrap(); 444 | let _ = opt.unwrap();
| ^^^^^^^^^^^^ | ^^^^^^^^^^^^
| |
= note: `-D option-unwrap-used` implied by `-D warnings` = note: `-D option-unwrap-used` implied by `-D warnings`