diff --git a/src/block_in_if_condition.rs b/src/block_in_if_condition.rs index 03265635b..ce01f591c 100644 --- a/src/block_in_if_condition.rs +++ b/src/block_in_if_condition.rs @@ -79,13 +79,18 @@ impl LateLintPass for BlockInIfCondition { if let Some(ref ex) = block.expr { // don't dig into the expression here, just suggest that they remove // the block - + if differing_macro_contexts(expr.span, ex.span) { + return; + } span_help_and_lint(cx, BLOCK_IN_IF_CONDITION_EXPR, check.span, BRACED_EXPR_MESSAGE, &format!("try\nif {} {} ... ", snippet_block(cx, ex.span, ".."), snippet_block(cx, then.span, ".."))); } } else { + if differing_macro_contexts(expr.span, block.stmts[0].span) { + return; + } // move block higher span_help_and_lint(cx, BLOCK_IN_IF_CONDITION_STMT, check.span, COMPLEX_BLOCK_MESSAGE, diff --git a/src/utils.rs b/src/utils.rs index 7c0ee09b3..90e8e27b4 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -74,6 +74,10 @@ macro_rules! if_let_chain { }; } +/// Returns true if the two spans come from differing expansions (i.e. one is from a macro and one isn't) +pub fn differing_macro_contexts(sp1: Span, sp2: Span) -> bool { + sp1.expn_id != sp2.expn_id +} /// returns true if this expn_info was expanded by any macro pub fn in_macro(cx: &T, span: Span) -> bool { cx.sess().codemap().with_expn_info(span.expn_id, diff --git a/tests/compile-fail/block_in_if_condition.rs b/tests/compile-fail/block_in_if_condition.rs index cd95fbd20..0a68d80c3 100644 --- a/tests/compile-fail/block_in_if_condition.rs +++ b/tests/compile-fail/block_in_if_condition.rs @@ -5,6 +5,15 @@ #![deny(block_in_if_condition_stmt)] #![allow(unused)] + +macro_rules! blocky { + () => {{true}} +} + +fn macro_if() { + if blocky!() { + } +} fn condition_has_block() -> i32 { if { //~ERROR in an 'if' condition, avoid complex blocks or closures with blocks; instead, move the block or closure higher and bind it with a 'let'