summaryrefslogtreecommitdiffstats
path: root/src/test/ui/dyn-keyword/dyn-2015-idents-in-decl-macros-unlinted.rs
blob: bda2ed17ecfab458018ea611c51ec8626a80ce7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// 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();
}