| //@ run-pass |
| //@ aux-build:double.rs |
| //@ aux-build:external-crate-var.rs |
| |
| #![allow(unused)] |
| |
| #[macro_use] |
| extern crate double; |
| #[macro_use] |
| extern crate external_crate_var; |
| |
| struct Foo; |
| |
| trait Trait { |
| const CONST: u32; |
| type Assoc; |
| } |
| |
| impl Trait for Foo { |
| const CONST: u32 = 0; |
| type Assoc = Foo; |
| } |
| |
| macro_rules! local { () => { |
| // derive_Double outputs secondary copies of each definition |
| // to test what the proc_macro sees. |
| mod bar { |
| #[derive(Double)] |
| struct Bar($crate::Foo); |
| } |
| |
| mod qself { |
| #[derive(Double)] |
| struct QSelf(<::Foo as $crate::Trait>::Assoc); |
| } |
| |
| mod qself_recurse { |
| #[derive(Double)] |
| struct QSelfRecurse(<<$crate::Foo as $crate::Trait>::Assoc as $crate::Trait>::Assoc); |
| } |
| |
| mod qself_in_const { |
| #[derive(Double)] |
| #[repr(u32)] |
| enum QSelfInConst { |
| Variant = <::Foo as $crate::Trait>::CONST, |
| } |
| } |
| } } |
| |
| mod local { |
| local!(); |
| } |
| |
| // and now repeat the above tests, using a macro defined in another crate |
| |
| mod external { |
| external!{} |
| } |
| |
| fn main() {} |