import std.stdio;

struct S
{
    int x;
    int y;
}

/********************************************/

void test1()
{
    S s = S(1,2);
    assert(s.x == 1);
    assert(s.y == 2);
}

/********************************************/

void foo2(S s)
{
    assert(s.x == 1);
    assert(s.y == 2);
}

void test2()
{
    foo2( S(1,2) );
}

/********************************************/

S foo3()
{
    return S(1, 2);
}

void test3()
{
    S s = foo3();
    assert(s.x == 1);
    assert(s.y == 2);
}

/********************************************/

struct S4
{
    long x;
    long y;
    long z;
}

S4 foo4()
{
    return S4(1, 2, 3);
}

void test4()
{
    S4 s = foo4();
    assert(s.x == 1);
    assert(s.y == 2);
    assert(s.z == 3);
}

/********************************************/

struct S5
{
    long x;
    char y;
    long z;
}

S5 foo5()
{
    return S5(1, 2, 3);
}

void test5()
{
    S5 s = foo5();
    assert(s.x == 1);
    assert(s.y == 2);
    assert(s.z == 3);
}

/********************************************/

struct S6
{
    long x;
    char y;
    long z;
}

void test6()
{
    S6 s1 = S6(1,2,3);
    S6 s2 = S6(1,2,3);
    assert(s1 == s2);

    s1 = S6(4,5,6);
    s2 = S6(4,5,6);
    assert(s1 == s2);

    S6* p1 = &s1;
    S6* p2 = &s2;
    *p1 = S6(7,8,9);
    *p2 = S6(7,8,9);
    assert(*p1 == *p2);
}

/********************************************/

struct S7
{
    long x;
    char y;
    long z;
}

void test7()
{
    static S7 s1 = S7(1,2,3);
    static S7 s2 = S7(1,2,3);
    assert(s1 == s2);
}

/********************************************/

struct S8
{
    int i;
    string s;
}

void test8()
{
    S8 s = S8(3, "hello");
    assert(s.i == 3);
    assert(s.s == "hello");

    static S8 t = S8(4, "betty");
    assert(t.i == 4);
    assert(t.s == "betty");

    S8 u = S8(3, ['h','e','l','l','o']);
    assert(u.i == 3);
    assert(u.s == "hello");

    static S8 v = S8(4, ['b','e','t','t','y']);
    assert(v.i == 4);
    assert(v.s == "betty");
}

/********************************************/

struct S9
{
    int i;
    char[5] s;
}

void test9()
{
    S9 s = S9(3, "hello");
    assert(s.i == 3);
    assert(s.s == "hello");

    static S9 t = S9(4, "betty");
    assert(t.i == 4);
    assert(t.s == "betty");

    S9 u = S9(3, ['h','e','l','l','o']);
    assert(u.i == 3);
    assert(u.s == "hello");

    static S9 v = S9(4, ['b','e','t','t','y']);
    assert(v.i == 4);
    assert(v.s == "betty");
}

/********************************************/

alias int myint10;

struct S10
{
    int i;
    union
    {
        int x = 2;
        int y;
    }
    int j = 3;
    myint10 k = 4;
}

void test10()
{
    S10 s = S10( 1 );
    assert(s.i == 1);
    assert(s.x == 2);
    assert(s.y == 2);
    assert(s.j == 3);
    assert(s.k == 4);

    static S10 t = S10( 1 );
    assert(t.i == 1);
    assert(t.x == 2);
    assert(t.y == 2);
    assert(t.j == 3);
    assert(t.k == 4);

    S10 u = S10( 1, 5 );
    assert(u.i == 1);
    assert(u.x == 5);
    assert(u.y == 5);
    assert(u.j == 3);
    assert(u.k == 4);

    static S10 v = S10( 1, 6 );
    assert(v.i == 1);
    assert(v.x == 6);
    assert(v.y == 6);
    assert(v.j == 3);
    assert(v.k == 4);
}

/********************************************/

struct S11
{
    int i;
    int j = 3;
}


void test11()
{
    static const s = S11( 1, 5 );
    static const i = s.i;
    assert(i == 1);
    static assert(s.j == 5);
}

/********************************************/

struct S12
{
    int[5] x;
    int[5] y = 3;
}

void test12()
{
    S12 s = S12();
    foreach (v; s.x)
        assert(v == 0);
    foreach (v; s.y)
        assert(v == 3);
}

/********************************************/

struct S13
{
    int[5] x;
    int[5] y;
    int[6][3] z;
}

void test13()
{
    S13 s = S13(0,3,4);
    foreach (v; s.x)
        assert(v == 0);
    foreach (v; s.y)
        assert(v == 3);
    for (int i = 0; i < 6; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            assert(s.z[j][i] == 4);
        }
    }
}

/********************************************/

struct S14a { int n; }
struct S14b { this(int n){} }

void foo14(ref S14a s) {}
void foo14(ref S14b s) {}
void hoo14()(ref S14a s) {}
void hoo14()(ref S14b s) {}
void poo14(S)(ref S s) {}

void bar14(S14a s) {}
void bar14(S14b s) {}
void var14()(S14a s) {}
void var14()(S14b s) {}
void war14(S)(S s) {}

int baz14(    S14a s) { return 1; }
int baz14(ref S14a s) { return 2; }
int baz14(    S14b s) { return 1; }
int baz14(ref S14b s) { return 2; }
int vaz14()(    S14a s) { return 1; }
int vaz14()(ref S14a s) { return 2; }
int vaz14()(    S14b s) { return 1; }
int vaz14()(ref S14b s) { return 2; }
int waz14(S)(    S s) { return 1; }
int waz14(S)(ref S s) { return 2; }

void test14()
{
    // can not bind rvalue-sl with ref
    static assert(!__traits(compiles, foo14(S14a(0))));
    static assert(!__traits(compiles, foo14(S14b(0))));
    static assert(!__traits(compiles, hoo14(S14a(0))));
    static assert(!__traits(compiles, hoo14(S14b(0))));
    static assert(!__traits(compiles, poo14(S14a(0))));
    static assert(!__traits(compiles, poo14(S14b(0))));

    // still can bind rvalue-sl with non-ref
    bar14(S14a(0));
    bar14(S14b(0));
    var14(S14a(0));
    var14(S14b(0));
    war14(S14a(0));
    war14(S14b(0));

    // preferred binding of rvalue-sl in overload resolution
    assert(baz14(S14a(0)) == 1);
    assert(baz14(S14b(0)) == 1);
    assert(vaz14(S14a(0)) == 1);
    assert(vaz14(S14b(0)) == 1);
    assert(waz14(S14a(0)) == 1);
    assert(waz14(S14b(0)) == 1);
}

/********************************************/

void check15(T, ubyte results, A...)(A args)
{
                         // m c i s sc
    enum m  = (results & 0b_1_0_0_0_0) != 0;
    enum c  = (results & 0b_0_1_0_0_0) != 0;
    enum i  = (results & 0b_0_0_1_0_0) != 0;
    enum s  = (results & 0b_0_0_0_1_0) != 0;
    enum sc = (results & 0b_0_0_0_0_1) != 0;

    // allocation on stack
    static assert((is(typeof(                  T(args) ) U) && is(U ==              T  )) == m);
    static assert((is(typeof(            const T(args) ) U) && is(U ==        const(T) )) == c);
    static assert((is(typeof(        immutable T(args) ) U) && is(U ==    immutable(T) )) == i);
    static assert((is(typeof(           shared T(args) ) U) && is(U ==       shared(T) )) == s);
    static assert((is(typeof(     shared const T(args) ) U) && is(U == shared(const T) )) == sc);

    // allocation on heap
    static assert((is(typeof( new              T(args) ) U) && is(U ==              T *)) == m);
    static assert((is(typeof( new        const T(args) ) U) && is(U ==        const(T)*)) == c);
    static assert((is(typeof( new    immutable T(args) ) U) && is(U ==    immutable(T)*)) == i);
    static assert((is(typeof( new       shared T(args) ) U) && is(U ==       shared(T)*)) == s);
    static assert((is(typeof( new shared const T(args) ) U) && is(U == shared(const T)*)) == sc);
}
void test15a()
{
    static struct Foo1 { this(int v) {}                int value; }
    static struct Boo1 { this(int v) const {}          int[] value; }
    static struct Bar1 { this(int[] v) {}              int[] value; }
    static struct Baz1 { this(const int[] v) pure {}   int[] value; }  // unique ctor
    static struct Coo1 { this(int[] v) immutable {}    int[] value; }
    static struct Car1 { this(int[] v) immutable {}    immutable(int)[] value; }
    check15!(Foo1, 0b_1_1_0_0_0)(1);
    check15!(Boo1, 0b_0_1_0_0_0)(1);
    check15!(Bar1, 0b_1_1_0_0_0)(null);
    check15!(Baz1, 0b_1_1_1_1_1)(null);
    check15!(Coo1, 0b_0_1_1_0_1)(null);
    check15!(Car1, 0b_0_1_1_0_1)(null);
                   // m c i s sc

    // Template constructor should work as same as non-template ones
    static struct Foo2 { this()(int v) {}              int value; }
    static struct Boo2 { this()(int v) const {}        int[] value; }
    static struct Bar2 { this()(int[] v) {}            int[] value; }  // has mutable indieection
    static struct Baz2 { this()(const int[] v) pure {} int[] value; }  // unique ctor
    static struct Coo2 { this()(int[] v) immutable {}  int[] value; }
    static struct Car2 { this()(int[] v) immutable {}  immutable(int)[] value; }
    check15!(Foo2, 0b_1_1_0_0_0)(1);
    check15!(Boo2, 0b_0_1_0_0_0)(1);
    check15!(Bar2, 0b_1_1_0_0_0)(null);
    check15!(Baz2, 0b_1_1_1_1_1)(null);
    check15!(Coo2, 0b_0_1_1_0_1)(null);
    check15!(Car2, 0b_0_1_1_0_1)(null);
                   // m c i s sc

    // Except Bar!().__ctor, their constructors are inferred to pure, then they become unique ctors.
    static struct Foo3() { this(int v) {}              int value; }
    static struct Boo3() { this(int v) const {}        int[] value; }
    static struct Bar3() { this(int[] v) {}            int[] value; }  // has mutable indieection
    static struct Baz3() { this(const int[] v) pure {} int[] value; }  // unique ctor
    static struct Coo3() { this(int[] v) immutable {}  int[] value; }
    static struct Car3() { this(int[] v) immutable {}  immutable(int)[] value; }
    check15!(Foo3!(), 0b_1_1_1_1_1)(1);
    check15!(Boo3!(), 0b_1_1_1_1_1)(1);
    check15!(Bar3!(), 0b_1_1_0_0_0)(null);
    check15!(Baz3!(), 0b_1_1_1_1_1)(null);
    check15!(Coo3!(), 0b_1_1_1_1_1)(null);
    check15!(Car3!(), 0b_1_1_1_1_1)(null);
                      // m c i s sc
}

// inout constructor works as like unique constructor in many cases
void test15b()
{
    static struct Nullable1
    {
        private int[] _value;
        private bool _isNull = true;
        this(inout int[] v) inout //pure
        {
            _value = v;
            //static int g; auto x = g; // impure access
            _isNull = false;
        }
    }
    static assert( __traits(compiles,           Nullable1([1,2,3])));
    static assert(!__traits(compiles,           Nullable1([1,2,3].idup)));
    static assert(!__traits(compiles, immutable Nullable1([1,2,3])));
    static assert( __traits(compiles, immutable Nullable1([1,2,3].idup)));
    static assert(!__traits(compiles,    shared Nullable1([1,2,3])));
    static assert(!__traits(compiles,    shared Nullable1([1,2,3].idup)));

    static struct Nullable2(T)
    {
        private T _value;
        private bool _isNull = true;
        this(inout T v) inout //pure
        {
            _value = v;
            //static int g; auto x = g; // impure access
            _isNull = false;
        }
    }
    static assert( __traits(compiles,           Nullable2!(int[])([1,2,3])));
    static assert(!__traits(compiles,           Nullable2!(int[])([1,2,3].idup)));
    static assert(!__traits(compiles, immutable Nullable2!(int[])([1,2,3])));
    static assert( __traits(compiles, immutable Nullable2!(int[])([1,2,3].idup)));
    static assert(!__traits(compiles,    shared Nullable2!(int[])([1,2,3])));
    static assert(!__traits(compiles,    shared Nullable2!(int[])([1,2,3].idup)));

    // ctor is inout pure, but cannot create unique object.
    struct S
    {
        int[] marr;
        const int[] carr;
        immutable int[] iarr;
        this(int[] m, const int[] c, immutable int[] i) inout pure
        {
            static assert(!__traits(compiles, marr = m));
            static assert(!__traits(compiles, carr = c));  // cannot implicitly convertible const(int[]) to inout(const(int[]))
            iarr = i;
        }
    }
    static assert(!__traits(compiles, { int[] ma; immutable int[] ia; auto m =           S(ma, ma, ia); }));
    static assert( __traits(compiles, { int[] ma; immutable int[] ia; auto c =     const S(ma, ma, ia); }));
    static assert(!__traits(compiles, { int[] ma; immutable int[] ia; auto i = immutable S(ma, ma, ia); }));
}

// TemplateThisParameter with constructor should work
void test15c()
{
    static class C
    {
        this(this This)()
        {
            static assert(is(This == immutable C));
        }

        this(T = void, this This)(int)
        {
            static assert(is(This == immutable C));
        }
    }
    auto c1 = new immutable C;
    auto c2 = new immutable C(1);
}

void test15d()  // Bugzilla 9974
{
    class CM { this() {} }
    auto cm = new CM();

    const class CC { this() {} }
    const cc = new const CC();

    immutable class CI { this() {} }
    immutable ci = new immutable CI();

    shared class CS { this() {} }
    shared cs = new shared CS();

    shared const class CSC { this() {} }
    shared const csc = new shared const CSC();


    struct SM { this(int) {} }
    auto sm = new SM(1);

    const struct SC { this(int) {} }
    const sc = new const SC(1);

    immutable struct SI { this(int) {} }
    immutable si = new immutable SI(1);

    shared struct SS { this(int) {} }
    shared ss = new shared SS(1);

    shared const struct SSC { this(int) {} }
    shared const ssc = new shared const SSC(1);
}

void test15e()  // Bugzilla 10005
{
    // struct literal
    static struct S
    {
        int[] a;
    }
    int[] marr = [1,2,3];
    static assert( __traits(compiles, {           S m =           S(marr); }));
    static assert( __traits(compiles, {     const S c =           S(marr); }));
    static assert(!__traits(compiles, { immutable S i =           S(marr); }));
    immutable int[] iarr = [1,2,3];
    static assert(!__traits(compiles, {           S m = immutable S(iarr); }));
    static assert( __traits(compiles, {     const S c = immutable S(iarr); }));
    static assert( __traits(compiles, { immutable S i = immutable S(iarr); }));

    // mutable constructor
    static struct MS
    {
        int[] a;
        this(int n) { a = new int[](n); }
    }
    static assert( __traits(compiles, {           MS m =           MS(3); }));
    static assert( __traits(compiles, {     const MS c =           MS(3); }));
    static assert(!__traits(compiles, { immutable MS i =           MS(3); }));
    static assert(!__traits(compiles, {           MS m = immutable MS(3); }));
    static assert(!__traits(compiles, {     const MS c = immutable MS(3); }));
    static assert(!__traits(compiles, { immutable MS i = immutable MS(3); }));

    // immutable constructor
    static struct IS
    {
        int[] a;
        this(int n) immutable { a = new int[](n); }
    }
    static assert(!__traits(compiles, {           IS m =           IS(3); }));
    static assert(!__traits(compiles, {     const IS c =           IS(3); }));
    static assert(!__traits(compiles, { immutable IS i =           IS(3); }));
    static assert(!__traits(compiles, {           IS m = immutable IS(3); }));
    static assert( __traits(compiles, {     const IS c = immutable IS(3); }));
    static assert( __traits(compiles, { immutable IS i = immutable IS(3); }));
}

struct Foo9984
{
    int[] p;
    // Prefix storage class and tempalte constructor
    inout this()(inout int[] a) { p = a; }
    auto foo() inout { return inout(Foo9984)(p); }
}

void test9993a()
{
    static class A
    {
        int x;
        this()           { x = 13; }
        this() immutable { x = 42; }
    }
              A ma = new           A;   assert(ma.x == 13);
    immutable A ia = new immutable A;   assert(ia.x == 42);
    static assert(!__traits(compiles, { immutable A ia = new A; }));

    static class B
    {
        int x;
        this()       { x = 13; }
        this() const { x = 42; }
    }
    const B mb = new       B;           assert(mb.x == 13);
    const B cb = new const B;           assert(cb.x == 42);
    static assert(!__traits(compiles, { immutable B ib = new B; }));

    static class C
    {
        int x;
        this() const     { x = 13; }
        this() immutable { x = 42; }
    }
        const C cc = new     const C;   assert(cc.x == 13);
    immutable C ic = new immutable C;   assert(ic.x == 42);
    static assert(!__traits(compiles, { C mc = new C; }));
}
void test9993b()
{
    static class A
    {
        int x;
        this()()           { x = 13; }
        this()() immutable { x = 42; }
    }
              A ma = new           A;   assert(ma.x == 13);
    immutable A ia = new immutable A;   assert(ia.x == 42);
    static assert(__traits(compiles, { immutable A ia = new A; }));

    static class B
    {
        int x;
        this()()       { x = 13; }
        this()() const { x = 42; }
    }
    const B mb = new       B;           assert(mb.x == 13);
    const B cb = new const B;           assert(cb.x == 42);
    static assert(__traits(compiles, { immutable B ib = new B; }));

    static class C
    {
        int x;
        this()() const     { x = 13; }
        this()() immutable { x = 42; }
    }
        const C cc = new     const C;   assert(cc.x == 13);
    immutable C ic = new immutable C;   assert(ic.x == 42);
    static assert(!__traits(compiles, { C mc = new C; }));
}

/********************************************/
// 1914

struct Bug1914a
{
    const char[10] i = [1,0,0,0,0,0,0,0,0,0];
    char[10] x = i;
    int y = 5;
}

struct Bug1914b
{
    const char[10] i = [0,0,0,0,0,0,0,0,0,0];
    char[10] x = i;
    int y = 5;
}

struct Bug1914c
{
    const char[2] i = ['a', 'b'];
    const char[2][3] j = [['x', 'y'], ['p', 'q'], ['r', 's']];
    const char[2][3] k = ["cd", "ef", "gh"];
    const char[2][3] l = [['x', 'y'], ['p'], ['h', 'k']];
    char[2][3] x = i;
    int y = 5;
    char[2][3] z = j;
    char[2][3] w = k;
    int v = 27;
    char[2][3] u = l;
    int t = 718;
}

struct T3198
{
    int g = 1;
}

class Foo3198
{
    int[5] x = 6;
    T3198[5] y = T3198(4);
}

void test3198and1914()
{
    Bug1914a a;
    assert(a.y == 5, "bug 1914, non-zero init");
    Bug1914b b;
    assert(b.y == 5, "bug 1914, zero init");
    Bug1914c c;
    assert(c.y == 5, "bug 1914, multilevel init");
    assert(c.v == 27, "bug 1914, multilevel init2");
    assert(c.x[2][1] == 'b');
    assert(c.t == 718, "bug 1914, multi3");
    assert(c.u[1][0] == 'p');
    assert(c.u[1][1] == char.init);
    auto f = new Foo3198();
    assert(f.x[0] == 6);
    assert(f.y[0].g == 4, "bug 3198");
}

/********************************************/
// 14996

enum E14996a : string { confirm = "confirm" }
enum E14996b : long[] { confirm = [1,2,3,4] }

struct S14996
{
    E14996a[1] data1;
    E14996b[1] data2;
}

/********************************************/
// 2427

void test2427()
{
    struct S
    {
        int x;
    }

    int foo(int i)
    {
        return i;
    }

    int i;
    S s = { foo(i) };
}

/********************************************/

struct T5885 {
    uint a, b;
}

double mulUintToDouble(T5885 t, double m) {
    return t.a * m;
}

void test5885()
{
    enum ae = mulUintToDouble(T5885(10, 0), 10.0);
    enum be = mulUintToDouble(T5885(10, 20), 10.0);
    static assert(ae == be);

    auto a = mulUintToDouble(T5885(10, 0), 10.0);
    auto b = mulUintToDouble(T5885(10, 20), 10.0);
    assert(a == b);
}

/********************************************/
// 5889

struct S5889a { int n; }
struct S5889b { this(int n){} }

bool isLvalue(S)(auto ref S s){ return __traits(isRef, s); }

int foo(ref S5889a s) { return 1; }
int foo(    S5889a s) { return 2; }
int foo(ref S5889b s) { return 1; }
int foo(    S5889b s) { return 2; }

int goo(ref const(S5889a) s) { return 1; }
int goo(    const(S5889a) s) { return 2; }
int goo(ref const(S5889b) s) { return 1; }
int goo(    const(S5889b) s) { return 2; }

int too(S)(ref S s) { return 1; }
int too(S)(    S s) { return 2; }

S makeRvalue(S)(){ S s; return s; }

void test5889()
{
    S5889a sa;
    S5889b sb;

    assert( isLvalue(sa));
    assert( isLvalue(sb));
    assert(!isLvalue(S5889a(0)));
    assert(!isLvalue(S5889b(0)));
    assert(!isLvalue(makeRvalue!S5889a()));
    assert(!isLvalue(makeRvalue!S5889b()));

    assert(foo(sa) == 1);
    assert(foo(sb) == 1);
    assert(foo(S5889a(0)) == 2);
    assert(foo(S5889b(0)) == 2);
    assert(foo(makeRvalue!S5889a()) == 2);
    assert(foo(makeRvalue!S5889b()) == 2);

    assert(goo(sa) == 1);
    assert(goo(sb) == 1);
    assert(goo(S5889a(0)) == 2);
    assert(goo(S5889b(0)) == 2);
    assert(goo(makeRvalue!S5889a()) == 2);
    assert(goo(makeRvalue!S5889b()) == 2);

    assert(too(sa) == 1);
    assert(too(sb) == 1);
    assert(too(S5889a(0)) == 2);
    assert(too(S5889b(0)) == 2);
    assert(too(makeRvalue!S5889a()) == 2);
    assert(too(makeRvalue!S5889b()) == 2);
}

/********************************************/
// 4147

struct S4247
{
    int n = 1024;
    this(int x) { n = x; }
}
void test4247()
{
    auto p1 = S4247();
    assert(p1.n == 1024);

    auto p2 = S4247(1);
    assert(p2.n == 1);
}

/********************************************/
// 6937

void test6937()
{
    static struct S
    {
        int x, y;
    }

    auto s1 = S(1, 2);
    auto ps1 = new S(1, 2);
    assert(ps1.x == 1);
    assert(ps1.y == 2);
    assert(*ps1 == s1);

    auto ps2 = new S(1);
    assert(ps2.x == 1);
    assert(ps2.y == 0);
    assert(*ps2 == S(1, 0));

    static assert(!__traits(compiles, new S(1,2,3)));

    int v = 0;
    struct NS
    {
        int x;
        void foo() { v = x; }
    }
    auto ns = NS(1);
    ns.foo();
    assert(ns.x == 1);
    assert(v == 1);
    auto pns = new NS(2);
    assert(pns.x == 2);
    pns.foo();
    assert(v == 2);
    pns.x = 1;
    assert(*pns == ns);

    static struct X {
        int v;
        this(this) { ++v; }
    }
    static struct Y {
        X x;
    }
    Y y = Y(X(1));
    assert(y.x.v == 1);
    auto py1 = new Y(X(1));
    assert(py1.x.v == 1);
    assert(*py1 == y);
    auto py2 = new Y(y.x);
    assert(py2.x.v == 2);
}

/********************************************/
// 12681

struct HasUnion12774
{
    union
    {
        int a, b;
    }
}

bool test12681()
{
    immutable int x = 42;

    static struct S1
    {
        immutable int *p;
    }
    immutable s1 = new S1(&x);
    assert(s1.p == &x);

    struct S2
    {
        immutable int *p;
        void foo() {}
    }
    auto s2 = new S2(&x);
    assert(s2.p == &x);

    struct S3
    {
        immutable int *p;
        int foo() { return x; }
    }
    auto s3 = new S3(&x);
    assert(s3.p == &x);
    assert(s3.foo() == 42);

    auto x12774 = new HasUnion12774();

    return true;
}
static assert(test12681());

/********************************************/
// 3991

union X3991
{
    int   a = void;
    dchar b = void;
}

union Y3991
{
    int   a = void;
    dchar b = 'a';
}

union Z3991
{
    int   a = 123;
    dchar b = void;
}

void test3991()
{
    X3991 x;

    Y3991 y;
    assert(y.b == 'a');

    Z3991 z;
    assert(z.a == 123);
}

/********************************************/
// 7727

union U7727A1 { int i;       double d;       }
union U7727A2 { int i = 123; double d;       }
//union U7727A3 { int i;       double d = 2.5; }

union U7727B1 { double d;       int i;       }
union U7727B2 { double d = 2.5; int i;       }
//union U7727B3 { double d;       int i = 123; }

void test7727()
{
    import core.stdc.math : isnan;

    { U7727A1 u;                assert(u.i == 0); }
    { U7727A1 u = { i: 1024 };  assert(u.i == 1024); }
    { U7727A1 u = { d: 1.225 }; assert(u.d == 1.225); }
  static assert(!__traits(compiles,
    { U7727A1 u = { i: 1024, d: 1.225 }; }
  ));

    { U7727A2 u;                assert(u.i == 123); }
    { U7727A2 u = { i: 1024 };  assert(u.i == 1024); }
    { U7727A2 u = { d: 1.225 }; assert(u.d == 1.225); }
  static assert(!__traits(compiles,
    { U7727A2 u = { i: 1024, d: 1.225 }; }
  ));

// Blocked by issue 1432
//    { U7727A3 u;                assert(u.d == 2.5); }
//    { U7727A3 u = { i: 1024 };  assert(u.i == 1024); }
//    { U7727A3 u = { d: 1.225 }; assert(u.d == 1.225); }
//  static assert(!__traits(compiles,
//    { U7727A3 u = { i: 1024, d: 1.225 }; }
//  ));

    { U7727B1 u;                assert(isnan(u.d)); }
    { U7727B1 u = { i: 1024 };  assert(u.i == 1024); }
    { U7727B1 u = { d: 1.225 }; assert(u.d == 1.225); }
  static assert(!__traits(compiles,
    { U7727B1 u = { i: 1024, d: 1.225 }; }
  ));

    { U7727B2 u;                assert(u.d == 2.5); }
    { U7727B2 u = { i: 1024 };  assert(u.i == 1024); }
    { U7727B2 u = { d: 1.225 }; assert(u.d == 1.225); }
  static assert(!__traits(compiles,
    { U7727B2 u = { i: 1024, d: 1.225 }; }
  ));

// Blocked by issue 1432
//    { U7727B3 u;                assert(u.i == 123); }
//    { U7727B3 u = { i: 1024 };  assert(u.i == 1024); }
//    { U7727B3 u = { d: 1.225 }; assert(u.d == 1.225); }
//  static assert(!__traits(compiles,
//    { U7727B3 u = { i: 1024, d: 1.225 }; }
//  ));


    test7727a();
    test7727b();
}

// --------

struct Foo7727a
{
    ushort bar2;
}
struct Foo7727b
{
    union
    {
        ubyte[2] bar1;
        ushort bar2;
    }
}

void test7727a()
{
    immutable Foo7727a foo1 = { bar2: 100 }; // OK
    immutable Foo7727b foo2 = { bar2: 100 }; // OK <-- error
}

// --------

struct S7727 { int i; double d; }
union U7727 { int i; double d; }

void test7727b()
{
    S7727 s = { d: 5 }; // OK
    U7727 u = { d: 5 }; // OK <-- Error: is not a static and cannot have static initializer
}

/********************************************/
// 7929

void test7929()
{
    static struct S
    {
        int [] numbers;
    }

    const int [] numbers = new int[2];
    const S si = {numbers};
    // Error: cannot implicitly convert expression (numbers) of type const(int[]) to int[]

    const S se = const(S)(numbers);
    // OK
}

/********************************************/
// 7021

struct S7021
{
    @disable this();
}

void test7021()
{
  static assert(!is(typeof({
    auto s = S7021();
  })));
}

/********************************************/
// 8738

void test8738()
{
    int[3] a = [1, 2, 3];

    struct S { int a, b, c; }
    S s = S(1, 2, 3);

    a = [4, a[0], 6];
    s = S(4, s.a, 6);

    assert(a == [4, 1, 6]);
    assert(s == S(4, 1, 6));
}

/********************************************/
// 8763

void test8763()
{
    struct S
    {
        this(int) {}
    }

    void foo(T, Args...)(Args args)
    {
        T t = T(args);
        // Error: constructor main.S.this (int) is not callable using argument types ()
    }

    S t = S(); // OK, initialize to S.init
    foo!S();
}

/********************************************/
// 8902

union U8902 { int a, b; }

enum U8902 u8902a = U8902.init; // No errors
U8902 u8902b;                   // No errors
U8902 u8902c = U8902.init;      // Error: duplicate union initialization for b

void test8902()
{
    U8902 u8902d = U8902.init;                  // No errors
    immutable U8902 u8902e = U8902.init;        // No errors
    immutable static U8902 u8902f = U8902.init; // Error: duplicate union...
    static U8902 u8902g = u8902e;               // Error: duplicate union...
    static U8902 u8902h = U8902.init;           // Error: duplicate union...
}

/********************************************/
// 9116

void test9116()
{
    static struct X
    {
        int v;
        this(this) { ++v; }
    }
    static struct Y
    {
        X x;
    }
    X x = X(1);
    assert(x.v == 1);
    Y y = Y(X(1));
    //printf("y.x.v = %d\n", y.x.v);  // print 2, but should 1
    assert(y.x.v == 1); // fails
}

/********************************************/
// 9293

void test9293()
{
    static struct A
    {
    //  enum A zero = A(); // This works as expected
        enum A zero = {};  // Note the difference here

        int opCmp(const ref A a) const
        {
            assert(0);
        }

        int opCmp(const A a) const
        {
            return 0;
        }
    }

    A a;
    auto b = a >= A.zero;  // Error: A() is not an lvalue
}

/********************************************/
// 9566

void test9566()
{
    static struct ExpandData
    {
        ubyte[4096] window = 0;
    }
    ExpandData a;
    auto b = ExpandData.init;   // bug
}

/********************************************/
// 9775

enum Month9775 : ubyte { jan = 1, }
struct Date9775
{
    this(int year, int month, int day) pure
    {
        _year  = cast(short)year;
        _month = cast(Month9775)month;
        _day   = cast(ubyte)day;
    }
    short     _year  = 1;
    Month9775 _month = Month9775.jan;
    ubyte     _day   = 1;
}

const Date9775 date9775c1 = Date9775(2012, 12, 21);
const          date9775c2 = Date9775(2012, 12, 21);
enum  Date9775 date9775e1 = Date9775(2012, 12, 21);
enum           date9775e2 = Date9775(2012, 12, 21);

/********************************************/
// 11105

struct S11105
{
    int[2][1] a21;
}

void test11105()
{
    S11105 s = S11105([1, 2]);
}

/********************************************/
// 11147

struct V11147
{
    union
    {
        struct
        {
            float x = 0;
            float y = 0;
            float z = 0;
        }
        struct
        {
            float r;
            float g;
            float b;
        }
    }
}

void test11147()
{
    auto v = V11147.init;
    assert(v.x == 0f);
    assert(v.y == 0f);
    assert(v.z == 0f);
    assert(v.r == 0f);
    assert(v.g == 0f);
    assert(v.b == 0f);
}

/********************************************/
// 11256

struct S11256 { @disable this(); }

struct Z11256a(Ranges...)
{
    Ranges ranges;
    this(Ranges rs) { ranges = rs; }
}
struct Z11256b(Ranges...)
{
    Ranges ranges = Ranges.init;    // Internal error: e2ir.c 5321
    this(Ranges rs) { ranges = rs; }
}
struct Z11256c(Ranges...)
{
    Ranges ranges = void;           // todt.c(475) v->type->ty == Tsarray && vsz == 0
    this(Ranges rs) { ranges = rs; }
}

struct F11256(alias pred)
{
    this(int[]) { }
}

Z!Ranges z11256(alias Z, Ranges...)(Ranges ranges)
{
    return Z!Ranges(ranges);
}

void test11256()
{
    z11256!Z11256a(S11256.init, F11256!(gv => true)(null));
    z11256!Z11256b(S11256.init, F11256!(gv => true)(null));
    z11256!Z11256c(S11256.init, F11256!(gv => true)(null));
}

/********************************************/
// 11269

struct Atom
{
    union
    {
        int i;
        struct
        {
            ulong first, rest;
        }
        struct
        {
            uint a, b;
        }
    }
}

void test11269()
{
    Atom a1;
    Atom a2 = {i:1, rest:10, b:2};
}

/********************************************/
// 11427

struct S11427
{
    union
    {
        ubyte a;
        int x;
    }
    void[] arr;
}

int foo11427() @safe
{
    S11427 s1 = S11427();
    S11427 s2;
    return 0;
}

/********************************************/
// 12011

struct S12011a
{
    int f() { return i; }
    enum e = this.init.f();
    int i = 1, j = 2;
}

struct S12011b
{
    int f() { return i; }
    enum e = S12011b().f();
    int i = 1, j = 2;
}

void test12011()
{
    static assert(S12011a.e == 1);
    static assert(S12011b.e == 1);
}

/********************************************/
// 13021

void test13021()
{
    static union U1
    {
        float a;
        int b;
    }

    static union U2
    {
        double a;
        long b;
    }

    static union U3
    {
        real a;
        struct B { long b1, b2; } // ICE happens only if B.sizeof == real.sizeof
        B b;
    }

    static union U4
    {
        real a;
        long[2] b; // ditto
    }

    auto f = U1(1.0);  auto ok = f.b;

    auto fail1 = U1(1.0).b; // OK <- Internal error: e2ir.c 1162
    auto fail2 = U2(1.0).b; // OK <- Internal error: e2ir.c 1162
    auto fail3 = U3(1.0).b; // OK <- Internal error: e2ir.c 1162
    auto fail4 = U4(1.0).b; // OK <- Internal error: backend/el.c 2904
}

/********************************************/
// 14556

enum E14556 { a = 1 }

struct S14556a
{
    this(int) {}
    E14556[1] data;
}

struct S14556b
{
    this(int) {}
    void[1] data;
}

void test14556()
{
    auto sa = S14556a(0);
    assert(sa.data == [E14556.a]);

    auto sb = S14556b(0);
    assert(sb.data[] == cast(ubyte[1])[0]);
}

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

struct S17622
{
    int i;

    this(ubyte)
    {
        return;
    }

    void fun()
    {
        assert(i == 0);
    }
}

S17622 make()
{
    return S17622(0);
}

void test17622()
{
    S17622 s = make();

    auto rdg = (){ s.fun(); };

    s.fun();
}

/********************************************/

int main()
{
    test1();
    test2();
    test3();
    test4();
    test5();
    test6();
    test7();
    test8();
    test9();
    test10();
    test11();
    test12();
    test13();
    test14();
    test15a();
    test15b();
    test15c();
    test15d();
    test15e();
    test9993a();
    test9993b();
    test3198and1914();
    test2427();
    test5885();
    test5889();
    test4247();
    test6937();
    test12681();
    test3991();
    test7727();
    test7929();
    test7021();
    test8738();
    test8763();
    test8902();
    test9116();
    test9293();
    test9566();
    test11105();
    test11147();
    test11256();
    test13021();
    test14556();
    test17622();

    printf("Success\n");
    return 0;
}
