Don't emit try_err lint in external macros
This commit is contained in:
parent
850dfdae60
commit
52f52900a4
5 changed files with 37 additions and 7 deletions
|
@ -1,7 +1,7 @@
|
||||||
use crate::utils::{match_qpath, paths, snippet, snippet_with_macro_callsite, span_lint_and_sugg};
|
use crate::utils::{match_qpath, paths, snippet, snippet_with_macro_callsite, span_lint_and_sugg};
|
||||||
use if_chain::if_chain;
|
use if_chain::if_chain;
|
||||||
use rustc::hir::*;
|
use rustc::hir::*;
|
||||||
use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass};
|
use rustc::lint::{in_external_macro, LateContext, LateLintPass, LintArray, LintPass};
|
||||||
use rustc::ty::Ty;
|
use rustc::ty::Ty;
|
||||||
use rustc::{declare_lint_pass, declare_tool_lint};
|
use rustc::{declare_lint_pass, declare_tool_lint};
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
|
@ -54,6 +54,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TryErr {
|
||||||
// val,
|
// val,
|
||||||
// };
|
// };
|
||||||
if_chain! {
|
if_chain! {
|
||||||
|
if !in_external_macro(cx.tcx.sess, expr.span);
|
||||||
if let ExprKind::Match(ref match_arg, _, MatchSource::TryDesugar) = expr.kind;
|
if let ExprKind::Match(ref match_arg, _, MatchSource::TryDesugar) = expr.kind;
|
||||||
if let ExprKind::Call(ref match_fun, ref try_args) = match_arg.kind;
|
if let ExprKind::Call(ref match_fun, ref try_args) = match_arg.kind;
|
||||||
if let ExprKind::Path(ref match_fun_path) = match_fun.kind;
|
if let ExprKind::Path(ref match_fun_path) = match_fun.kind;
|
||||||
|
|
|
@ -16,3 +16,18 @@ macro_rules! must_use_unit {
|
||||||
fn foo() {}
|
fn foo() {}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! try_err {
|
||||||
|
() => {
|
||||||
|
pub fn try_err_fn() -> Result<i32, i32> {
|
||||||
|
let err: i32 = 1;
|
||||||
|
// To avoid warnings during rustfix
|
||||||
|
if true {
|
||||||
|
Err(err)?
|
||||||
|
} else {
|
||||||
|
Ok(2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
// run-rustfix
|
// run-rustfix
|
||||||
|
// aux-build:macro_rules.rs
|
||||||
|
|
||||||
#![deny(clippy::try_err)]
|
#![deny(clippy::try_err)]
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate macro_rules;
|
||||||
|
|
||||||
// Tests that a simple case works
|
// Tests that a simple case works
|
||||||
// Should flag `Err(err)?`
|
// Should flag `Err(err)?`
|
||||||
pub fn basic_test() -> Result<i32, i32> {
|
pub fn basic_test() -> Result<i32, i32> {
|
||||||
|
@ -77,6 +81,9 @@ fn main() {
|
||||||
negative_test().unwrap();
|
negative_test().unwrap();
|
||||||
closure_matches_test().unwrap();
|
closure_matches_test().unwrap();
|
||||||
closure_into_test().unwrap();
|
closure_into_test().unwrap();
|
||||||
|
|
||||||
|
// We don't want to lint in external macros
|
||||||
|
try_err!();
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! bar {
|
macro_rules! bar {
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
// run-rustfix
|
// run-rustfix
|
||||||
|
// aux-build:macro_rules.rs
|
||||||
|
|
||||||
#![deny(clippy::try_err)]
|
#![deny(clippy::try_err)]
|
||||||
|
|
||||||
|
#[macro_use]
|
||||||
|
extern crate macro_rules;
|
||||||
|
|
||||||
// Tests that a simple case works
|
// Tests that a simple case works
|
||||||
// Should flag `Err(err)?`
|
// Should flag `Err(err)?`
|
||||||
pub fn basic_test() -> Result<i32, i32> {
|
pub fn basic_test() -> Result<i32, i32> {
|
||||||
|
@ -77,6 +81,9 @@ fn main() {
|
||||||
negative_test().unwrap();
|
negative_test().unwrap();
|
||||||
closure_matches_test().unwrap();
|
closure_matches_test().unwrap();
|
||||||
closure_into_test().unwrap();
|
closure_into_test().unwrap();
|
||||||
|
|
||||||
|
// We don't want to lint in external macros
|
||||||
|
try_err!();
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! bar {
|
macro_rules! bar {
|
||||||
|
|
|
@ -1,35 +1,35 @@
|
||||||
error: returning an `Err(_)` with the `?` operator
|
error: returning an `Err(_)` with the `?` operator
|
||||||
--> $DIR/try_err.rs:11:9
|
--> $DIR/try_err.rs:15:9
|
||||||
|
|
|
|
||||||
LL | Err(err)?;
|
LL | Err(err)?;
|
||||||
| ^^^^^^^^^ help: try this: `return Err(err)`
|
| ^^^^^^^^^ help: try this: `return Err(err)`
|
||||||
|
|
|
|
||||||
note: lint level defined here
|
note: lint level defined here
|
||||||
--> $DIR/try_err.rs:3:9
|
--> $DIR/try_err.rs:4:9
|
||||||
|
|
|
|
||||||
LL | #![deny(clippy::try_err)]
|
LL | #![deny(clippy::try_err)]
|
||||||
| ^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: returning an `Err(_)` with the `?` operator
|
error: returning an `Err(_)` with the `?` operator
|
||||||
--> $DIR/try_err.rs:21:9
|
--> $DIR/try_err.rs:25:9
|
||||||
|
|
|
|
||||||
LL | Err(err)?;
|
LL | Err(err)?;
|
||||||
| ^^^^^^^^^ help: try this: `return Err(err.into())`
|
| ^^^^^^^^^ help: try this: `return Err(err.into())`
|
||||||
|
|
||||||
error: returning an `Err(_)` with the `?` operator
|
error: returning an `Err(_)` with the `?` operator
|
||||||
--> $DIR/try_err.rs:41:17
|
--> $DIR/try_err.rs:45:17
|
||||||
|
|
|
|
||||||
LL | Err(err)?;
|
LL | Err(err)?;
|
||||||
| ^^^^^^^^^ help: try this: `return Err(err)`
|
| ^^^^^^^^^ help: try this: `return Err(err)`
|
||||||
|
|
||||||
error: returning an `Err(_)` with the `?` operator
|
error: returning an `Err(_)` with the `?` operator
|
||||||
--> $DIR/try_err.rs:60:17
|
--> $DIR/try_err.rs:64:17
|
||||||
|
|
|
|
||||||
LL | Err(err)?;
|
LL | Err(err)?;
|
||||||
| ^^^^^^^^^ help: try this: `return Err(err.into())`
|
| ^^^^^^^^^ help: try this: `return Err(err.into())`
|
||||||
|
|
||||||
error: returning an `Err(_)` with the `?` operator
|
error: returning an `Err(_)` with the `?` operator
|
||||||
--> $DIR/try_err.rs:96:9
|
--> $DIR/try_err.rs:103:9
|
||||||
|
|
|
|
||||||
LL | Err(foo!())?;
|
LL | Err(foo!())?;
|
||||||
| ^^^^^^^^^^^^ help: try this: `return Err(foo!())`
|
| ^^^^^^^^^^^^ help: try this: `return Err(foo!())`
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue