diff --git a/clippy_lints/src/try_err.rs b/clippy_lints/src/try_err.rs index 7466221fb11e..7eba331ae0f3 100644 --- a/clippy_lints/src/try_err.rs +++ b/clippy_lints/src/try_err.rs @@ -1,4 +1,4 @@ -use crate::utils::{match_qpath, paths, snippet, span_lint_and_sugg}; +use crate::utils::{in_macro_or_desugar, match_qpath, paths, snippet, snippet_with_macro_callsite, span_lint_and_sugg}; use if_chain::if_chain; use rustc::hir::*; use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass}; @@ -67,10 +67,15 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for TryErr { then { let err_type = cx.tables.expr_ty(err_arg); - let suggestion = if err_type == return_type { - format!("return Err({})", snippet(cx, err_arg.span, "_")) + let origin_snippet = if in_macro_or_desugar(err_arg.span) { + snippet_with_macro_callsite(cx, err_arg.span, "_") } else { - format!("return Err({}.into())", snippet(cx, err_arg.span, "_")) + snippet(cx, err_arg.span, "_") + }; + let suggestion = if err_type == return_type { + format!("return Err({})", origin_snippet) + } else { + format!("return Err({}.into())", origin_snippet) }; span_lint_and_sugg( diff --git a/tests/ui/try_err.fixed b/tests/ui/try_err.fixed index 117300e84a40..a2087316e376 100644 --- a/tests/ui/try_err.fixed +++ b/tests/ui/try_err.fixed @@ -78,3 +78,22 @@ fn main() { closure_matches_test().unwrap(); closure_into_test().unwrap(); } + +macro_rules! bar { + () => { + String::from("aasdfasdfasdfa") + }; +} + +macro_rules! foo { + () => { + bar!() + }; +} + +pub fn macro_inside(fail: bool) -> Result { + if fail { + return Err(foo!()); + } + Ok(0) +} diff --git a/tests/ui/try_err.rs b/tests/ui/try_err.rs index 828cf639a1b3..5ef1b615dc70 100644 --- a/tests/ui/try_err.rs +++ b/tests/ui/try_err.rs @@ -78,3 +78,22 @@ fn main() { closure_matches_test().unwrap(); closure_into_test().unwrap(); } + +macro_rules! bar { + () => { + String::from("aasdfasdfasdfa") + }; +} + +macro_rules! foo { + () => { + bar!() + }; +} + +pub fn macro_inside(fail: bool) -> Result { + if fail { + Err(foo!())?; + } + Ok(0) +} diff --git a/tests/ui/try_err.stderr b/tests/ui/try_err.stderr index dbe05ce51788..b915d6b601d1 100644 --- a/tests/ui/try_err.stderr +++ b/tests/ui/try_err.stderr @@ -28,5 +28,11 @@ error: returning an `Err(_)` with the `?` operator LL | Err(err)?; | ^^^^^^^^^ help: try this: `return Err(err.into())` -error: aborting due to 4 previous errors +error: returning an `Err(_)` with the `?` operator + --> $DIR/try_err.rs:96:9 + | +LL | Err(foo!())?; + | ^^^^^^^^^^^^ help: try this: `return Err(foo!())` + +error: aborting due to 5 previous errors