// 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.
//
//@ check-pass
//@ edition:2015

#![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_rules! defn_has_dyn_idents {
    () => { ::outer_mod::dyn::dyn }
}

struct X;
trait Trait { fn hello(&self) { }}
impl Trait for X { }

macro_rules! tt_trait {
    ($arg:tt) => { & $arg Trait }
}

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