// check-pass // edition:2018 #![feature(stmt_expr_attributes)] #![warn(semicolon_in_expressions_from_macros)] #[allow(dead_code)] macro_rules! foo { ($val:ident) => { true; //~ WARN trailing semicolon in macro //~| WARN this was previously accepted //~| WARN trailing semicolon in macro //~| WARN this was previously accepted //~| WARN trailing semicolon in macro //~| WARN this was previously accepted } } #[allow(semicolon_in_expressions_from_macros)] async fn bar() { foo!(first); } fn main() { #[allow(semicolon_in_expressions_from_macros)] let _ = { foo!(first) }; #[allow(semicolon_in_expressions_from_macros)] let _ = foo!(second); #[allow(semicolon_in_expressions_from_macros)] fn inner() { let _ = foo!(third); } #[allow(semicolon_in_expressions_from_macros)] async { let _ = foo!(fourth); }; let _ = { foo!(warn_in_block) }; let _ = foo!(warn_in_expr); // This `#[allow]` does not work, since the attribute gets dropped // when we expand the macro let _ = #[allow(semicolon_in_expressions_from_macros)] foo!(allow_does_not_work); }