// Under the 2015 edition with the keyword_idents lint, `dyn` is // not entirely acceptable as an identifier. // // We currently do not attempt to detect or fix uses of `dyn` as an // identifier under a macro, including under the declarative `macro` // forms from macros 1.2 and macros 2.0. // // check-pass // edition:2015 #![feature(decl_macro)] #![allow(non_camel_case_types)] #![deny(keyword_idents)] mod outer_mod { pub mod r#dyn { pub struct r#dyn; } } // Here we are illustrating that the current lint does not flag the // occurrences of `dyn` in this macro definition; however, it // certainly *could* (and it would be nice if it did), since these // occurrences are not compatible with the 2018 edition's // interpretation of `dyn` as a keyword. macro defn_has_dyn_idents() { ::outer_mod::dyn::dyn } struct X; trait Trait { fn hello(&self) { }} impl Trait for X { } macro tt_trait($arg:tt) { & $arg Trait } macro id_trait($id:ident) { & $id Trait } fn main() { defn_has_dyn_idents!(); // Here we are illustrating that the current lint does not flag // the occurrences of `dyn` in these macro invocations. It // definitely should *not* flag the one in `tt_trait`, since that // is expanding in a valid fashion to `&dyn Trait`. // // It is arguable whether it would be valid to flag the occurrence // in `id_trait`, since that macro specifies that it takes an // `ident` as its input. fn f_tt(x: &X) -> tt_trait!(dyn) { x } fn f_id(x: &X) -> id_trait!(dyn) { x } let x = X; f_tt(&x).hello(); f_id(&x).hello(); }