Change:
Using nightly-2019-08-26. In we upgraded the compiler. Our tidbquery component tripped the redundantsemicolon lint (and seemingly in turn clippy::noeffect) but rustc/clippy did not tell us the line number. I couldn't find the code that triggered the lint and had to just allow both for the whole crate. <!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --This issue has been assigned to via . <!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOT_END --
It can be reproduced by cloning that PR, removing the commit that adds the s, and running .
Introduced in It has caused similar effects in other cases like CC
cc
Check-in from compiler team: Marking as P-high " as this is a regression, though admittedly one without particularly serious consequences (the lint can always be allowed). or perhaps one of you can take a stab at this? Please if you do start working on it (even if it's just to write mentoring instructions).
Also, it'd be great to get a minimized version of the problem. Therefore, marking as E-needs-mvce.
I'll work on this. Looking into it a bit, I think it has to do with the lint's interaction with custom proc macro attributes. Specifically, when the item passed to the attribute contains a redundant semicolon, every span in the is the dummy span. This occurs in both this issue and . It's definitely due to the changes to the parser, but I'm not sure why the changes would have that effect on the spans. claim
just in case you didn't see, the attempt to fix this with your PR failed the rollup, see

Discussion:
} } ast::StmtKind::Semi(ref expr) => { <del> self.space_if_not_bol(); self.print_expr_outer_attr_style(expr, false); self.s.word(";"); </del> <ins> match expr.kind { // Filter out empty `Tup` exprs created for the `redundant_semicolon` // lint, as they shouldn't be visible and interact poorly // with proc macros. ast::ExprKind::Tup(ref exprs) if exprs.is_empty() && expr.attrs.is_empty() => (), _ => { self.space_if_not_bol(); self.print_expr_outer_attr_style(expr, false); self.s.word(";"); } } </ins> } ast::StmtKind::Mac(ref mac) => { let (ref mac, style, ref attrs) = **mac;

<ins> // force-host // no-prefer-dynamic #![crate_type="proc-macro"] #![crate_name="redundant_semi_proc_macro"] extern crate proc_macro; use proc_macro::TokenStream; #[proc_macro_attribute] pub fn should_preserve_spans(_attr: TokenStream, item: TokenStream) -> TokenStream { eprintln!("{:?}", item); item } </ins>

<ins> // aux-build:redundant-semi-proc-macro-def.rs #![deny(redundant_semicolon)] extern crate redundant_semi_proc_macro; use redundant_semi_proc_macro::should_preserve_spans; #[should_preserve_spans] fn span_preservation()  { let tst = 123;; //~ ERROR unnecessary trailing semicolon match tst { // Redundant semicolons are parsed as empty tuple exprs // for the lint, so ensure the lint doesn't affect // empty tuple exprs explicitly in source. 123 => (), _ => () };;; //~ ERROR unnecessary trailing semicolons } fn main() {} </ins>

<ins> TokenStream [Ident { ident: "fn", span: #0 bytes(197..199) }, Ident { ident: "span_preservation", span: #0 bytes(200..217) }, Group { delimiter: Parenthesis, stream: TokenStream [], span: #0 bytes(217..219) }, Group { delimiter: Brace, stream: TokenStream [Ident { ident: "let", span: #0 bytes(227..230) }, Ident { ident: "tst", span: #0 bytes(231..234) }, Punct { ch: '=', spacing: Alone, span: #0 bytes(235..236) }, Literal { lit: Lit { kind: Integer, symbol: 123, suffix: None }, span: Span { lo: BytePos(237), hi: BytePos(240), ctxt: #0 } }, Punct { ch: ';', spacing: Joint, span: #0 bytes(240..241) }, Punct { ch: ';', spacing: Alone, span: #0 bytes(241..242) }, Ident { ident: "match", span: #0 bytes(288..293) }, Ident { ident: "tst", span: #0 bytes(294..297) }, Group { delimiter: Brace, stream: TokenStream [Literal { lit: Lit { kind: Integer, symbol: 123, suffix: None }, span: Span { lo: BytePos(482), hi: BytePos(485), ctxt: #0 } }, Punct { ch: '=', spacing: Joint, span: #0 bytes(486..488) }, Punct { ch: '>', spacing: Alone, span: #0 bytes(486..488) }, Group { delimiter: Parenthesis, stream: TokenStream [], span: #0 bytes(489..491) }, Punct { ch: ',', spacing: Alone, span: #0 bytes(491..492) }, Ident { ident: "_", span: #0 bytes(501..502) }, Punct { ch: '=', spacing: Joint, span: #0 bytes(503..505) }, Punct { ch: '>', spacing: Alone, span: #0 bytes(503..505) }, Group { delimiter: Parenthesis, stream: TokenStream [], span: #0 bytes(506..508) }], span: #0 bytes(298..514) }, Punct { ch: ';', spacing: Joint, span: #0 bytes(514..515) }, Punct { ch: ';', spacing: Joint, span: #0 bytes(515..516) }, Punct { ch: ';', spacing: Alone, span: #0 bytes(516..517) }], span: #0 bytes(221..561) }] error: unnecessary trailing semicolon --> $DIR/redundant-semi-proc-macro.rs:9:19 | LL |     let tst = 123;; |                   ^ help: remove this semicolon | note: lint level defined here --> $DIR/redundant-semi-proc-macro.rs:3:9 | LL | #![deny(redundant_semicolon)] |         ^^^^^^^^^^^^^^^^^^^ error: unnecessary trailing semicolons --> $DIR/redundant-semi-proc-macro.rs:16:7 | LL |     };;; |       ^^ help: remove these semicolons error: aborting due to 2 previous errors </ins>