// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

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