Fix linting when trailing macro expands to a trailing semi
When a macro is used in the trailing expression position of a block
(e.g. `fn foo() { my_macro!() }`), we currently parse it as an
expression, rather than a statement. As a result, we ended up
using the `NodeId` of the containing statement as our `lint_node_id`,
even though we don't normally do this for macro calls.
If such a macro expands to an expression with a `#[cfg]` attribute,
then the trailing statement can get removed entirely. This lead to
an ICE, since we were usng the `NodeId` of the expression to emit
a lint.
Ths commit makes us skip updating `lint_node_id` when handling
a macro in trailing expression position. This will cause us to
lint at the closest parent of the macro call.
This commit is contained in:
parent
2c7bc5e33c
commit
bd4c9676c7
3 changed files with 43 additions and 6 deletions
16
src/test/ui/macros/lint-trailing-macro-call.rs
Normal file
16
src/test/ui/macros/lint-trailing-macro-call.rs
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
// check-pass
|
||||
//
|
||||
// Ensures that we properly lint
|
||||
// a removed 'expression' resulting from a macro
|
||||
// in trailing expression position
|
||||
|
||||
macro_rules! expand_it {
|
||||
() => {
|
||||
#[cfg(FALSE)] 25; //~ WARN trailing semicolon in macro
|
||||
//~| WARN this was previously
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
expand_it!()
|
||||
}
|
||||
18
src/test/ui/macros/lint-trailing-macro-call.stderr
Normal file
18
src/test/ui/macros/lint-trailing-macro-call.stderr
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
warning: trailing semicolon in macro used in expression position
|
||||
--> $DIR/lint-trailing-macro-call.rs:9:25
|
||||
|
|
||||
LL | #[cfg(FALSE)] 25;
|
||||
| ^
|
||||
...
|
||||
LL | expand_it!()
|
||||
| ------------ in this macro invocation
|
||||
|
|
||||
= note: `#[warn(semicolon_in_expressions_from_macros)]` on by default
|
||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
= note: for more information, see issue #79813 <https://github.com/rust-lang/rust/issues/79813>
|
||||
= note: macro invocations at the end of a block are treated as expressions
|
||||
= note: to ignore the value produced by the macro, add a semicolon after the invocation of `expand_it`
|
||||
= note: this warning originates in the macro `expand_it` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue