// https://issues.dlang.org/show_bug.cgi?id=19482

alias AliasSeq(T...) = T;

extern (C++, "cppns")
@("asd", 123)
private
deprecated
immutable
static foreach (i; 0 .. 1)
{
    static assert(is(typeof(i) == int));
    static assert(__traits(getLinkage, i) == "D");
    static assert(__traits(isDeprecated, i) == false);
    static assert(__traits(getAttributes, i).length == 0);
    static assert(__traits(getCppNamespaces, i).length == 0);
    static assert(__traits(getVisibility, i) == "public");

    pragma(mangle, "x") // immutable(int) cannot be C++-mangled
    extern int x;
    static assert(is(typeof(x) == immutable int));
    static assert(__traits(getLinkage, x) == "C++");
    static assert(__traits(isDeprecated, x) == true);
    static assert(__traits(getAttributes, x) == AliasSeq!("asd", 123));
    static assert(__traits(getCppNamespaces, x) == AliasSeq!("cppns"));
    static assert(__traits(getVisibility, x) == "private");
}

struct S
{
    @disable static foreach (j; 0 .. 1)
    {
        int y;
        static assert(__traits(isDisabled, j) == false);
        static assert(__traits(isDisabled, S.y) == true);
    }
}

const
static foreach (i, v; ['a'])
{
    static assert(is(typeof(i) == size_t));
    static assert(is(typeof(v) == char));
}

const
static foreach (i, s, f; Range())
{
    static assert(is(typeof(i) == int));
    static assert(is(typeof(s) == string));
    static assert(is(typeof(f) == float));
}

struct Range
{
    int i;
    auto front()
    {
        return Tup!(int, string, float)(123, "asd", 3.14f);
    }
    bool empty() { return i > 0; }
    void popFront() { ++i; }
}

struct Tup(T...)
{
    T fields;
    alias fields this;
}
