| // 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(); |
| } |