diff --git a/clippy_lints/src/returns.rs b/clippy_lints/src/returns.rs index 334e7142cff..b19d7b9b4c1 100644 --- a/clippy_lints/src/returns.rs +++ b/clippy_lints/src/returns.rs @@ -58,14 +58,6 @@ impl ReturnPass { // Check a the final expression in a block if it's a return. fn check_final_expr(&mut self, cx: &EarlyContext, expr: &ast::Expr, span: Option) { - fn attr_is_cfg(attr: &ast::Attribute) -> bool { - if let ast::MetaItemKind::List(ref key, _) = attr.node.value.node { - *key == "cfg" - } else { - false - } - } - match expr.node { // simple return is always "bad" ast::ExprKind::Ret(Some(ref inner)) => { @@ -116,6 +108,7 @@ impl ReturnPass { let ast::StmtKind::Expr(ref retexpr) = retexpr.node, let Some(stmt) = it.next_back(), let ast::StmtKind::Local(ref local) = stmt.node, + !local.attrs.iter().any(attr_is_cfg), let Some(ref initexpr) = local.init, let ast::PatKind::Ident(_, Spanned { node: id, .. }, _) = local.pat.node, let ast::ExprKind::Path(_, ref path) = retexpr.node, @@ -151,3 +144,12 @@ impl EarlyLintPass for ReturnPass { self.check_let_return(cx, block); } } + +fn attr_is_cfg(attr: &ast::Attribute) -> bool { + if let ast::MetaItemKind::List(ref key, _) = attr.node.value.node { + *key == "cfg" + } else { + false + } +} + diff --git a/tests/run-pass/needless_return.rs b/tests/run-pass/needless_return.rs deleted file mode 100644 index 5a0225faee5..00000000000 --- a/tests/run-pass/needless_return.rs +++ /dev/null @@ -1,9 +0,0 @@ -#[deny(warnings)] -fn cfg_return() -> i32 { - #[cfg(msvc)] return 1; - #[cfg(not(msvc))] return 2; -} - -fn main() { - cfg_return(); -} diff --git a/tests/run-pass/returns.rs b/tests/run-pass/returns.rs new file mode 100644 index 00000000000..882d3aa7f32 --- /dev/null +++ b/tests/run-pass/returns.rs @@ -0,0 +1,19 @@ +#[deny(warnings)] +fn cfg_return() -> i32 { + #[cfg(unix)] return 1; + #[cfg(not(unix))] return 2; +} + +#[deny(warnings)] +fn cfg_let_and_return() -> i32 { + #[cfg(unix)] + let x = 1; + #[cfg(not(unix))] + let x = 2; + x +} + +fn main() { + cfg_return(); + cfg_let_and_return(); +}