Skip to content

Commit

Permalink
Lint items after statements in macro expansions
Browse files Browse the repository at this point in the history
The items_after_statements lint was skipping all expansions.  Instead
we should still lint local macros.

Fixes rust-lang#578
  • Loading branch information
achris committed Oct 15, 2020
1 parent 0cba5e6 commit 32e2021
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 5 deletions.
7 changes: 4 additions & 3 deletions clippy_lints/src/items_after_statements.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

use crate::utils::span_lint;
use rustc_ast::ast::{Block, ItemKind, StmtKind};
use rustc_lint::{EarlyContext, EarlyLintPass};
use rustc_lint::{EarlyContext, EarlyLintPass, LintContext};
use rustc_middle::lint::in_external_macro;
use rustc_session::{declare_lint_pass, declare_tool_lint};

declare_clippy_lint! {
Expand Down Expand Up @@ -53,7 +54,7 @@ declare_lint_pass!(ItemsAfterStatements => [ITEMS_AFTER_STATEMENTS]);

impl EarlyLintPass for ItemsAfterStatements {
fn check_block(&mut self, cx: &EarlyContext<'_>, item: &Block) {
if item.span.from_expansion() {
if in_external_macro(cx.sess(), item.span) {
return;
}

Expand All @@ -67,7 +68,7 @@ impl EarlyLintPass for ItemsAfterStatements {
// lint on all further items
for stmt in stmts {
if let StmtKind::Item(ref it) = *stmt {
if it.span.from_expansion() {
if in_external_macro(cx.sess(), it.span) {
return;
}
if let ItemKind::MacroDef(..) = it.kind {
Expand Down
5 changes: 4 additions & 1 deletion tests/ui/item_after_statement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,10 @@ fn mac() {
// do not lint this, because it needs to be after `a`
macro_rules! b {
() => {{
a = 6
a = 6;
fn say_something() {
println!("something");
}
}};
}
b!();
Expand Down
15 changes: 14 additions & 1 deletion tests/ui/item_after_statement.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,18 @@ LL | | println!("foo");
LL | | }
| |_____^

error: aborting due to 2 previous errors
error: adding items after statements is confusing, since items exist from the start of the scope
--> $DIR/item_after_statement.rs:32:13
|
LL | / fn say_something() {
LL | | println!("something");
LL | | }
| |_____________^
...
LL | b!();
| ----- in this macro invocation
|
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 3 previous errors

0 comments on commit 32e2021

Please sign in to comment.