// PERMUTE_ARGS: -inline
/*
TEST_OUTPUT:
---
compilable/interpret3.d(6350): Deprecation: identity comparison of static arrays implicitly coerces them to slices, which are compared by reference
---
*/

template compiles(int T)
{
    bool compiles = true;
}

alias TypeTuple(T...) = T;

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=3901
// Arbitrary struct assignment, ref return

struct ArrayRet
{
    int x;
}

int arrayRetTest(int z)
{
    ArrayRet[6] w;
    int q = (w[3].x = z);
    return q;
}
static assert(arrayRetTest(51) == 51);

// https://issues.dlang.org/show_bug.cgi?id=3842 -- must not segfault
int ice3842(int z)
{
    ArrayRet w;
    return arrayRetTest((*(&w)).x);
}
static assert(true || is(typeof(compiles!(ice3842(51)))));

int arrayret2()
{
    int[5] a;
    int[3] b;
    b[] = a[1 .. $-1] = 5;
    return b[1];
}
static assert(arrayret2() == 5);

struct DotVarTest
{
    ArrayRet z;
}

struct DotVarTest2
{
    ArrayRet z;
    DotVarTest p;
}

int dotvar1()
{
    DotVarTest w;
    w.z.x = 3;
    return w.z.x;
}
static assert(dotvar1() == 3);

int dotvar2()
{
    DotVarTest2[4] m;
    m[2].z.x = 3;
    m[1].p.z.x = 5;
    return m[2].z.x + 7;
}
static assert(dotvar2() == 10);


struct RetRefStruct
{
    int x;
    char c;
}

// Return value reference tests, for D2 only.

ref RetRefStruct reffunc1(return ref RetRefStruct a)
{
    int y = a.x;
    return a;
}

ref RetRefStruct reffunc2(return ref RetRefStruct a)
{
    RetRefStruct z = a;
    return reffunc1(a);
}

ref int reffunc7(return ref RetRefStruct aa)
{
    return reffunc1(aa).x;
}

ref int reffunc3(return ref int a)
{
    return a;
}

struct RefTestStruct
{
    RetRefStruct r;

    ref RefTestStruct reffunc4(ref RetRefStruct[3] a) return
    {
        return this;
    }

    ref int reffunc6() return
    {
        return this.r.x;
    }
}

ref RetRefStruct reffunc5(return ref RetRefStruct[3] a)
{
    int t = 1;
    for (int i = 0; i < 10; ++i)
    {
        if (i == 7)
            ++t;
    }
    return a[reffunc3(t)];
}

int retRefTest1()
{
    RetRefStruct b = RetRefStruct(0, 'a');
    reffunc1(b).x = 3;
    return b.x - 1;
}

int retRefTest2()
{
    RetRefStruct b = RetRefStruct(0, 'a');
    reffunc2(b).x = 3;
    RetRefStruct[3] z;
    RefTestStruct w;
    w.reffunc4(z).reffunc4(z).r.x = 4;
    assert(w.r.x == 4);
    w.reffunc6() = 218;
    assert(w.r.x == 218);
    z[2].x = 3;
    int q = 4;
    int u = reffunc5(z).x + reffunc3(q);
    assert(u == 7);
    reffunc5(z).x += 7;
    assert(z[2].x == 10);
    RetRefStruct m = RetRefStruct(7, 'c');
    m.x = 6;
    reffunc7(m) += 3;
    assert(m.x == 9);
    return b.x - 1;
}

int retRefTest3()
{
    RetRefStruct b = RetRefStruct(0, 'a');
    auto deleg = function (RetRefStruct a){ return a; };
    typeof(deleg)[3] z;
    z[] = deleg;
    auto y = deleg(b).x + 27;
    b.x = 5;
    assert(y == 27);
    y = z[1](b).x + 22;
    return y - 1;
}

int retRefTest4()
{
    RetRefStruct b = RetRefStruct(0, 'a');
    reffunc3(b.x) = 218;
    assert(b.x == 218);
    return b.x;
}

static assert(retRefTest1() == 2);
static assert(retRefTest2() == 2);
static assert(retRefTest3() == 26);
static assert(retRefTest4() == 218);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7887
// assign to returned reference

bool test7887()
{
    ref int f(ref int x) { return x; }
    int a;
    f(a) = 42;
    return (a == 42);
}
static assert(test7887());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7473
// struct non-ref

struct S7473
{
    int i;
}

static assert({
    S7473 s = S7473(1);
    assert(s.i == 1);
    bug7473(s);
    assert(s.i == 1);
    return true;
}());

void bug7473(S7473 s)
{
    s.i = 2;
}

struct S7473b
{
    S7473 m;
}

static assert({
    S7473b s = S7473b(S7473(7));
    assert(s.m.i == 7);
    bug7473b(s);
    assert(s.m.i == 7);
    return true;
}());

void bug7473b(S7473b s)
{
    s.m.i = 2;
}

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

int bug4389()
{
    string s;
    dchar c = '\u2348';
    s ~= c;
    assert(s.length == 3);
    dchar d = 'D';
    s ~= d;
    assert(s.length == 4);
    s = "";
    s ~= c;
    assert(s.length == 3);
    s ~= d;
    assert(s.length == 4);
    string z;
    wchar w = '\u0300';
    z ~= w;
    assert(z.length == 2);
    z = "";
    z ~= w;
    assert(z.length == 2);
    return 1;
}

static assert(bug4389());

// ICE(constfold.c)
int ice4389()
{
    string s;
    dchar c = '\u2348';
    s ~= c;
    s = s ~ "xxx";
   return 1;
}

static assert(ice4389());

// ICE(expression.c)
string ice4390()
{
    string s;
    dchar c = '`';
    s ~= c;
    s ~= c;
   return s;
}

static assert(mixin(ice4390()) == ``);

// https://issues.dlang.org/show_bug.cgi?id=5248
// (D1 + D2)
struct Leaf5248
{
    string Compile_not_ovloaded()
    {
        return "expression";
    }
}
struct Matrix5248
{
    Leaf5248 Right;

    string Compile()
    {
        return Right.Compile_not_ovloaded();
    }
};

static assert(Matrix5248().Compile());

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

bool bug4837()
{
    ushort x = 0x89AB;
    x >>>= 4;
    assert(x == 0x89A);
    byte y = 0x7C;
    y >>>= 2;
    assert(y == 0x1F);
    return true;
}

static assert(bug4837());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10252
// shift out of range

int lshr10252(int shift)
{
     int a = 5;
     return a << shift;
}

int rshr10252(int shift)
{
     int a = 5;
     return a >> shift;
}

int ushr10252(int shift)
{
     int a = 5;
     return a >>> shift;
}

static assert( is(typeof(compiles!(lshr10252( 4)))));
static assert(!is(typeof(compiles!(lshr10252(60)))));
static assert( is(typeof(compiles!(rshr10252( 4)))));
static assert(!is(typeof(compiles!(rshr10252(80)))));
static assert( is(typeof(compiles!(ushr10252( 2)))));
static assert(!is(typeof(compiles!(ushr10252(60)))));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=1982
// CTFE null problems

enum a1982 = [1, 2, 3];
static assert(a1982 !is null);

string foo1982() { return null; }
static assert(foo1982() is null);
static assert(!foo1982().length);

static assert(null is null);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7988
// CTFE return values should be allowed in compile-time expressions

class X7988 { int y; this() { y = 2; } }
static assert((new X7988).y == 2);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=8253
// ICE: calling of member function of non-CTFE class variable

class Bug8253
{
    bool j()
    {
        return true;
    }
}
Bug8253 m8253;
static assert(!is(typeof(compiles!(m8253.j()))));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=8285
// Issue with slice returned from CTFE function

string foo8285()
{
    string s = "ab";
    return s[0 .. $];
}

template T8285b(string s) { }

template T8285a()
{
    enum s = foo8285();
    alias T8285b!(s) t2;
}

int bar8285()
{
    alias T8285a!() t1;
    return 0;
}

int baz8285(int x)
{
    return 0;
}

static assert(baz8285(bar8285()) == 0);

// test case 2

string xbar8285()
{
    string s = "ab";
    return s[0 .. $];
}

template xT8285a()
{
    enum xT8285a = xbar8285()[0 .. $];
}

string xbaz8285()
{
    return xT8285a!();
}

string xfoo8285(string s)
{
    return s;
}

static assert(xfoo8285(xbaz8285()) == "ab");

/**************************************************
  'this' parameter bug revealed during refactoring
**************************************************/

int thisbug1(int x) { return x; }

struct ThisBug1
{
    int m = 1;
    int wut()
    {
        return thisbug1(m);
    }
}

int thisbug2()
{
    ThisBug1 spec;
    return spec.wut();
}

static assert(thisbug2());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6972
// ICE with cast()cast()assign

int bug6972()
{
    ubyte n = 6;
    n /= 2u;
    return n;
}
static assert(bug6972() == 3);

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

size_t bug6164()
{
    int[] ctfe2(int n)
    {
        int[] r = [];
        if (n != 0)
            r ~= [1] ~ ctfe2(n - 1);
        return r;
    }
    return ctfe2(2).length;
}
static assert(bug6164() == 2);

/**************************************************
    Interpreter code coverage tests
**************************************************/

int cov1(int a)
{
    a %= 15382;
    a /= 5;
    a = ~ a;
    bool c = (a == 0);
    bool b = true && c;
    assert(b == 0);
    b = false && c;
    assert(b == 0);
    b = false || c;
    assert(b == 0);
    a ^= 0x45349;
    a = ~ a;
    a &= 0xFF3F;
    a >>>= 1;
    a = a ^ 0x7393;
    a = a >> 1;
    a = a >>> 1;
    a = a | 0x010101;
    return a;
}
static assert(cov1(534564) == 71589);

int cov2()
{
    int i = 0;
    do
    {
        goto DOLABEL;
    DOLABEL:
        if (i != 0)
        {
            goto IFLABEL;
    IFLABEL:
            switch(i)
            {
            case 3:
                break;
            case 6:
                goto SWITCHLABEL;
    SWITCHLABEL:
                i = 27;
                goto case 3;
            default:
                assert(0);
            }
            return i;
        }
        i = 6;
    } while(true);
    return 88; // unreachable
}
static assert(cov2() == 27);

template CovTuple(T...)
{
    alias T CovTuple;
}

alias CovTuple!(int, long) TCov3;

int cov3(TCov3 t)
{
    TCov3 s;
    s = t;
    assert(s[0] == 1);
    assert(s[1] == 2);
    return 7;
}
static assert(cov3(1, 2) == 7);

int badassert1(int z)
{
    assert(z == 5, "xyz");
    return 1;
}

size_t badslice1(int[] z)
{
    return z[0 .. 3].length;
}

size_t badslice2(int[] z)
{
    return z[0 .. badassert1(1)].length;
}

size_t badslice3(int[] z)
{
    return z[badassert1(1) .. 2].length;
}

static assert(!is(typeof(compiles!(badassert1(67)))));
static assert( is(typeof(compiles!(badassert1(5)))));
static assert(!is(typeof(compiles!(badslice1([1,2])))));
static assert(!is(typeof(compiles!(badslice2([1,2])))));
static assert(!is(typeof(compiles!(badslice3([1,2,3])))));

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

int bug7894()
{
    for (int k = 0; k < 2; ++k)
    {
        goto Lagain;
Lagain:
        ;
    }
    int m = 1;
    do
    {
        ++m;
        goto Ldo;
Ldo: ;
    } while (m < 3);
    assert(m == 3);

    return 1;
}
static assert(bug7894());

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

size_t bug5524(int x, int[] more...)
{
    int[0] zz;
    assert(zz.length == 0);
    return 7 + more.length + x;
}
static assert(bug5524(3) == 10);


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

static assert(("" ~ "\&copy;"[0]).length == 1);
const char[] null5722 = null;
static assert((null5722 ~ "\&copy;"[0]).length == 1);
static assert(("\&copy;"[0] ~ null5722).length == 1);

/*******************************************
 * Tests for CTFE Array support.
 * https://issues.dlang.org/show_bug.cgi?id=1330
 * https://issues.dlang.org/show_bug.cgi?id=3801
 * https://issues.dlang.org/show_bug.cgi?id=3835
 * https://issues.dlang.org/show_bug.cgi?id=4050
 * https://issues.dlang.org/show_bug.cgi?id=4051
 * https://issues.dlang.org/show_bug.cgi?id=5147
 * and major functionality
 *******************************************/

char[] bug1330StringIndex()
{
    char[] blah = "foo".dup;
    assert(blah == "foo");
    char[] s = blah[0 .. 2];
    blah[0] = 'h';
    assert(s == "ho");
    s[0] = 'm';
    return blah;
}
static assert(bug1330StringIndex() == "moo");
static assert(bug1330StringIndex() == "moo"); // check we haven't clobbered any string literals

int[] bug1330ArrayIndex()
{
    int[] blah = [1,2,3];
    int[] s = blah;
    s = blah[0 .. 2];
    int z = blah[0] = 6;
    assert(z == 6);
    assert(blah[0] == 6);
    assert(s[0] == 6);
    assert(s == [6, 2]);
    s[1] = 4;
    assert(z == 6);
    return blah;
}
static assert(bug1330ArrayIndex() == [6, 4, 3]);
static assert(bug1330ArrayIndex() == [6, 4, 3]); // check we haven't clobbered any literals

char[] bug1330StringSliceAssign()
{
    char[] blah = "food".dup;
    assert(blah == "food");
    char[] s = blah[1 .. 4];
    blah[0 .. 2] = "hc";
    assert(s == "cod");
    s[0 .. 2] = ['a', 'b'];   // Mix string + array literal
    assert(blah == "habd");
    s[0 .. 2] = "mq";
    return blah;
}
static assert(bug1330StringSliceAssign() == "hmqd");
static assert(bug1330StringSliceAssign() == "hmqd");

int[] bug1330ArraySliceAssign()
{
    int[] blah = [1, 2, 3, 4];
    int[] s = blah[1 .. 4];
    blah[0 .. 2] = [7, 9];
    assert(s == [9, 3, 4]);
    s[0 .. 2] = [8, 15];
    return blah;
}
static assert(bug1330ArraySliceAssign() == [7, 8, 15, 4]);

int[] bug1330ArrayBlockAssign()
{
    int[] blah = [1, 2, 3, 4, 5];
    int[] s = blah[1 .. 4];
    blah[0 .. 2] = 17;
    assert(s == [17, 3, 4]);
    s[0 .. 2] = 9;
    return blah;
}
static assert(bug1330ArrayBlockAssign() == [17, 9, 9, 4, 5]);

char[] bug1330StringBlockAssign()
{
    char[] blah = "abcde".dup;
    char[] s = blah[1 .. 4];
    blah[0 .. 2] = 'x';
    assert(s == "xcd");
    s[0 .. 2] = 'y';
    return blah;
}
static assert(bug1330StringBlockAssign() == "xyyde");

int assignAA(int x)
{
    int[int] aa;
    int[int] cc = aa;
    assert(cc.values.length == 0);
    assert(cc.keys.length == 0);
    aa[1] = 2;
    aa[x] = 6;
    int[int] bb = aa;
    assert(bb.keys.length == 2);
    assert(cc.keys.length == 0); // cc is not affected to aa, because it is null
    aa[500] = 65;
    assert(bb.keys.length == 3); // but bb is affected by changes to aa
    return aa[1] + aa[x];
}
static assert(assignAA(12) == 8);

template Compileable(int z) { bool OK; }

int arraybounds(int j, int k)
{
    int[] xxx = [1, 2, 3, 4, 5];
    int[] s = xxx[1 .. $];
    s = s[j .. k]; // slice of slice
    return s[$ - 1];
}
static assert(!is(typeof(Compileable!(arraybounds(1, 14)))));
static assert(!is(typeof(Compileable!(arraybounds(15, 3)))));
static assert(arraybounds(2, 4) == 5);

int arraybounds2(int j, int k)
{
    int[] xxx = [1, 2, 3, 4, 5];
    int[] s = xxx[j .. k]; // direct slice
    return 1;
}
static assert(!is(typeof(Compileable!(arraybounds2(1, 14)))));
static assert(!is(typeof(Compileable!(arraybounds2(15, 3)))));
static assert(arraybounds2(2, 4) == 1);

int bug5147a()
{
    int[1][2] a = 37;
    return a[0][0];
}
static assert(bug5147a() == 37);

int bug5147b()
{
    int[4][2][3][17] a = 37;
    return a[0][0][0][0];
}
static assert(bug5147b() == 37);

int setlen()
{
    int[][] zzz;
    zzz.length = 2;
    zzz[0].length = 10;
    assert(zzz.length == 2);
    assert(zzz[0].length == 10);
    assert(zzz[1].length == 0);
    return 2;
}
static assert(setlen() == 2);

int[1][1] bug5147()
{
    int[1][1] a = 1;
    return a;
}
static assert(bug5147() == [[1]]);

enum int[1][1] enum5147 = bug5147();
static assert(enum5147 == [[1]]);

immutable int[1][1] bug5147imm = bug5147();

// Index referencing
int[2][2] indexref1()
{
    int[2][2] a = 2;
    a[0] = 7;

    int[][] b = [null, null];
    b[0 .. $] = a[0][0 .. 2];
    assert(b[0][0] == 7);
    assert(b[0][1] == 7);
    int[] w;
    w = a[0];
    assert(w[0] == 7);
    w[0 .. $] = 5;
    assert(a[0] != [7, 7]);
    assert(a[0] == [5, 5]);
    assert(b[0] == [5, 5]);
    return a;
}
int[2][2] indexref2()
{
    int[2][2] a = 2;
    a[0] = 7;

    int[][2] b = null;
    b[0 .. $] = a[0];
    assert(b[0][0] == 7);
    assert(b[0][1] == 7);
    assert(b == [[7, 7], [7, 7]]);
    int[] w;
    w = a[0];
    assert(w[0] == 7);
    w[0 .. $] = 5;
    assert(a[0] != [7, 7]);
    assert(a[0] == [5, 5]);
    assert(b[0] == [5, 5]);
    return a;
}
int[2][2] indexref3()
{
    int[2][2] a = 2;
    a[0]=7;

    int[][2] b = [null, null];
    b[0 .. $] = a[0];
    assert(b[0][0] == 7);
    assert(b[0][1] == 7);
    int[] w;
    w = a[0];
    assert(w[0] == 7);
    w[0 .. $] = 5;
    assert(a[0] != [7, 7]);
    assert(a[0] == [5, 5]);
    assert(b[0] == [5, 5]);
    return a;
}
int[2][2] indexref4()
{
    int[2][2] a = 2;
    a[0] = 7;

    int[][2] b =[[1, 2, 3], [1, 2, 3]]; // wrong code
    b[0] = a[0];
    assert(b[0][0] == 7);
    assert(b[0][1] == 7);
    int[] w;
    w = a[0]; //[0 .. $];
    assert(w[0] == 7);
    w[0 .. $] = 5;
    assert(a[0] != [7, 7]);
    assert(a[0] == [5, 5]);
    assert(b[0] == [5, 5]);
    return a;
}
static assert(indexref1() == [[5, 5], [2, 2]]);
static assert(indexref2() == [[5, 5], [2, 2]]);
static assert(indexref3() == [[5, 5], [2, 2]]);
static assert(indexref4() == [[5, 5], [2, 2]]);

int staticdynamic()
{
    int[2][1] a = 2;
    assert(a == [[2, 2]]);

    int[][1] b = a[0][0 .. 1];
    assert(b[0] == [2]);
    auto k = b[0];
    auto m = a[0][0 .. 1];
    assert(k == [2]);
    assert(m == k);
    return 0;
}
static assert(staticdynamic() == 0);

int chainassign()
{
    int[4] x = 6;
    int[] y = new int[4];
    auto k = (y[] = (x[] = 2));
    return k[0];
}
static assert(chainassign() == 2);

// index assignment
struct S3801
{
    char c;
    int[3] arr;

    this(int x, int y)
    {
        c = 'x';
        arr[0] = x;
        arr[1] = y;
    }
}

int bug3801()
{
    S3801 xxx = S3801(17, 67);
    int[] w = xxx.arr;
    xxx.arr[1] = 89;
    assert(xxx.arr[0] == 17);
    assert(w[1] == 89);
    assert(w == [17, 89, 0]);
    return xxx.arr[1];
}

enum : S3801 { bug3801e = S3801(17, 18) }
static assert(bug3801e.arr == [17, 18, 0]);

immutable S3801 bug3801u = S3801(17, 18);
static assert(bug3801u.arr == [17, 18, 0]);
static assert(bug3801() == 89);

int bug3835()
{
    int[4] arr;
    arr[] = 19;
    arr[0] = 4;
    int kk;
    foreach (ref el; arr)
    {
        el += 10;
        kk = el;
    }
    assert(arr[2] == 29);
    arr[0] += 3;
    return arr[0];
}
static assert(bug3835() == 17);

auto bug5852(const(string) s)
{
    string[] r;
    r ~= s;
    assert(r.length == 1);
    return r[0].length;
}
static assert(bug5852("abc") == 3);

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

struct S7217 { int[] arr; }

bool f7217()
{
    auto s = S7217();
    auto t = s.arr;
    return true;
}
static assert(f7217());

/*******************************************
    Set array length
*******************************************/

static assert(
{
    struct W { int[] z; }
    W w;
    w.z.length = 2;
    assert(w.z.length == 2);
    w.z.length = 6;
    assert(w.z.length == 6);
    return true;
}());

// https://issues.dlang.org/show_bug.cgi?id=7185
// char[].length = n

bool bug7185()
{
    auto arr = new char[2];
    auto arr2 = new char[2];
    arr2[] = "ab";
    arr.length = 1;
    arr2.length = 7;
    assert(arr.length == 1);
    assert(arr2.length == 7);
    assert(arr2[0 .. 2] == "ab");
    return true;
}
static assert(bug7185());

bool bug9908()
{
    static const int[3] sa = 1;
    return sa == [1, 1, 1];
}
static assert(bug9908());

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

struct Struct6934
{
    int[] x = [1, 2];
}

void bar6934(ref int[] p)
{
    p[0] = 12;
    assert(p[0] == 12);
    p[0 .. 1] = 17;
    assert(p[0] == 17);
    p = p[1 .. $];
}

int bug6934()
{
    Struct6934 q;
    bar6934(q.x);
    int[][] y = [[2, 5], [3, 6, 8]];
    bar6934(y[0]);
    return 1;
}
static assert(bug6934());

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

static assert(['a', 'b'] ~ "c" == "abc");

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

int evil8624()
{
    long  m =  0x1_0000_0000L;
    assert(m != 0);
    long[] a = [0x1_0000_0000L];
    long[] b = [0x4_0000_0000L];
    assert(a[] != b[]);
    return 1;
}
static assert(evil8624());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=8644
// array literal >,<

int bug8644()
{
    auto m = "a";
    auto z = ['b'];
    auto c = "b7";
    auto d = ['b', '6'];
    assert(m < z);
    assert(z > m);
    assert(z <= c);
    assert(c > z);
    assert(c > d);
    assert(d >= d);
    return true;
}
static assert(bug8644());

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

struct A6159 {}

static assert({ return A6159.init is A6159.init; }());
static assert({ return [1] is [1]; }());

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

string bug5685()
{
    return "xxx";
}
struct Bug5865
{
    void test1()
    {
        enum file2 = (bug5685())[0 .. $];
    }
}

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6235
// Regression ICE on $ in template

struct Bug6235(R)
{
    enum XXX = is(typeof(R.init[0 .. $]) : const ubyte[]);
}

Bug6235!(ubyte[]) bug6235;

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

enum dollar8673 = [0][(() => $ - 1)()];

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

struct Bug5840
{
    string g;
    int w;
}

int bug5840(int u)
{
    // check for clobbering
    Bug5840 x = void;
    x.w = 4;
    x.g = "3gs";
    if (u == 1)
        bug5840(2);
    if (u == 2)
    {
        x.g = "abc";
        x.w = 3465;
    }
    else
    {
        assert(x.g == "3gs");
        assert(x.w == 4);
    }
    return 56;
}
static assert(bug5840(1) == 56);

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

int bug7810()
{
    int[1][3] x = void;
    x[0] = [2];
    x[1] = [7];
    assert(x[0][0] == 2);

    char[1][3] y = void;
    y[0] = "a";
    y[1] = "b";
    assert(y[0][0] == 'a');

    return 1;
}
static assert(bug7810());

struct Bug7810
{
    int w;
}
int bug7810b(T)(T[] items...)
{
    assert(items[0] == Bug7810(20));
    return 42;
}
static assert(bug7810b(Bug7810(20), Bug7810(10)) == 42);

/*******************************************
    std.datetime ICE (30 April 2011)
*******************************************/

struct TimeOfDayZ
{
public:
    this(int hour) { }
    invariant() { }
}
const testTODsThrownZ = TimeOfDayZ(0);

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

struct Bug5954
{
    int x;
    this(int xx)
    {
        this.x = xx;
    }
}
void bug5954()
{
    enum f = Bug5954(10);
    static assert(f.x == 10);
}

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

int bug5972()
{
    char[] z = "abc".dup;
    char[][] a = [null, null];
    a[0]  = z[0 .. 2];
    char[] b = a[0];
    assert(b == "ab");
    a[0][1] = 'q';
    assert(a[0] == "aq");
    assert(b == "aq");
    assert(b[1] == 'q');
    //a[0][0 .. $ - 1][0 .. $] = a[0][0 .. $ - 1][0 .. $];  // overlap
    return 56;
}
static assert(bug5972() == 56);

/*******************************************
    2.053beta [CTFE]ICE 'global errors'
*******************************************/

int wconcat(wstring replace)
{
    wstring value;
    value  = "A"w;
    value = value ~ replace;
    return 1;
}
static assert(wconcat("X"w));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10397
// string concat

static assert(!is(typeof(compiles!("abc" ~ undefined))));
static assert(!is(typeof(compiles!(otherundefined ~ "abc"))));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=9634
// struct concat

struct Bug9634
{
    int raw;
}

bool bug9634()
{
    Bug9634[] jr = [Bug9634(42)];

    Bug9634[] ir = null ~ jr;
    Bug9634[] kr = jr ~ null;
    Bug9634[] mr = jr ~ jr;

    jr[0].raw = 6;
    assert(ir[0].raw == 42);
    assert(kr[0].raw == 42);
    assert(jr[0].raw == 6);
    assert(&mr[0] != &mr[1]);
    return true;
}

static assert(bug9634());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=4001: A Space Oddity

int space() { return 4001; }

void oddity4001(int q)
{
    const int bowie = space();
    static assert(space() == 4001);
    static assert(bowie == 4001);
}

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

static const bug3779 = ["123"][0][$ - 1];

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=8893
// ICE with bad struct literal

struct Foo8893
{
    char[3] data;
}
int bar8893(Foo8893 f)
{
    return f.data[0];
}
static assert(!is(typeof(compiles!(bar8893(Foo8893(['a','b']))))));

/*******************************************
    non-Cow struct literals
*******************************************/

struct Zadok
{
    int[3] z;
    char[4] s = void;
    ref int[] fog(return ref int[] q) { return q; }
    int bfg()
    {
        z[0] = 56;
        auto zs = z[];
        fog(zs) = [56, 6, 8];

        assert(z[0] == 56);
        assert(z[1] == 61);
        assert(z[2] == 61);

        assert(zs[0] == 56);
        assert(zs[1] == 6);
        return zs[2];
    }
}

struct Vug
{
    Zadok p;
    int[] other;
}

int quop()
{
    int[] heap = new int[5];
    heap[] = 738;
    Zadok pong;
    pong.z = 3;
    int[] w = pong.z;
    assert(w[0] == 3);
    Zadok phong;
    phong.z = 61;
    pong = phong;
    assert(w[0] == 61);
    Vug b = Vug(Zadok(17, "abcd"));
    b = Vug(Zadok(17, "abcd"), heap);
    b.other[2] = 78;
    assert(heap[2] == 78);
    char[] y = b.p.s;
    assert(y[2] == 'c');
    phong.s = ['z','x','f', 'g'];
    w = b.p.z;
    assert(y[2] == 'c');
    assert(w[0] == 17);
    b.p = phong;
    assert(y[2] == 'f');

    Zadok wok = Zadok(6, "xyzw");
    b.p = wok;
    assert(y[2] == 'z');
    b.p = phong;
    assert(w[0] == 61);
    Vug q;
    q.p = pong;
    return pong.bfg();
}

static assert(quop() == 8);
static assert(quop() == 8); // check for clobbering

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=5676
// tuple assign of struct that has void opAssign

struct S5676
{
    int x;
    void opAssign(S5676 rhs) { x = rhs.x; }
}

struct Tup5676(E...)
{
    E g;
    void foo(E values) { g = values; }
}

bool ice5676()
{
    Tup5676!(S5676) q;
    q.foo(S5676(3));
    assert(q.g[0].x == 3);
    return true;
}

static assert(ice5676());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=5682
// Wrong CTFE with operator overloading

struct A
{
    int n;
    auto opBinary(string op : "*")(A rhs)
    {
        return A(n * rhs.n);
    }
}

A foo(A[] lhs, A[] rhs)
{
    A current;
    for (size_t k = 0; k < rhs.length; ++k)
    {
        current = lhs[k] * rhs[k];
    }
    return current;
}

auto test()
{
    return foo([A(1), A(2)], [A(3), A(4)]);
}

static assert(test().n == 8);

/**************************************************
   Attempt to modify a read-only string literal
**************************************************/
struct Xarg
{
    char[] s;
}

int zfs(int n)
{
    char[] m = "exy".dup;
    if (n == 1)
    {
        // it's OK to cast to const, then cast back
        string ss = cast(string)m;
        m = cast(char[])ss;
        m[2]='q';
        return 56;
    }
    auto q = Xarg(cast(char[])"abc");
    assert(q.s[1] == 'b');
    if (n == 2)
        q.s[1] = 'p';
    else if (n == 3)
        q.s[0 .. $] = 'p';
    char* w = &q.s[2];
    if (n == 4)
        *w = 'z';
    return 76;
}

static assert(!is(typeof(compiles!(zfs(2)))));
static assert(!is(typeof(compiles!(zfs(3)))));
static assert(!is(typeof(compiles!(zfs(4)))));
static assert( is(typeof(compiles!(zfs(1)))));
static assert( is(typeof(compiles!(zfs(5)))));

/**************************************************
   .dup must protect string literals
**************************************************/

string mutateTheImmutable(immutable string _s)
{
    char[] s = _s.dup;
    foreach (ref c; s)
        c = 'x';
    return s.idup;
}

string doharm(immutable string _name)
{
    return mutateTheImmutable(_name[2 .. $].idup);
}

enum victimLiteral = "CL_INVALID_CONTEXT";

enum thug = doharm(victimLiteral);
static assert(victimLiteral == "CL_INVALID_CONTEXT");

/**************************************************
        Use $ in a slice of a dotvar slice
**************************************************/

int sliceDollar()
{
    Xarg z;
    z.s = new char[20];
    z.s[] = 'b';
    z.s = z.s[2 .. $ - 2];
    z.s[$ - 2] = 'c';
    return z.s[$ - 2];
}
static assert(sliceDollar() == 'c');

/**************************************************
   Variation of 5972 which caused segfault
**************************************************/

int bug5972crash()
{
    char[] z = "abc".dup;
    char[][] a = [null, null];
    a[0] = z[0 .. 2];
    a[0][1] = 'q';
    return 56;
}
static assert(bug5972crash() == 56);

/**************************************************
   String slice assignment through ref parameter
**************************************************/

void popft(A)(ref A a)
{
    a = a[1 .. $];
}

int sdfgasf()
{
    auto scp = "abc".dup;
    popft(scp);
    return 1;
}
static assert(sdfgasf() == 1);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=8830
// slice of slice.ptr

string bug8830(string s)
{
    auto ss = s[1 .. $];
    return ss.ptr[0 .. 2];
}
static assert(bug8830("hello") == "el");

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

void bug8608(ref int m) {}
void test8608()
{
    int z;
    int foo(bool b)
    {
        if (b)
            bug8608(z);
        return 1;
    }
    static assert( is(typeof(compiles!(foo(false)))));
    static assert(!is(typeof(compiles!(foo(true) ))));
}

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

immutable char[] foo7770 = "abcde";

int bug7770a(string a)
{
    return 1;
}

bool bug7770b(char c)
{
    return true;
}

static assert(bug7770a(foo7770[0 .. $]));
static assert(bug7770b(foo7770[$ - 2]));

void baz7770()
{
    static assert(bug7770a(foo7770[0 .. $]));
    static assert(bug7770b(foo7770[$ - 2]));
}

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

dchar bug8601(dstring s)
{
    dstring w = s[1 .. $];
    return w[0];
}

enum dstring e8601 = [cast(dchar)'o', 'n'];
static assert(bug8601(e8601) == 'n');

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

struct Foo6015
{
    string field;
}

bool func6015(string input)
{
    Foo6015 foo;
    foo.field = input[0 .. $];
    assert(foo.field == "test");
    foo.field = "test2";
    assert(foo.field != "test");
    assert(foo.field == "test2");
    return true;
}

static assert(func6015("test"));

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

void bug6001e(ref int[] s)
{
    int[] r = s;
    s ~= 0;
}
bool bug6001f()
{
    int[] s;
    bug6001e(s);
    return true;
}
static assert(bug6001f());

// Assignment to AAs

void blah(int[char] as)
{
    auto k = [6: as];
    as = k[6];
}
int blaz()
{
    int[char] q;
    blah(q);
    return 67;
}
static assert(blaz() == 67);

void bug6001g(ref int[] w)
{
    w = [88];
    bug6001e(w);
    w[0] = 23;
}

bool bug6001h()
{
    int[] s;
    bug6001g(s);
    assert(s.length == 2);
    assert(s[1] == 0);
    assert(s[0] == 23);
    return true;
}
static assert(bug6001h());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10243
// wrong code *&arr as ref parameter
// https://issues.dlang.org/show_bug.cgi?id=10551
// wrong code (&arr)[0] as ref parameter

void bug10243(ref int n)
{
    n = 3;
}

void bug10551(int* p)
{
    bug10243(p[0]);
}

bool test10243()
{
    int[1] arr;
    bug10243(*arr.ptr);
    assert(arr[0] == 3);
    int[1] arr2;
    bug10551(arr2.ptr);
    assert(arr2[0] == 3);
    int v;
    bug10551(&v);
    assert(v == 3);
    return true;
}

static assert(test10243());

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

int bug4910(int a)
{
    return a;
}

static int var4910;
static assert(!is(typeof(Compiles!(bug4910(var4910)))));

static assert(bug4910(123));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=5845
// Regression(2.041)

void test5845(ulong cols) {}

uint solve(bool niv, ref ulong cols)
{
    if (niv)
        solve(false, cols);
    else
        test5845(cols);
    return 65;
}

ulong nqueen(int n)
{
    ulong cols = 0;
    return solve(true, cols);
}

static assert(nqueen(2) == 65);

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

struct Foo5258 { int x; }
void bar5258(int n, ref Foo5258 fong)
{
    if (n)
        bar5258(n - 1, fong);
    else
        fong.x++;
}
int bug5258()
{
    Foo5258 foo5258 = Foo5258();
    bar5258(1, foo5258);
    return 45;
}
static assert(bug5258() == 45);

struct Foo5258b { int[2] r; }
void baqopY(int n, ref int[2] fongo)
{
    if (n)
        baqopY(n - 1, fongo);
    else
        fongo[0]++;
}
int bug5258b()
{
    Foo5258b qq;
    baqopY(1, qq.r);
    return 618;
}
static assert(bug5258b() == 618);

// Notice that this case involving reassigning the dynamic array
struct Foo5258c { int[] r; }
void baqop(int n, ref int[] fongo)
{
    if (n)
        baqop(n - 1, fongo);
    else
    {
        fongo = new int[20];
        fongo[0]++;
    }
}
size_t bug5258c()
{
    Foo5258c qq;
    qq.r = new int[30];
    baqop(1, qq.r);
    return qq.r.length;
}
static assert(bug5258c() == 20);

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

struct Bug6049
{
    int m;
    this(int x) {  m = x; }
    invariant() { }
}

const Bug6049[] foo6049 = [Bug6049(6),  Bug6049(17)];

static assert(foo6049[0].m == 6);

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

struct Bug6052
{
    int a;
}

bool bug6052()
{
    Bug6052[2] arr;
    for (int i = 0; i < 2; ++ i)
    {
        Bug6052 el = {i};
        Bug6052 ek = el;
        arr[i] = el;
        el.a = i + 2;
        assert(ek.a == i);      // ok
        assert(arr[i].a == i);  // fail
    }
    assert(arr[1].a == 1);  // ok
    assert(arr[0].a == 0);  // fail
    return true;
}

static assert(bug6052());

bool bug6052b()
{
    int[][1] arr;
    int[1] z = [7];
    arr[0] = z;
    assert(arr[0][0] == 7);
    arr[0] = z;
    z[0] = 3;
    assert(arr[0][0] == 3);
    return true;
}

static assert(bug6052b());

struct Bug6052c
{
    int x;
    this(int a) { x = a; }
}

int bug6052c()
{
    Bug6052c[] pieces = [];
    for (int c = 0; c < 2; ++ c)
        pieces ~= Bug6052c(c);
    assert(pieces[1].x == 1);
    assert(pieces[0].x == 0);
    return 1;
}
static assert(bug6052c() == 1);
static assert(bug6052c() == 1);


static assert({
    Bug6052c[] pieces = [];
    pieces.length = 2;
    int c = 0;
    pieces[0] = Bug6052c(c);
    ++c;
    pieces[1] = Bug6052c(c);
    assert(pieces[0].x == 0);
    return true;
}());

static assert({
    int[1][] pieces = [];
    pieces.length = 2;
    for (int c = 0; c < 2; ++ c)
        pieces[c][0] = c;
    assert(pieces[1][0] == 1);
    assert(pieces[0][0] == 0);
    return true;
}());

static assert({
    Bug6052c[] pieces = [];
    for (int c = 0; c < 2; ++ c)
        pieces ~= Bug6052c(c);
    assert(pieces[1].x == 1);
    assert(pieces[0].x == 0);
    return true;
}());

static assert({
    int[1] z = 7;
    int[1][] pieces = [z,z];
    pieces[1][0]=3;
    assert(pieces[0][0] == 7);
    pieces = pieces ~ [z,z];
    pieces[3][0] = 16;
    assert(pieces[2][0] == 7);
    pieces = [z,z] ~ pieces;
    pieces[5][0] = 16;
    assert(pieces[4][0] == 7);
    return true;
}());

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

struct CtState
{
    string code;
}

CtState bug6749()
{
    CtState[] pieces;
    CtState r = CtState("correct");
    pieces ~= r;
    r = CtState("clobbered");
    return pieces[0];
}
static assert(bug6749().code == "correct");

/**************************************************
    Index + slice assign to function returns
**************************************************/

int[] funcRetArr(int[] a)
{
    return a;
}

int testFuncRetAssign()
{
    int[] x = new int[20];
    funcRetArr(x)[2] = 4;
    assert(x[2] == 4);
    funcRetArr(x)[] = 27;
    assert(x[15] == 27);
    return 5;
}
static assert(testFuncRetAssign() == 5);

int keyAssign()
{
    int[int] pieces;
    pieces[3] = 1;
    pieces.keys[0] = 4;
    pieces.values[0] = 27;
    assert(pieces[3] == 1);
    return 5;
}
static assert(keyAssign() == 5);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6054
// AA literals

enum x6054 = {
    auto p = {
        int[string] pieces;
        pieces[['a'].idup] = 1;
        return pieces;
    }();
    return p;
}();

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

enum bug6077 = {
    string s;
    string t;
    return s ~ t;
}();

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6078
// Pass null array by ref

struct Foo6078
{
    int[] bar;
}

static assert({
    Foo6078 f;
    int i;
    foreach (ref e; f.bar)
    {
        i += e;
    }
    return i;
}() == 0);

int bug6078(ref int[] z)
{
    int[] q = z;
    return 2;
}

static assert({
    Foo6078 f;
    return bug6078(f.bar);
}() == 2);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6079
// Array bounds checking

static assert(!is(typeof(compiles!({
    int[] x = [1, 2, 3, 4];
    x[4] = 1;
    return true;
}()
))));

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

struct S6100
{
    int a;
}

S6100 init6100(int x)
{
    S6100 s = S6100(x);
    return s;
}

static const S6100[2] s6100a = [init6100(1), init6100(2)];
static assert(s6100a[0].a == 1);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=4825
// failed with -inline

int a4825()
{
    int r;
    return r;
}

int b4825()
{
    return a4825();
}

void c4825()
{
    void d()
    {
        auto e = b4825();
    }
    static const int f = b4825();
}

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=5708
// failed with -inline

string b5708(string s) { return s; }
string a5708(string s) { return b5708(s); }

void bug5708()
{
    void m() { a5708("lit"); }
    static assert(a5708("foo") == "foo");
    static assert(a5708("bar") == "bar");
}

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6120
// failed with -inline

struct Bug6120(T)
{
    this(int x) { }
}
static assert({
    auto s = Bug6120!int(0);
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6123
// failed with -inline

struct Bug6123(T)
{
    void f() {}
    // can also trigger if the struct is normal but f is template
}
static assert({
    auto piece = Bug6123!int();
    piece.f();
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6053
// ICE involving pointers

static assert({
    int* a = null;
    assert(a is null);
    assert(a == null);
    return true;
}());

static assert({
    int b;
    int* a = &b;
    assert(a !is null);
    *a = 7;
    assert(b == 7);
    assert(*a == 7);
    return true;
}());

int dontbreak6053()
{
    auto q = &dontbreak6053;
    void caz() {}
    auto tr = &caz;
    return 5;
}
static assert(dontbreak6053());

static assert({
    int a;
    *(&a) = 15;
    assert(a == 15);
    assert(*(&a) == 15);
    return true;
}());

static assert({
    int a = 5, b = 6, c = 2;
    assert(*(c ? &a : &b) == 5);
    assert(*(!c ? &a : &b) == 6);
    return true;
}());

static assert({
    int a, b, c;
    (c ? a : b) = 1;
    return true;
}());

static assert({
    int a, b, c = 1;
    int* p = &a;
    (c ? *p : b) = 51;
    assert(a == 51);
    return true;
}());

/**************************************************
  Pointer arithmetic, dereference, and comparison
**************************************************/

// dereference null pointer
static assert(!is(typeof(compiles!({
    int a, b, c = 1;
    int* p;
    (c ? *p : b) = 51;
    return 6;
}()
))));
static assert(!is(typeof(compiles!({
    int* a = null;
    assert(*a != 6);
    return 72;
}()
))));

// cannot <, > compare pointers to different arrays
static assert(!is(typeof(compiles!({
    int[5] a, b;
    bool c = (&a[0] > &b[0]);
    return 72;
}()
))));

// can ==, is, !is, != compare pointers for different arrays
static assert({
    int[5] a;
    int[5] b;
    assert(!(&a[0] == &b[0]));
    assert(&a[0] != &b[0]);
    assert(!(&a[0] is &b[0]));
    assert(&a[0] !is &b[0]);
    return 72;
}());

static assert({
    int[5] a;
    a[0] = 25;
    a[1] = 5;
    int* b = &a[1];
    assert(*b == 5);
    *b = 34;
    int c = *b;
    *b += 6;
    assert(b == &a[1]);
    assert(b != &a[0]);
    assert(&a[0] < &a[1]);
    assert(&a[0] <= &a[1]);
    assert(!(&a[0] >= &a[1]));
    assert(&a[4] > &a[0]);
    assert(c == 34);
    assert(*b == 40);
    assert(a[1] == 40);
    return true;
}());

static assert({
    int[12] x;
    int* p = &x[10];
    int* q = &x[4];
    return p - q;
}() == 6);

static assert({
    int[12] x;
    int* p = &x[10];
    int* q = &x[4];
    q = p;
    assert(p == q);
    q = &x[4];
    assert(p != q);
    q = q + 6;
    assert(q is p);
    return 6;
}() == 6);

static assert({
    int[12] x;
    int[] y = x[2 .. 8];
    int* p = &y[4];
    int* q = &x[6];
    assert(p == q);
    p = &y[5];
    assert(p > q);
    p = p + 5; // OK, as long as we don't dereference
    assert(p > q);
    return 6;
}() == 6);

static assert({
    char[12] x;
    const(char)* p = "abcdef";
    const (char)* q = p;
    q = q + 2;
    assert(*q == 'c');
    assert(q > p);
    assert(q - p == 2);
    assert(p - q == -2);
    q = &x[7];
    p = &x[1];
    assert(q>p);
    return 6;
}() == 6);

// Relations involving null pointers
bool nullptrcmp()
{
    // null tests
    void* null1 = null, null2 = null;
    int x = 2;
    void* p = &x;
    assert(null1 == null2);
    assert(null1 is null2);
    assert(null1 <= null2);
    assert(null1 >= null2);
    assert(!(null1 > null2));
    assert(!(null2 > null1));
    assert(null1 != p);
    assert(null1 !is p);
    assert(p != null1);
    assert(p !is null1);
    assert(null1 <= p);
    assert(p >= null2);
    assert(p > null1);
    assert(!(null1 > p));
    return true;
}
static assert(nullptrcmp());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10840
// null pointer in dotvar

struct Data10840
{
    bool xxx;
}

struct Bug10840
{
    Data10840* _data;
}

bool bug10840(int n)
{
    Bug10840 stack;
    if (n == 1)
    {
        // detect deref through null pointer
        return stack._data.xxx;
    }
    // Wrong-code for ?:
    return stack._data ? false : true;
}

static assert(bug10840(0));
static assert(!is(typeof(Compileable!(bug10840(1)))));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=8216
// ptr inside a pointer range

// Four-pointer relations. Return true if [p1 .. p2] points inside [q1 .. q2]
// (where the end points don't coincide).
bool ptr4cmp(void* p1, void* p2, void* q1, void* q2)
{
// Each compare can be written with <, <=, >, or >=.
// Either && or || can be used, giving 32 permutations.
// Additionally each compare can be negated with !, yielding 128 in total.
    bool b1 = (p1 > q1 && p2 <= q2);
    bool b2 = (p1 > q1 && p2 < q2);
    bool b3 = (p1 >= q1 && p2 <= q2);
    bool b4 = (p1 >= q1 && p2 < q2);

    bool b5 = (q1 <= p1 && q2 > p2);
    bool b6 = (q1 <= p1 && q2 >= p2);
    bool b7 = (p2 <= q2 && p1 > q1);
    bool b8 = (!(p1 <= q1) && p2 <= q2);
    bool b9 = (!(p1 <= q1) && !(p2 > q2));
    bool b10 = (!!!(p1 <= q1) && !(p2 > q2));

    assert(b1 == b2 && b1 == b3 && b1 == b4 && b1 == b5 && b1 == b6);
    assert(b1 == b7 && b1 == b8 && b1 == b9 && b1 == b10);

    bool c1 = (p1 <= q1 || p2 > q2);
    assert(c1 == !b1);
    bool c2 = (p1 < q1 || p2 >= q2);
    bool c3 = (!(q1 <= p1) || !(q2 >= p2));
    assert(c1 == c2 && c1 == c3);
    return b1;
}

bool bug8216()
{
    int[4] a;
    int[13] b;
    int v;
    int* p = &v;
    assert(!ptr4cmp(&a[0], &a[3], p, p));
    assert(!ptr4cmp(&b[2], &b[9], &a[1], &a[2]));
    assert(!ptr4cmp(&b[1], &b[9], &b[2], &b[8]));
    assert( ptr4cmp(&b[2], &b[8], &b[1], &b[9]));
    return 1;
}
static assert(bug8216());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6517
// ptr++, ptr--

int bug6517()
{
    int[] arr = [1, 2, 3];
    auto startp = arr.ptr;
    auto endp = arr.ptr + arr.length;

    for (; startp < endp; startp++) {}
    startp = arr.ptr;
    assert(startp++ == arr.ptr);
    assert(startp != arr.ptr);
    assert(startp-- != arr.ptr);
    assert(startp == arr.ptr);

    return 84;
}
static assert(bug6517() == 84);

/**************************************************
  Out-of-bounds pointer assignment and deference
**************************************************/

int ptrDeref(int ofs, bool wantDeref)
{
    int[5] a;
    int* b = &a[0];
    b = b + ofs; // OK
    if (wantDeref)
        return *b; // out of bounds
    return 72;
}

static assert(!is(typeof(compiles!(ptrDeref(-1, true)))));
static assert( is(typeof(compiles!(ptrDeref(4, true)))));
static assert( is(typeof(compiles!(ptrDeref(5, false)))));
static assert(!is(typeof(compiles!(ptrDeref(5, true)))));
static assert(!is(typeof(compiles!(ptrDeref(6, false)))));
static assert(!is(typeof(compiles!(ptrDeref(6, true)))));

/**************************************************
  Pointer +=
**************************************************/
static assert({
    int[12] x;
    int zzz;
    assert(&zzz);
    int* p = &x[10];
    int* q = &x[4];
    q = p;
    assert(p == q);
    q = &x[4];
    assert(p != q);
    q += 4;
    assert(q == &x[8]);
    q = q - 2;
    q = q + 4;
    assert(q is p);
    return 6;
}() == 6);

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

const(char)[] passthrough(const(char)[] x)
{
    return x;
}

ptrdiff_t checkPass(Char1)(const(Char1)[] s)
{
    const(Char1)[] balance = s[1 .. $];
    return passthrough(balance).ptr - s.ptr;
}
static assert(checkPass("foobar") == 1);

/**************************************************
  Pointers must not escape from CTFE
**************************************************/

struct Toq
{
    char* m;
}

Toq ptrRet(bool b)
{
    char[] x = "abc".dup;
    return Toq(b ? x[0 .. 1].ptr : null);
}

static assert(is(typeof(compiles!({
    enum Toq boz = ptrRet(false); // OK - ptr is null
    Toq z = ptrRet(true); // OK -- ptr doesn't escape
    return 4;
}()
))));

static assert(!is(typeof(compiles!({
    enum Toq boz = ptrRet(true); // fail - ptr escapes
    return 4;
}()
))));

/**************************************************
    Pointers to struct members
**************************************************/

struct Qoz
{
    int w;
    int[3] yof;
}

static assert({
    int[3] gaz;
    gaz[2] = 3156;
    Toq z = ptrRet(true);
    auto p = z.m;
    assert(*z.m == 'a');
    assert(*p == 'a');
    auto q = &z.m;
    assert(*q == p);
    assert(**q == 'a');
    Qoz g = Qoz(2, [5, 6, 7]);
    auto r = &g.w;
    assert(*r == 2);
    r = &g.yof[1];
    assert(*r == 6);
    g.yof[0] = 15;
    ++r;
    assert(*r == 7);
    r -= 2;
    assert(*r == 15);
    r = &gaz[0];
    r += 2;
    assert(*r == 3156);
    return *p;
}() == 'a');

struct AList
{
    AList* next;
    int value;
    static AList* newList()
    {
        AList[] z = new AList[1];
        return &z[0];
    }
    static AList* make(int i, int j)
    {
        auto r = newList();
        r.next = (new AList[1]).ptr;
        r.value = 1;
        AList* z = r.next;
        (*z).value = 2;
        r.next.value = j;
        assert(r.value == 1);
        assert(r.next.value == 2);
        r.next.next = &(new AList[1])[0];
        assert(r.next.next != null);
        assert(r.next.next);
        r.next.next.value = 3;
        assert(r.next.next.value == 3);
        r.next.next = newList();
        r.next.next.value = 9;
        return r;
    }
    static int checkList()
    {
        auto r = make(1,2);
        assert(r.value == 1);
        assert(r.next.value == 2);
        assert(r.next.next.value == 9);
        return 2;
    }
}

static assert(AList.checkList() == 2);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7194
// pointers as struct members

struct S7194 { int* p, p2; }

int f7194()
{
    assert(S7194().p == null);
    assert(!S7194().p);
    assert(S7194().p == S7194().p2);
    S7194 s = S7194();
    assert(!s.p);
    assert(s.p == null);
    assert(s.p == s.p2);
    int x;
    s.p = &x;
    s.p2 = s.p;
    assert(s.p == &x);
    return 0;
}

int g7194()
{
    auto s = S7194();
    assert(s.p);  // should fail
    return 0;
}

static assert(f7194() == 0);
static assert(!is(typeof(compiles!(g7194()))));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7248
// recursive struct pointers in array

struct S7248 { S7248* ptr; }

bool bug7248()
{
    S7248[2] sarr;
    sarr[0].ptr = &sarr[1];
    sarr[0].ptr = null;
    S7248* t = sarr[0].ptr;
    return true;
}
static assert(bug7248());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7216
// calling a struct pointer member

struct S7216
{
    S7216* p;
    int t;

    void f() { }
    void g() { ++t; }
}

bool bug7216()
{
    S7216 s0, s1;
    s1.t = 6;
    s0.p = &s1;
    s0.p.f();
    s0.p.g();
    assert(s1.t == 7);
    return true;
}

static assert(bug7216());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10858
// Wrong code with array of pointers

bool bug10858()
{
    int*[4] x;
    x[0] = null;
    assert(x[0] == null);
    return true;
}
static assert(bug10858());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12528
// painting inout type for value type literals

inout(T)[] dup12528(T)(inout(T)[] a)
{
    inout(T)[] res;
    foreach (ref e; a)
        res ~= e;
    return res;
}

enum arr12528V1 = dup12528([0]);
enum arr12528V2 = dup12528([0, 1]);
static assert(arr12528V1 == [0]);
static assert(arr12528V2 == [0, 1]);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=9745
// Allow pointers to static variables

shared int x9745;
shared int[5] y9745;

shared(int)* bug9745(int m)
{
    auto k = &x9745;
    auto j = &x9745;
    auto p = &y9745[0];
    auto q = &y9745[3];
    assert(j - k == 0);
    assert(j == k);
    assert(q - p == 3);
    --q;
    int a = 0;
    assert(p + 2 == q);
    if (m == 7)
    {
        auto z1 = y9745[0 .. 2]; // slice global pointer
    }
    if (m == 8)
        p[1] = 7; // modify through a pointer
    if (m == 9)
         a = p[1]; // read from a pointer
    if (m == 0)
        return &x9745;
    return &y9745[1];
}

int test9745(int m)
{
    bug9745(m);
    // type painting
    shared int* w = bug9745(0);
    return 1;
}

shared int* w9745a = bug9745(0);
shared int* w9745b = bug9745(1);
static assert( is(typeof(compiles!(test9745(6)))));
static assert(!is(typeof(compiles!(test9745(7)))));
static assert(!is(typeof(compiles!(test9745(8)))));
static assert(!is(typeof(compiles!(test9745(9)))));

// pointers cast from an absolute address
// (mostly applies to fake pointers, eg Windows HANDLES)
bool test9745b()
{
    void* b6 = cast(void*)0xFEFEFEFE;
    void* b7 = cast(void*)0xFEFEFEFF;
    assert(b6 is b6);
    assert(b7 != b6);
    return true;
}
static assert(test9745b());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=9364
// ICE with pointer to local struct

struct S9364
{
    int i;
}

bool bug9364()
{
    S9364 s;
    auto k = (&s).i;
    return 1;
}

static assert(bug9364());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10251
// Pointers to const globals

static const int glob10251 = 7;

const(int)* bug10251()
{
   return &glob10251;
}

static a10251 = &glob10251; //  OK
static b10251 = bug10251();

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=4065
// [CTFE] AA "in" operator doesn't work

bool bug4065(string s)
{
    enum int[string] aa = ["aa":14, "bb":2];
    int* p = s in aa;
    if (s == "aa")
        assert(*p == 14);
    else if (s == "bb")
        assert(*p == 2);
    else
        assert(!p);
    int[string] zz;
    assert(!("xx" in zz));
    bool c = !p;
    return cast(bool)(s in aa);
}

static assert(!bug4065("xx"));
static assert( bug4065("aa"));
static assert( bug4065("bb"));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12689
// assigning via pointer from 'in' expression

int g12689()
{
    int[int] aa;
    aa[1] = 13;
    assert(*(1 in aa) == 13);
    *(1 in aa) = 42;
    return aa[1];
}
static assert(g12689() == 42);

/**************************************************
    Pointers in ? :
**************************************************/

static assert({
    int[2] x;
    int* p = &x[1];
    return p ? true: false;
}());

/**************************************************
    Pointer slicing
**************************************************/

int ptrSlice()
{
    auto arr = new int[5];
    int* x = &arr[0];
    int[] y = x[0 .. 5];
    x[1 .. 3] = 6;
    ++x;
    x[1 .. 3] = 14;
    assert(arr[1] == 6);
    assert(arr[2] == 14);
    //x[-1 .. 4] = 5;   // problematic because negative lower boundary will throw RangeError in runtime
    (x - 1)[0 .. 3] = 5;
    int[] z = arr[1 .. 2];
    z.length = 4;
    z[$ - 1] = 17;
    assert(arr.length == 5);
    return 2;
}
static assert(ptrSlice() == 2);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6344
// create empty slice from null pointer

static assert({
    char* c = null;
    auto m = c[0 .. 0];
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=8365
// block assignment of enum arrays

enum E8365 { first = 7, second, third, fourth }
static assert({ E8365[2]       x; return x[0];       }() == E8365.first);
static assert({ E8365[2][2]    x; return x[0][0];    }() == E8365.first);
static assert({ E8365[2][2][2] x; return x[0][0][0]; }() == E8365.first);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=4448
// labelled break + continue

int bug4448()
{
    int n = 2;
L1:
    do
    {
        switch(n)
        {
        case 5:
            return 7;
        default:
            n = 5;
            break L1;
        }
        int w = 7;
    } while (0);
    return 3;
}
static assert(bug4448() == 3);

int bug4448b()
{
    int n = 2;
L1:
    for (n = 2; n < 5; ++n)
    {
        for (int m = 1; m < 6; ++m)
        {
            if (n < 3)
            {
                assert(m == 1);
                continue L1;
            }
        }
        break;
    }
    return 3;
}
static assert(bug4448b() == 3);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6985
// Formerly, non-constant case, but switch cases with mutable cases now error
// Currently: run-time constant variable case

int bug6985(int z)
{
    const int q = z * 2 - 6;
    switch(z)
    {
    case q:
        return 87;
    default:
    }
    return q;
}
static assert(bug6985(6) == 87);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6281
// [CTFE] A null pointer '!is null' returns 'true'

static assert(!{
    auto p = null;
    return p !is null;
}());

static assert(!{
    auto p = null;
    return p != null;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6331
// evaluate SliceExp on if condition

bool bug6331(string s)
{
    if (s[0 .. 1])
        return true;
    return false;
}
static assert(bug6331("str"));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6283
// assign to AA with slice as index

static assert({
    immutable p = "pp";
    int[string] pieces = [p: 0];
    pieces["qq"] = 1;
    return true;
}());

static assert({
    immutable renames = [0: "pp"];
    int[string] pieces;
    pieces[true ? renames[0] : "qq"] = 1;
    pieces["anything"] = 1;
    return true;
}());

static assert({
    immutable qq = "qq";
    string q = qq;
    int[string] pieces = ["a":1];
    pieces[q] = 0;
    string w = "ab";
    int z = pieces[w[0 .. 1]];
    assert(z == 1);
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6282
// dereference 'in' of an AA

static assert({
    int[] w = new int[4];
    w[2] = 6;
    auto c = [5: w];
    auto kk  = (*(5 in c))[2];
    (*(5 in c))[2] = 8;
    (*(5 in c))[1 .. $ - 2] = 4;
    auto a = [4:"1"];
    auto n = *(4 in a);
    return n;
}() == "1");

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6337
// member function call on struct literal

struct Bug6337
{
    int k;
    void six()
    {
        k = 6;
    }
    int ctfe()
    {
        six();
        return k;
    }
}
static assert(Bug6337().ctfe() == 6);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6603
// call manifest function pointer

int f6603(int a) { return a + 5; }
enum bug6603 = &f6603;
static assert(bug6603(6) == 11);

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

struct D6375
{
    int[] arr;
}
A6375 a6375(int[] array)
{
    return A6375(array);
}
struct A6375
{
    D6375* _data;
    this(int[] arr)
    {
        _data = new D6375;
        _data.arr = arr;
    }
    int[] data()
    {
        return _data.arr;
    }
}
static assert({
    int[] a = [1, 2];
    auto app2 = a6375(a);
    auto data = app2.data();
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6280
// Converting pointers to bool

static assert({
    if ((0 in [0:0])) {}
    if ((0 in [0:0]) && (0 in [0:0])) {}
    return true;
}());

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

struct Bug6276
{
    int[] i;
}
static assert({
    Bug6276 foo;
    foo.i ~= 1;
    foo.i ~= 2;
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6374
// ptr[n] = x, x = ptr[n]

static assert({
    int[] arr = [1];
    arr.ptr[0] = 2;
    auto k = arr.ptr[0];
    assert(k == 2);
    return arr[0];
}() == 2);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6306
// recursion and local variables

void recurse6306()
{
    bug6306(false);
}

bool bug6306(bool b)
{
    int x = 0;
    if (b)
        recurse6306();
    assert(x == 0);
    x = 1;
    return true;
}
static assert(bug6306(true));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6386
// ICE on unsafe pointer cast

static assert(!is(typeof(compiles!({
    int x = 123;
    int* p = &x;
    float z;
    float* q = cast(float*)p;
    return true;
}()
))));

static assert({
    int[] x = [123, 456];
    int* p = &x[0];
    auto m = cast(const(int)*)p;
    auto q = p;
    return *q;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6420
// ICE on dereference of invalid pointer

static assert({
    // Should compile, but pointer can't be dereferenced
    int x = 123;
    int* p = cast(int*)x;
    auto q = cast(char*)x;
    auto r = cast(char*)323;
    // Valid const-changing cast
    const float *m = cast(immutable float*)[1.2f,2.4f,3f];
    return true;
}()
);

static assert(!is(typeof(compiles!({
    int x = 123;
    int* p = cast(int*)x;
    int a = *p;
    return true;
}()
))));

static assert(!is(typeof(compiles!({
    int* p = cast(int*)123;
    int a = *p;
    return true;
}()
))));

static assert(!is(typeof(compiles!({
    auto k = cast(int*)45;
    *k = 1;
    return true;
}()
))));

static assert(!is(typeof(compiles!({
    *cast(float*)"a" = 4.0;
    return true;
}()
))));

static assert(!is(typeof(compiles!({
    float f = 2.8;
    long *p = &f;
    return true;
}()
))));

static assert(!is(typeof(compiles!({
    long *p = cast(long*)[1.2f, 2.4f, 3f];
    return true;
}()
))));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6250
// deref pointers to array

int[]* simple6250(int[]* x) { return x; }

void swap6250(int[]* lhs, int[]* rhs)
{
    int[] kk = *lhs;
    assert(simple6250(lhs) == lhs);
    lhs = simple6250(lhs);
    assert(kk[0] == 18);
    assert((*lhs)[0] == 18);
    assert((*rhs)[0] == 19);
    *lhs = *rhs;
    assert((*lhs)[0] == 19);
    *rhs = kk;
    assert(*rhs == kk);
    assert(kk[0] == 18);
    assert((*rhs)[0] == 18);
}

int ctfeSort6250()
{
     int[][2] x;
     int[3] a = [17, 18, 19];
     x[0] = a[1 .. 2];
     x[1] = a[2 .. $];
     assert(x[0][0] == 18);
     assert(x[0][1] == 19);
     swap6250(&x[0], &x[1]);
     assert(x[0][0] == 19);
     assert(x[1][0] == 18);
     a[1] = 57;
     assert(x[0][0] == 19);
     return x[1][0];
}

static assert(ctfeSort6250() == 57);

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

long[]* simple6250b(long[]* x) { return x; }

void swap6250b(long[]* lhs, long[]* rhs)
{
    long[] kk = *lhs;
    assert(simple6250b(lhs) == lhs);
    lhs = simple6250b(lhs);
    assert(kk[0] == 18);
    assert((*lhs)[0] == 18);
    assert((*rhs)[0] == 19);
    *lhs = *rhs;
    assert((*lhs)[0] == 19);
    *rhs = kk;
    assert(*rhs == kk);
    assert(kk[0] == 18);
    assert((*rhs)[0] == 18);
}

long ctfeSort6250b()
{
     long[][2] x;
     long[3] a = [17, 18, 19];
     x[0] = a[1 .. 2];
     x[1] = a[2 .. $];
     assert(x[0][0] == 18);
     assert(x[0][1] == 19);
     swap6250b(&x[0], &x[1]);
     assert(x[0][0] == 19);
     assert(x[1][0] == 18);
     a[1] = 57;
     assert(x[0][0] == 19);
     return x[1][0];
}

static assert(ctfeSort6250b() == 57);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6672
// circular references in array

void bug6672(ref string lhs, ref string rhs)
{
    auto tmp = lhs;
    lhs = rhs;
    rhs = tmp;
}

static assert({
    auto kw = ["a"];
    bug6672(kw[0], kw[0]);
    return true;
}());

void slice6672(ref string[2] agg, ref string lhs)
{
    agg[0 .. $] = lhs;
}

static assert({
    string[2] kw = ["a", "b"];
    slice6672(kw, kw[0]);
    assert(kw[0] == "a");
    assert(kw[1] == "a");
    return true;
}());

// an unrelated rejects-valid bug
static assert({
    string[2] kw = ["a", "b"];
    kw[0 .. 2] = "x";
    return true;
}());

void bug6672b(ref string lhs, ref string rhs)
{
    auto tmp = lhs;
    assert(tmp == "a");
    lhs = rhs;
    assert(tmp == "a");
    rhs = tmp;
}

static assert({
    auto kw=["a", "b"];
    bug6672b(kw[0], kw[1]);
    assert(kw[0] == "b");
    assert(kw[1] == "a");
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6399
// (*p).length = n

struct A6399
{
    int[] arr;
    int subLen()
    {
        arr = [1, 2, 3, 4, 5];
        arr.length -= 1;
        return cast(int)arr.length;
    }
}

static assert({
    A6399 a;
    return a.subLen();
}() == 4);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7789
// (*p).length++ where *p is null

struct S7789
{
    size_t foo()
    {
        _ary.length += 1;
        return _ary.length;
    }

    int[] _ary;
}

static assert(S7789().foo());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6418
// member named 'length'

struct Bug6418
{
    size_t length() { return 189; }
}
static assert(Bug6418.init.length == 189);

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

bool bug4021()
{
    int[int] aa = [1: 1];
    aa.rehash;
    return true;
}
static assert(bug4021());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=11629
// crash on AA.rehash

struct Base11629
{
    alias T = ubyte, Char = char;
    alias String = immutable(Char)[];

    const Char[T] toChar;

    this(int _dummy)
    {
        Char[T] toCharTmp = [0:'A'];

        toChar = toCharTmp.rehash;
    }
}
enum ct11629 = Base11629(4);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=3512
// foreach (dchar; string)
// https://issues.dlang.org/show_bug.cgi?id=6558
// foreach (int, dchar; string)

bool test3512()
{
    string s = "öhai";
    int q = 0;

    foreach (wchar c; s)
    {
        if (q == 2)
            assert(c == 'a');
        ++q;
    }
    assert(q == 4);

    // _aApplycd1
    foreach (dchar c; s)
    {
        ++q;
        if (c == 'h')
            break;
    }
    assert(q == 6);

    // _aApplycw2
    foreach (ptrdiff_t i, wchar c; s)
    {
        assert(i >= 0 && i < s.length);
    }

    // _aApplycd2
    foreach (ptrdiff_t i, dchar c; s)
    {
        assert(i >= 0 && i < s.length);
    }

    wstring w = "xüm";

    // _aApplywc1
    foreach (char c; w)
    {
        ++q;
    }
    assert(q == 10);

    // _aApplywd1
    foreach (dchar c; w)
    {
        ++q;
    }
    assert(q == 13);

    // _aApplywc2
    foreach (ptrdiff_t i, char c; w)
    {
        assert(i >= 0 && i < w.length);
    }

    // _aApplywd2
    foreach (ptrdiff_t i, dchar c; w)
    {
        assert(i >= 0 && i < w.length);
    }

    dstring d = "yäq";

    // _aApplydc1
    q = 0;
    foreach (char c; d)
    {
        ++q;
    }
    assert(q == 4);

    // _aApplydw1
    q = 0;
    foreach (wchar c; d)
    {
        ++q;
    }
    assert(q == 3);

    // _aApplydc2
    foreach (ptrdiff_t i, char c; d)
    {
        assert(i >= 0 && i < d.length);
    }
    // _aApplydw2
    foreach (ptrdiff_t i, wchar c; d)
    {
        assert(i >= 0 && i < d.length);
    }

    dchar[] dr = "squop"d.dup;

    foreach (ptrdiff_t n, char c; dr)
    {
        if (n == 2)
            break;
        assert(c != 'o');
    }

    // _aApplyRdc1
    foreach_reverse (char c; dr)
    {}

    // _aApplyRdw1
    foreach_reverse (wchar c; dr)
    {}

    // _aApplyRdc2
    foreach_reverse (ptrdiff_t n, char c; dr)
    {
        if (n == 4)
            break;
        assert(c != 'o');
    }

    // _aApplyRdw2
    foreach_reverse (ptrdiff_t i, wchar c; dr)
    {
        assert(i >= 0 && i < dr.length);
    }

    q = 0;
    wstring w2 = ['x', 'ü', 'm']; // foreach over array literals
    foreach_reverse (ptrdiff_t n, char c; w2)
    {
        ++q;
        if (c == 'm') assert(n == 2 && q == 1);
        if (c == 'x') assert(n == 0 && q == 4);
    }
    return true;
}
static assert(test3512());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6510
// ICE only with -inline

struct Stack6510
{
    struct Proxy
    {
        void shrink() {}
    }
    Proxy stack;
    void pop()
    {
        stack.shrink();
    }
}

int bug6510()
{
    static int used()
    {
        Stack6510 junk;
        junk.pop();
        return 3;
    }
    return used();
}

void test6510()
{
    static assert(bug6510() == 3);
}

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6511
// arr[] shouldn't make a copy

T bug6511(T)()
{
    T[1] a = [1];
    a[] += a[];
    return a[0];
}
static assert(bug6511!ulong() == 2);
static assert(bug6511!long() == 2);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6512
// new T[][]

bool bug6512(int m)
{
    auto x = new int[2][][](m, 5);
    assert(x.length == m);
    assert(x[0].length == 5);
    assert(x[0][0].length == 2);
    foreach (i; 0.. m)
        foreach (j; 0 .. 5)
            foreach (k; 0 .. 2)
                x[i][j][k] = k + j*10 + i*100;
    foreach (i; 0.. m)
        foreach (j; 0 .. 5)
            foreach (k; 0 .. 2)
                assert(x[i][j][k] == k + j*10 + i*100);
    return true;
}
static assert(bug6512(3));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6516
// ICE(constfold.c)

dstring bug6516()
{
    return cast(dstring)new dchar[](0);
}

static assert(bug6516() == ""d);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6727
// ICE(interpret.c)

const(char)* ice6727(const(char)* z) { return z; }
static assert({
    auto q = ice6727("a".dup.ptr);
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6721
// Cannot get pointer to start of char[]

static assert({
    char[] c1 = "".dup;
    auto p = c1.ptr;
    string c2 = "";
    auto p2 = c2.ptr;
    return 6;
}() == 6);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6693
// Assign to null AA

struct S6693
{
    int[int] m;
}

static assert({
    int[int][int] aaa;
    aaa[3][1] = 4;
    int[int][3] aab;
    aab[2][1] = 4;
    S6693 s;
    s.m[2] = 4;
    return 6693;
}() == 6693);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7602
// Segfault AA.keys on null AA

string[] test7602()
{
    int[string] array;
    return array.keys;
}

enum bug7602 = test7602();

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6739
// Nested AA assignment

static assert({
    int[int][int][int] aaa;
    aaa[3][1][6] = 14;
    return aaa[3][1][6];
}() == 14);

static assert({
    int[int][int] aaa;
    aaa[3][1] = 4;
    aaa[3][3] = 3;
    aaa[1][5] = 9;
    auto kk = aaa[1][5];
    return kk;
}() == 9);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6751
// ref AA assignment

void bug6751(ref int[int] aa)
{
    aa[1] = 2;
}

static assert({
    int[int] aa;
    bug6751(aa);
    assert(aa[1] == 2);
    return true;
}());

void bug6751b(ref int[int][int] aa)
{
    aa[1][17] = 2;
}

struct S6751
{
    int[int][int] aa;
    int[int] bb;
}

static assert({
    S6751 s;
    bug6751b(s.aa);
    assert(s.aa[1][17] == 2);
    return true;
}());

static assert({
    S6751 s;
    s.aa[7][56] = 57;
    bug6751b(s.aa);
    assert(s.aa[1][17] == 2);
    assert(s.aa[7][56] == 57);
    bug6751c(s.aa);
    assert(s.aa.keys.length == 1);
    assert(s.aa.values.length == 1);
    return true;
}());

static assert({
    S6751 s;
    s.bb[19] = 97;
    bug6751(s.bb);
    assert(s.bb[1] == 2);
    assert(s.bb[19] == 97);
    return true;
}());

void bug6751c(ref int[int][int] aa)
{
    aa = [38: [56 : 77]];
}

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7790
// AA foreach ref

struct S7790
{
    size_t id;
}

size_t bug7790(S7790[string] tree)
{
    foreach (k, ref v; tree)
        v.id = 1;
    return tree["a"].id;
}

static assert(bug7790(["a":S7790(0)]) == 1);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6765
// null AA.length

static assert({
    int[int] w;
    return w.length;
}() == 0);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6769
// AA.keys, AA.values with -inline

static assert({
    double[char[3]] w = ["abc" : 2.3];
    double[] z = w.values;
    return w.keys.length;
}() == 1);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=4022
// AA.get

static assert({
    int[int] aa = [58: 13];
    int r = aa.get(58, 1000);
    assert(r == 13);
    r = aa.get(59, 1000);
    return r;
}() == 1000);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6775
// AA.opApply

static assert({
    int[int] aa = [58: 17, 45:6];
    int valsum = 0;
    int keysum = 0;
    foreach (m; aa)  // aaApply
    {
        valsum += m;
    }
    assert(valsum == 17 + 6);
    valsum = 0;
    foreach (n, m; aa)  // aaApply2
    {
        valsum += m;
        keysum += n;
    }
    assert(valsum == 17 + 6);
    assert(keysum == 58 + 45);
    // Check empty AA
    valsum = 0;
    int[int] bb;
    foreach (m; bb)
    {
        ++valsum;
    }
    assert(valsum == 0);
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7890
// segfault struct with AA field

struct S7890
{
    int[int] tab;
}

S7890 bug7890()
{
    S7890 foo;
    foo.tab[0] = 0;
    return foo;
}

enum e7890 = bug7890();

/**************************************************
    AA.remove
**************************************************/

static assert({
    int[int] aa = [58: 17, 45:6];
    aa.remove(45);
    assert(aa.length == 1);
    aa.remove(7);
    assert(aa.length == 1);
    aa.remove(58);
    assert(aa.length == 0);
    return true;
}());

/**************************************************
    try, finally
**************************************************/

static assert({
    int n = 0;

    try
    {
        n = 1;
    }
    catch (Exception e)
    {}
    assert(n == 1);

    try
    {
        n = 2;
    }
    catch (Exception e)
    {}
    finally
    {
        assert(n == 2);
        n = 3;
    }
    assert(n == 3);
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6800
// bad pointer casts

bool badpointer(int k)
{
    int m = 6;
    int* w =  &m;
    assert(*w == 6);
    int[3] a = [17, 2, 21];
    int* w2 = &a[2];
    assert(*w2 == 21);

    // cast int* to uint* is OK
    uint* u1 = cast(uint*)w;
    assert(*u1 == 6);
    uint* u2 = cast(uint*)w2;
    assert(*u2 == 21);
    uint* u3 = cast(uint*)&m;
    assert(*u3 == 6);
    // cast int* to void* is OK
    void* v1 = cast(void*)w;
    void* v3 = &m;
    void* v4 = &a[0];
    // cast from void* back to int* is OK
    int* t3 = cast(int*)v3;
    assert(*t3 == 6);
    int* t4 = cast(int*)v4;
    assert(*t4 == 17);
    // cast from void* to uint* is OK
    uint* t1 = cast(uint*)v1;
    assert(*t1 == 6);
    // and check that they're real pointers
    m = 18;
    assert(*t1 == 18);
    assert(*u3 == 18);

    int** p = &w;

    if (k == 1) // bad reinterpret
        double *d1 = cast(double*)w;
    if (k == 3) // bad reinterpret
        char* d3 = cast(char*)w2;
    if (k == 4) {
        void* q1 = cast(void*)p;    // OK-void is int*
        void* *q = cast(void**)p;   // OK-void is int
    }
    if (k == 5)
        void*** q = cast(void***)p;  // bad: too many *
    if (k == 6) // bad reinterpret through void*
        double* d1 = cast(double*)v1;
    if (k == 7)
        double* d7 = cast(double*)v4;
    if (k == 8)
        ++v4; // can't do pointer arithmetic on void*
    return true;
}
static assert(badpointer(4));
static assert(!is(typeof(compiles!(badpointer(1)))));
static assert( is(typeof(compiles!(badpointer(2)))));
static assert(!is(typeof(compiles!(badpointer(3)))));
static assert( is(typeof(compiles!(badpointer(4)))));
static assert(!is(typeof(compiles!(badpointer(5)))));
static assert(!is(typeof(compiles!(badpointer(6)))));
static assert(!is(typeof(compiles!(badpointer(7)))));
static assert(!is(typeof(compiles!(badpointer(8)))));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10211
// Allow casts S**->D**, when S*->D* is OK

int bug10211()
{
    int m = 7;
    int* x = &m;
    int** y = &x;
    assert(**y == 7);
    uint* p = cast(uint*)x;
    uint** q = cast(uint**)y;
    return 1;
}

static assert(bug10211());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10568
// CTFE rejects function pointer safety casts

@safe void safetyDance() {}

int isItSafeToDance()
{
    void function() @trusted yourfriends = &safetyDance;
    void function() @safe nofriendsOfMine = yourfriends;
    return 1;
}

static assert(isItSafeToDance());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12296
// CTFE rejects const compatible AA pointer cast

int test12296()
{
    immutable x = [5 : 4];
    auto aa = &x;
    const(int[int])* y = aa;
    return 1;
}
static assert(test12296());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=9170
// Allow reinterpret casts float<->int

int f9170(float x)
{
    return *(cast(int*)&x);
}

float i9170(int x)
{
    return *(cast(float*)&x);
}

float u9170(uint x)
{
    return *(cast(float*)&x);
}

int f9170arr(float[] x)
{
    return *(cast(int*)&(x[1]));
}

long d9170(double x)
{
    return *(cast(long*)&x);
}

int fref9170(ref float x)
{
    return *(cast(int*)&x);
}

long dref9170(ref double x)
{
    return *(cast(long*)&x);
}

bool bug9170()
{
    float f = 1.25;
    double d = 1.25;
    assert(f9170(f) == 0x3FA0_0000);
    assert(fref9170(f) == 0x3FA0_0000);
    assert(d9170(d) == 0x3FF4_0000_0000_0000L);
    assert(dref9170(d) == 0x3FF4_0000_0000_0000L);
    float [3] farr = [0, 1.25, 0];
    assert(f9170arr(farr) == 0x3FA0_0000);
    int i = 0x3FA0_0000;
    assert(i9170(i) == 1.25);
    uint u = 0x3FA0_0000;
    assert(u9170(u) == 1.25);
    return true;
}

static assert(bug9170());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6792
// ICE with pointer cast of indexed array

struct S6792
{
    int i;
}

static assert({
    {
        void* p;
        p = [S6792(1)].ptr;
        S6792 s = *(cast(S6792*)p);
        assert(s.i == 1);
    }
    {
        void*[] ary;
        ary ~= [S6792(2)].ptr;
        S6792 s = *(cast(S6792*)ary[0]);
        assert(s.i == 2);
    }
    {
        void*[7] ary;
        ary[6]= [S6792(2)].ptr;
        S6792 s = *(cast(S6792*)ary[6]);
        assert(s.i == 2);
    }
    {
        void* p;
        p = [S6792(1)].ptr;
        void*[7] ary;
        ary[5]= p;
        S6792 s = *(cast(S6792*)ary[5]);
        assert(s.i == 1);
    }
    {
        S6792*[string] aa;
        aa["key"] = [S6792(3)].ptr;
        const(S6792) s = *(cast(const(S6792)*)aa["key"]);
        assert(s.i == 3);
    }
    {
        S6792[string] blah;
        blah["abc"] = S6792(6);
        S6792*[string] aa;
        aa["kuy"] = &blah["abc"];
        const(S6792) s = *(cast(const(S6792)*)aa["kuy"]);
        assert(s.i == 6);

        void*[7] ary;
        ary[5]= &blah["abc"];
        S6792 t = *(cast(S6792*)ary[5]);
        assert(t.i == 6);

        int q = 6;
        ary[3]= &q;
        int gg = *(cast(int*)(ary[3]));
    }
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7780
// array cast

int bug7780(int testnum)
{
    int[] y = new int[2];
    y[0] = 2000000;
    if (testnum == 1)
    {
        void[] x = y;
        return (cast(byte[])x)[1];
    }
    if (testnum == 2)
    {
        int[] x = y[0 .. 1];
        return (cast(byte[])x)[1];
    }
    return 1;
}

static assert( is(typeof(compiles!(bug7780(0)))));
static assert(!is(typeof(compiles!(bug7780(1)))));
static assert(!is(typeof(compiles!(bug7780(2)))));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=14028
// static array pointer that refers existing array elements.

int test14028a(size_t ofs)(bool ct)
{
    int[4] a;
    int[2]* p;
    int num = ofs;

    if (ct)
        p = cast(int[2]*)&a[ofs];    // SymOffExp
    else
        p = cast(int[2]*)&a[num];    // CastExp + AddrExp

    // pointers comparison
    assert(cast(void*)a.ptr <= cast(void*)p);
    assert(cast(void*)a.ptr <= cast(void*)&(*p)[0]);
    assert(cast(void*)&a[0] <= cast(void*)p);

    return 1;
}
static assert(test14028a!0(true));
static assert(test14028a!0(false));
static assert(test14028a!3(true));
static assert(test14028a!3(false));
static assert(!is(typeof(compiles!(test14028a!4(true)))));
static assert(!is(typeof(compiles!(test14028a!4(false)))));

int test14028b(int num)
{
    int[4] a;
    int[2]* p;

    if (num == 1)
    {
        p = cast(int[2]*)&a[0]; // &a[0..2];
        (*p)[0] = 1;            // a[0] = 1
        (*p)[1] = 2;            // a[1] = 2
        assert(a == [1,2,0,0]);
        p = p + 1;              // &a[0] -> &a[2]
        (*p)[0] = 3;            // a[2] = 3
        (*p)[1] = 4;            // a[3] = 4
        assert(a == [1,2,3,4]);
    }
    if (num == 2)
    {
        p = cast(int[2]*)&a[1]; // &a[1..3];
        (*p)[0] = 1;            // a[1] = 1
        p = p + 1;              // &a[1..3] -> &a[3..5]
        (*p)[0] = 2;            // a[3] = 2
        assert(a == [0,1,0,2]);
    }
    if (num == 3)
    {
        p = cast(int[2]*)&a[1]; // &a[1..3];
        (*p)[0] = 1;            // a[1] = 1
        p = p + 1;              // &a[1..3] -> &a[3..5]
        (*p)[0] = 2;            // a[3] = 2
        (*p)[1] = 3;            // a[4] = 3 (CTFE error)
    }
    if (num == 4)
    {
        p = cast(int[2]*)&a[0]; // &a[0..2];
        p = p + 1;              // &a[0..2] -> &a[2..4]
        p = p + 1;              // &a[2..4] -> &a[4..6] (ok)
    }
    if (num == 5)
    {
        p = cast(int[2]*)&a[1]; // &a[1..3];
        p = p + 2;              // &a[1..3] -> &a[5..7] (CTFE error)
    }
    return 1;
}
static assert(test14028b(1));
static assert(test14028b(2));
static assert(!is(typeof(compiles!(test14028b(3)))));
static assert(test14028b(4));
static assert(!is(typeof(compiles!(test14028b(5)))));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10275
// cast struct literals to immutable

struct Bug10275
{
    uint[] ivals;
}

Bug10275 bug10275()
{
    return Bug10275([1, 2, 3]);
}

int test10275()
{
    immutable(Bug10275) xxx = cast(immutable(Bug10275))bug10275();
    return 1;
}

static assert(test10275());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6851
// passing pointer by argument

void set6851(int* pn)
{
    *pn = 20;
}
void bug6851()
{
    int n = 0;
    auto pn = &n;
    *pn = 10;
    assert(n == 10);
    set6851(&n);
}
static assert({ bug6851(); return true; }());

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

int* bug7876(int n) @system
{
    int x;
    auto ptr = &x;
    if (n == 2)
        ptr = null;
    return ptr;
}

struct S7876
{
    int* p;
}

S7876 bug7876b(int n) @system
{
    int x;
    S7876 s;
    s.p = &x;
    if (n == 11)
        s.p = null;
    return s;
}

int test7876(int n)
{
    if (n >= 10)
    {
        S7876 m = bug7876b(n);
        return 1;
    }
    int* p = bug7876(n);
    return 1;
}

static assert( is(typeof(compiles!(test7876(2)))));
static assert(!is(typeof(compiles!(test7876(0)))));
static assert( is(typeof(compiles!(test7876(11)))));
static assert(!is(typeof(compiles!(test7876(10)))));

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

int f11824(T)()
{
    T[] arr = new T[](1);
    T* getAddr(ref T a)
    {
        return &a;
    }
    getAddr(arr[0]);
    return 1;
}
static assert(f11824!int());        // OK
static assert(f11824!(int[])());    // OK <- NG

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6817
// if converted to &&, only with -inline

static assert({
    void toggle()
    {
        bool b;
        if (b)
            b = false;
    }
    toggle();
    return true;
}());

/**************************************************
    cast to void
**************************************************/

static assert({
    cast(void)(71);
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6816
// nested function can't access this

struct S6816
{
    size_t foo()
    {
        return (){ return value +1 ; }();
    }
    size_t value;
}

enum s6816 = S6816().foo();

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7277
// ICE nestedstruct.init.tupleof

struct Foo7277
{
    int a;
    int func()
    {
        int b;
        void nested()
        {
            b = 7;
            a = 10;
        }
        nested();
        return a+b;
    }
}

static assert(Foo7277().func() == 17);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10217
// ICE. CTFE version of 9315

bool bug10217()
{
    struct S
    {
        int i;
        void bar() {}
    }
    auto yyy = S.init.tupleof[$ - 1];
    assert(!yyy);
    return 1;
}

static assert(bug10217());

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

void bug8676(int n)
{
    const int X1 = 4 + n;
    const int X2 = 4;
    int X3 = 4;
    int bar1() { return X1; }
    int bar2() { return X2; }
    int bar3() { return X3; }
    static assert(!is(typeof(compiles!(bar1()))));
    static assert( is(typeof(compiles!(bar2()))));
    static assert(!is(typeof(compiles!(bar3()))));
}

/**************************************************
    classes and interfaces
**************************************************/

interface SomeInterface
{
    int daz();
    float bar(char);
    int baz();
}

interface SomeOtherInterface
{
    int xxx();
}

class TheBase : SomeInterface, SomeOtherInterface
{
    int q = 88;
    int rad = 61;
    int a = 14;
    int somebaseclassfunc() { return 28; }
    int daz() { return 0; }
    int baz() { return 0; }
    int xxx() { return 762; }
    int foo() { return q; }
    float bar(char c) { return 3.6; }
}

class SomeClass : TheBase, SomeInterface
{
    int gab = 9;
    int fab;
    int a = 17;
    int b = 23;
    override int foo() { return gab + a; }
    override float bar(char c) { return 2.6; }
    int something() { return 0; }
    override int daz() { return 0; }
    override int baz() { return 0; }
}

class Unrelated : TheBase
{
    this(int x) { a = x; }
}

auto classtest1(int n)
{
    SomeClass c = new SomeClass;
    assert(c.a == 17);
    assert(c.q == 88);
    TheBase d = c;
    assert(d.a == 14);
    assert(d.q == 88);
    if (n == 7)
    {
        // bad cast -- should fail
        Unrelated u = cast(Unrelated)d;
        assert(u is null);
    }
    SomeClass e = cast(SomeClass)d;
    d.q = 35;
    assert(c.q == 35);
    assert(c.foo() == 9 + 17);
    ++c.a;
    assert(c.foo() == 9 + 18);
    assert(d.foo() == 9 + 18);
    d = new TheBase;
    SomeInterface fc = c;
    SomeOtherInterface ot = c;
    assert(fc.bar('x') == 2.6);
    assert(ot.xxx() == 762);
    fc = d;
    ot = d;
    assert(fc.bar('x') == 3.6);
    assert(ot.xxx() == 762);

    Unrelated u2 = new Unrelated(7);
    assert(u2.a == 7);
    return 6;
}
static assert(classtest1(1));
static assert(classtest1(2));
static assert(classtest1(7)); // https://issues.dlang.org/show_bug.cgi?id=7154

// can't initialize enum with not null class
SomeClass classtest2(int n)
{
    return n == 5 ? (new SomeClass) : null;
}
static assert( is(typeof((){ enum const(SomeClass) xx = classtest2(2);}())));
static assert(!is(typeof((){ enum const(SomeClass) xx = classtest2(5);}())));

class RecursiveClass
{
   int x;
   this(int n) { x = n; }
   RecursiveClass b;
   void doit() { b = new RecursiveClass(7); b.x = 2;}
}

int classtest3()
{
    RecursiveClass x = new RecursiveClass(17);
    x.doit();
    RecursiveClass y = x.b;
    assert(y.x == 2);
    assert(x.x == 17);
    return 1;
}

static assert(classtest3());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12016
// class cast and qualifier reinterpret

class B12016 { }

class C12016 : B12016 { }

bool f12016(immutable B12016 b)
{
    assert(b);
    return true;
}

static assert(f12016(new immutable C12016));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10610
// ice immutable implicit conversion

class Bug10610(T)
{
    int baz() immutable
    {
        return 1;
    }
    static immutable(Bug10610!T) min = new Bug10610!T();
}

void ice10610()
{
   alias T10610 = Bug10610!(int);
   static assert (T10610.min.baz());
}

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=13141
// regression fix caused by 10610

struct MapResult13141(alias pred)
{
    int[] range;
    @property empty() { return range.length == 0; }
    @property front() { return pred(range[0]); }
    void popFront() { range = range[1 .. $]; }
}

string[] array13141(R)(R r)
{
    typeof(return) result;
    foreach (e; r)
        result ~= e;
    return result;
}

//immutable string[] splitterNames = [4].map!(e => "4").array();
immutable string[] splitterNames13141 = MapResult13141!(e => "4")([4]).array13141();

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=11587
// AA compare

static assert([1:2, 3:4] == [3:4, 1:2]);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=14325
// more AA comparisons

static assert([1:1] != [1:2, 2:1]);      // OK
static assert([1:1] != [1:2]);           // OK
static assert([1:1] != [2:1]);           // OK <- Error
static assert([1:1, 2:2] != [3:3, 4:4]); // OK <- Error

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7147
// typeid()

static assert({
    TypeInfo xxx = typeid(Object);
    TypeInfo yyy = typeid(new Error("xxx"));
    return true;
}());

int bug7147(int n)
{
    Error err = n ? new Error("xxx") : null;
    TypeInfo qqq = typeid(err);
    return 1;
}

// Must not segfault if class is null
static assert(!is(typeof(compiles!(bug7147(0)))));
static assert( is(typeof(compiles!(bug7147(1)))));


/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=14123
// identity TypeInfo objects

static assert({
    bool eq(TypeInfo t1, TypeInfo t2)
    {
        return t1 is t2;
    }

    class C {}
    struct S {}

    assert( eq(typeid(C), typeid(C)));
    assert(!eq(typeid(C), typeid(Object)));
    assert( eq(typeid(S), typeid(S)));
    assert(!eq(typeid(S), typeid(int)));
    assert( eq(typeid(int), typeid(int)));
    assert(!eq(typeid(int), typeid(long)));

    Object o = new Object;
    Object c = new C;
    assert( eq(typeid(o), typeid(o)));
    assert(!eq(typeid(c), typeid(o)));
    assert(!eq(typeid(o), typeid(S)));

    return 1;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6885
// wrong code with new array

struct S6885
{
    int p;
}

int bug6885()
{
    auto array = new double[1][2];
    array[1][0] = 6;
    array[0][0] = 1;
    assert(array[1][0] == 6);

    auto barray = new S6885[2];
    barray[1].p = 5;
    barray[0].p = 2;
    assert(barray[1].p == 5);
    return 1;
}

static assert(bug6885());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6886
// ICE with new array of dynamic arrays

int bug6886()
{
    auto carray = new int[][2];
    carray[1] = [6];
    carray[0] = [4];
    assert(carray[1][0] == 6);
    return 1;
}

static assert(bug6886());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10198
// Multidimensional struct block initializer

struct Block10198
{
    int[4][3] val;
}

int bug10198()
{
    Block10198 pp = Block10198(67);
    assert(pp.val[2][3] == 67);
    assert(pp.val[1][3] == 67);
    return 1;
}
static assert(bug10198());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=14440
// Multidimensional block initialization should create distinct arrays for each elements

struct Matrix14440(E, size_t row, size_t col)
{
    E[col][row] array2D;

    @safe pure nothrow
    this(E[row * col] numbers...)
    {
        foreach (r; 0 .. row)
        {
            foreach (c; 0 .. col)
            {
                array2D[r][c] = numbers[r * col + c];
            }
        }
    }
}

void test14440()
{
    // Replace 'enum' with 'auto' here and it will work fine.
    enum matrix = Matrix14440!(int, 3, 3)(
        1, 2, 3,
        4, 5, 6,
        7, 8, 9
    );

    static assert(matrix.array2D[0][0] == 1);
    static assert(matrix.array2D[0][1] == 2);
    static assert(matrix.array2D[0][2] == 3);
    static assert(matrix.array2D[1][0] == 4);
    static assert(matrix.array2D[1][1] == 5);
    static assert(matrix.array2D[1][2] == 6);
    static assert(matrix.array2D[2][0] == 7);
    static assert(matrix.array2D[2][1] == 8);
    static assert(matrix.array2D[2][2] == 9);
}

/****************************************************
 * Exception chaining tests from xtest46.d
 ****************************************************/

class A75
{
    pure static void raise(string s)
    {
        throw new Exception(s);
    }
}

int test75()
{
    int x = 0;
    try
    {
        A75.raise("a");
    }
    catch (Exception e)
    {
        x = 1;
    }
    assert(x == 1);
    return 1;
}
static assert(test75());

/****************************************************
 * Exception chaining tests from test4.d
 ****************************************************/

int test4_test54()
{
    int status = 0;

    try
    {
        try
        {
            status++;
            assert(status == 1);
            throw new Exception("first");
        }
        finally
        {
            status++;
            assert(status == 2);
            status++;
            throw new Exception("second");
        }
    }
    catch (Exception e)
    {
        assert(e.msg == "first");
        assert(e.next.msg == "second");
    }
    return true;
}

static assert(test4_test54());

void foo55()
{
    try
    {
        Exception x = new Exception("second");
        throw x;
    }
    catch (Exception e)
    {
        assert(e.msg == "second");
    }
}

int test4_test55()
{
    int status = 0;
    try
    {
        try
        {
            status++;
            assert(status == 1);
            Exception x = new Exception("first");
            throw x;
        }
        finally
        {
            status++;
            assert(status == 2);
            status++;
            foo55();
        }
    }
    catch (Exception e)
    {
        assert(e.msg == "first");
        assert(status == 3);
    }
    return 1;
}

static assert(test4_test55());

/****************************************************
 * Exception chaining tests from eh.d
 ****************************************************/

void bug1513outer()
{
    int result1513;

    void bug1513a()
    {
         throw new Exception("d");
    }

    void bug1513b()
    {
        try
        {
            try
            {
                bug1513a();
            }
            finally
            {
                result1513 |= 4;
                throw new Exception("f");
            }
        }
        catch (Exception e)
        {
            assert(e.msg == "d");
            assert(e.next.msg == "f");
            assert(!e.next.next);
        }
    }

    void bug1513c()
    {
        try
        {
            try
            {
                throw new Exception("a");
            }
            finally
            {
                result1513 |= 1;
                throw new Exception("b");
            }
        }
        finally
        {
            bug1513b();
            result1513 |= 2;
            throw new Exception("c");
        }
    }

    void bug1513()
    {
        result1513 = 0;
        try
        {
            bug1513c();
        }
        catch (Exception e)
        {
            assert(result1513 == 7);
            assert(e.msg == "a");
            assert(e.next.msg == "b");
            assert(e.next.next.msg == "c");
        }
    }

    bug1513();
}

void collideone()
{
    try
    {
        throw new Exception("x");
    }
    finally
    {
        throw new Exception("y");
    }
}

void doublecollide()
{
    try
    {
        try
        {
            try
            {
                throw new Exception("p");
            }
            finally
            {
                throw new Exception("q");
            }
        }
        finally
        {
            collideone();
        }
    }
    catch (Exception e)
    {
        assert(e.msg == "p");
        assert(e.next.msg == "q");
        assert(e.next.next.msg == "x");
        assert(e.next.next.next.msg == "y");
        assert(!e.next.next.next.next);
    }
}

void collidetwo()
{
    try
    {
        try
        {
            throw new Exception("p2");
        }
        finally
        {
            throw new Exception("q2");
        }
    }
    finally
    {
        collideone();
    }
}

void collideMixed()
{
    int works = 6;
    try
    {
        try
        {
            try
            {
                throw new Exception("e");
            }
            finally
            {
                throw new Error("t");
            }
        }
        catch (Exception f)
        {
            // Doesn't catch, because Error is chained to it.
            works += 2;
        }
    }
    catch (Error z)
    {
        works += 4;
        assert(z.msg == "t"); // Error comes first
        assert(z.next is null);
        assert(z.bypassedException.msg == "e");
    }
    assert(works == 10);
}

class AnotherException : Exception
{
    this(string s)
    {
        super(s);
    }
}

void multicollide()
{
    try
    {
        try
        {
            try
            {
                try
                {
                    throw new Exception("m2");
                }
                finally
                {
                    throw new AnotherException("n2");
                }
            }
            catch (AnotherException s)
            {
                // Not caught -- we needed to catch the root cause "m2", not
                // just the collateral "n2" (which would leave m2 uncaught).
                assert(0);
            }
        }
        finally
        {
            collidetwo();
        }
    }
    catch (Exception f)
    {
        assert(f.msg == "m2");
        assert(f.next.msg == "n2");
        Throwable e = f.next.next;
        assert(e.msg == "p2");
        assert(e.next.msg == "q2");
        assert(e.next.next.msg == "x");
        assert(e.next.next.next.msg == "y");
        assert(!e.next.next.next.next);
    }
}

int testsFromEH()
{
    bug1513outer();
    doublecollide();
    collideMixed();
    multicollide();
    return 1;
}
static assert(testsFromEH());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6901
// With + synchronized statements

struct With1
{
    int a;
    int b;
}

class Foo6
{
}

class Foo32
{
    struct Bar
    {
        int x;
    }
}

class Base56
{
    private string myfoo;
    private string mybar;

    // Get/set properties that will be overridden.
    void foo(string s) { myfoo = s; }
    string foo() { return myfoo; }

    // Get/set properties that will not be overridden.
    void bar(string s) { mybar = s; }
    string bar() { return mybar; }
}

class Derived56 : Base56
{
    alias Base56.foo foo; // Bring in Base56's foo getter.
    override void foo(string s) { super.foo = s; } // Override foo setter.
}

int testwith()
{
    With1 x = With1(7);
    with (x)
    {
        a = 2;
    }
    assert(x.a == 2);

    // from test11.d
    Foo6 foo6 = new Foo6();

    with (foo6)
    {
        int xx;
        xx = 4;
    }
    with (new Foo32)
    {
        Bar z;
        z.x = 5;
    }
    Derived56 d = new Derived56;
    with (d)
    {
        foo = "hi";
        d.foo = "hi";
        bar = "hi";
        assert(foo == "hi");
        assert(d.foo == "hi");
        assert(bar == "hi");
    }
    int w = 7;
    synchronized
    {
        ++w;
    }
    assert(w == 8);
    return 1;
}

static assert(testwith());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=9236
// ICE  switch with(EnumType)

enum Command9236
{
    Char,
    Any,
};

bool bug9236(Command9236 cmd)
{
    int n = 0;
    with (Command9236) switch (cmd)
    {
    case Any:
        n = 1;
        break;
    default:
        n = 2;
    }
    assert(n == 1);

    switch (cmd) with (Command9236)
    {
    case Any:
        return true;
    default:
        return false;
    }
}

static assert(bug9236(Command9236.Any));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6416
// static struct declaration

static assert({
    static struct S { int y = 7; }
    S a;
    a.y += 6;
    assert(a.y == 13);
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10499
// static template struct declaration

static assert({
    static struct Result() {}
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=13757
// extern(C) alias declaration

static assert({
    alias FP1 = extern(C) int function();
    alias extern(C) int function() FP2;
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6522
// opAssign + foreach ref

struct Foo6522
{
    bool b = false;
    void opAssign(int x)
    {
        this.b = true;
    }
}

bool foo6522()
{
    Foo6522[1] array;
    foreach (ref item; array)
        item = 1;
    return true;
}

static assert(foo6522());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7245
// pointers + foreach ref

int bug7245(int testnum)
{
    int[3] arr;
    arr[0] = 4;
    arr[1] = 6;
    arr[2] = 8;
    int* ptr;

    foreach (i, ref p; arr)
    {
        if (i == 1)
            ptr = &p;
        if (testnum == 1)
            p = 5;
    }

    return *ptr;
}

static assert(bug7245(0) == 6);
static assert(bug7245(1) == 5);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=8498
// modifying foreach
// https://issues.dlang.org/show_bug.cgi?id=7658
// foreach ref
// https://issues.dlang.org/show_bug.cgi?id=8539
// nested funcs, ref param, -inline

int bug8498()
{
    foreach (ref i; 0 .. 5)
    {
        assert(i == 0);
        i = 100;
    }
    return 1;
}
static assert(bug8498());

string bug7658()
{
    string[] children = ["0"];
    foreach (ref child; children)
        child = "1";
    return children[0];
}

static assert(bug7658() == "1");

int bug8539()
{
    static void one(ref int x)
    {
        x = 1;
    }
    static void go()
    {
        int y;
        one(y);
        assert(y == 1); // fails with -inline
    }
    go();
    return 1;
}

static assert(bug8539());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7874
// https://issues.dlang.org/show_bug.cgi?id=13297
// https://issues.dlang.org/show_bug.cgi?id=13740
// better lvalue handling

int bug7874(int x){ return ++x = 1; }
static assert(bug7874(0) == 1);

// ----

struct S13297
{
    int* p;
}
void f13297(ref int* p)
{
    p = cast(int*) 1;
    assert(p); // passes
}
static assert(
{
    S13297 s;
    f13297(s.p);
    return s.p != null; // false
}());

// ----

class R13740
{
    int e;
    bool empty = false;
    @property ref front() { return e; }
    void popFront() { empty = true; }
}
static assert({
    auto r = new R13740();
    foreach (ref e; r)
        e = 42;
    assert(r.e == 42); /* fails in CTFE */

    return true;
}());

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

void bug6919(int* val)
{
    *val = 1;
}
void test6919()
{
    int n;
    bug6919(&n);
    assert(n == 1);
}
static assert({ test6919(); return true; }());

void bug6919b(string* val)
{
    *val = "1";
}

void test6919b()
{
    string val;
    bug6919b(&val);
    assert(val == "1");
}
static assert({ test6919b(); return true; }());

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

struct Foo6995
{
    static size_t index(size_t v)()
    {
        return v;
    }
}

static assert(Foo6995.index!(27)() == 27);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7043
// ref with -inline

int bug7043(S)(ref int x)
{
    return x;
}

static assert({
    int i = 416;
    return bug7043!(char)(i);
}() == 416);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6037
// recursive ref

void bug6037(ref int x, bool b)
{
    int w = 3;
    if (b)
    {
        bug6037(w, false);
        assert(w == 6);
    }
    else
    {
        x = 6;
        assert(w == 3); // fails
    }
}

int bug6037outer()
{
    int q;
    bug6037(q, true);
    return 401;
}

static assert(bug6037outer() == 401);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=14299
// [REG2.067a], more than one depth of recursive call with ref

string gen14299(int max, int idx, ref string name)
{
    string ret;
    name = [cast(char)(idx + '0')];
    ret ~= name;
    if (idx < max)
    {
        string subname;
        ret ~= gen14299(max, idx + 1, subname);
    }
    ret ~= name;
    return ret;
}
string test14299(int max)
{
    string n;
    return gen14299(max, 0, n);
}
static assert(test14299(1) ==     "0110");      // OK <- fail
static assert(test14299(2) ==    "012210");     // OK <- ICE
static assert(test14299(3) ==   "01233210");
static assert(test14299(4) ==  "0123443210");
static assert(test14299(5) == "012345543210");

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7940
// wrong code for complicated assign

struct Bug7940
{
    int m;
}

struct App7940
{
    Bug7940[] x;
}

int bug7940()
{
    Bug7940[2] y;
    App7940 app;
    app.x = y[0 .. 1];
    app.x[0].m = 12;
    assert(y[0].m == 12);
    assert(app.x[0].m == 12);
    return 1;
}

static assert(bug7940());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10298
// wrong code for struct array literal init

struct Bug10298
{
    int m;
}

int bug10298()
{
    Bug10298[1] y = [Bug10298(78)];
    y[0].m = 6;
    assert(y[0].m == 6);

    // Root cause
    Bug10298[1] x;
    x[] = [cast(const Bug10298)(Bug10298(78))];
    assert(x[0].m == 78);
    return 1;
}

static assert(bug10298());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7266
// dotvar ref parameters

struct S7266 { int a; }

bool bug7266()
{
    S7266 s;
    s.a = 4;
    bar7266(s.a);
    assert(s.a == 5);
    out7266(s.a);
    assert(s.a == 7);
    return true;
}

void bar7266(ref int b)
{
    b = 5;
    assert(b == 5);
}

void out7266(out int b)
{
    b = 7;
    assert(b == 7);
}

static assert(bug7266());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=9982
// dotvar assign through pointer

struct Bug9982
{
    int a;
}

int test9982()
{
    Bug9982 x;
    int*q = &x.a;
    *q = 99;
    assert(x.a == 99);
    return 1;
}

static assert(test9982());

// https://issues.dlang.org/show_bug.cgi?id=9982
// rejects-valid case

struct SS9982
{
    Bug9982 s2;
    this(Bug9982 s1)
    {
        s2.a = 6;
        emplace9982(&s2, s1);
        assert(s2.a == 3);
    }
}

void emplace9982(Bug9982* chunk, Bug9982 arg)
{
    *chunk = arg;
}

enum s9982 = Bug9982(3);
enum p9982 = SS9982(s9982);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=11618
// dotvar assign through casted pointer

struct Tuple11618(T...)
{
    T field;
    alias field this;
}

static assert({
    Tuple11618!(immutable dchar) result = void;
    auto addr = cast(dchar*)&result[0];
    *addr = dchar.init;
    return (result[0] == dchar.init);
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7143
// 'is' for classes

class C7143
{
    int x;
}

int bug7143(int test)
{
    C7143 c = new C7143;
    C7143 d = new C7143;
    if (test == 1)
    {
        if (c)
            return c.x + 8;
        return -1;
    }
    if (test == 2)
    {
        if (c is null)
            return -1;
        return c.x + 45;
    }
    if (test == 3)
    {
        if (c is c)
            return 58;
    }
    if (test == 4)
    {
        if (c !is c)
            return -1;
        else
            return 48;
    }
    if (test == 6)
        d = c;
    if (test == 5 || test == 6)
    {
        if (c is d)
            return 188;
        else
            return 48;
    }
    return -1;
}

static assert(bug7143(1) == 8);
static assert(bug7143(2) == 45);
static assert(bug7143(3) == 58);
static assert(bug7143(4) == 48);
static assert(bug7143(5) == 48);
static assert(bug7143(6) == 188);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7147
// virtual function calls from base class

class A7147
{
    int foo() { return 0; }

    int callfoo()
    {
        return foo();
    }
}

class B7147 : A7147
{
    override int foo() { return 1; }
}

int test7147()
{
    A7147 a = new B7147;
    return a.callfoo();
}

static assert(test7147() == 1);

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

class C7158
{
    bool b() { return true; }
}
struct S7158
{
    C7158 c;
}

bool test7158()
{
    S7158 s = S7158(new C7158);
    return s.c.b;
}
static assert(test7158());

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

class C8484
{
    int n;
    int b() { return n + 3; }
}

struct S
{
    C8484 c;
}

int t8484(ref C8484 c)
{
    return c.b();
}

int test8484()
{
    auto s = S(new C8484);
    s.c.n = 4;
    return t8484(s.c);
}
static assert(test8484() == 7);

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

struct X7419
{
    double x;
    this(double x)
    {
        this.x = x;
    }
}

void bug7419()
{
    enum x = {
        auto p = X7419(3);
        return p.x;
    }();
    static assert(x == 3);
}

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

template c9445(T...) { }

void ice9445(void delegate() expr, void function() f2)
{
    static assert(!is(typeof(c9445!(f2()))));
    static assert(!is(typeof(c9445!(expr()))));
}

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

struct S10452
{
    bool func() { return true; }
}

struct Outer10452
{
    S10452 inner;
}

class C10452
{
    bool func() { return true; }
}

bool delegate() ref10452(return ref S10452 s)
{
    return &s.func;
}

bool test10452()
{
    bool delegate() bar = () { return true; };

    assert(bar !is null);
    assert(bar is bar);

    S10452 bag;
    S10452[6] bad;
    Outer10452 outer;
    C10452 tag = new C10452;

    auto rat = &outer.inner.func;
    assert(rat == rat);
    auto tat = &tag.func;
    assert(tat == tat);

    auto bat = &outer.inner.func;
    auto mat = &bad[2].func;
    assert(mat is mat);
    assert(rat == bat);

    auto zat = &bag.func;
    auto cat = &bag.func;
    assert(zat == zat);
    assert(zat == cat);

    auto drat = ref10452(bag);
    assert(cat == drat);
    assert(drat == drat);
    drat = ref10452(bad[2]);
    assert( drat == mat);
    assert(tat != rat);
    assert(zat != rat);
    assert(rat != cat);
    assert(zat != bar);
    assert(tat != cat);
    cat = bar;
    assert(cat == bar);
    return true;
}
static assert(test10452());

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

void f7162() { }

bool ice7162()
{
    false && f7162();
    false || f7162();
    false && f7162();  // https://issues.dlang.org/show_bug.cgi?id=4711
    true && f7162();
    return true;
}

static assert(ice7162());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=8857
// only with -inline (creates an &&)

struct Result8857 { char[] next; }

void bug8857()()
{
    Result8857 r;
    r.next = null;
    if (true)
    {
       auto next = r.next;
    }
}
static assert({
    bug8857();
    return true;
}());

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

struct Bug7527
{
    char[] data;
}

int bug7527()
{
    auto app = Bug7527();

    app.data.ptr[0 .. 1] = "x";
    return 1;
}

static assert(!is(typeof(compiles!(bug7527()))));

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

int bug7380;

static assert(!is(typeof( compiles!(
    (){
        return &bug7380;
    }()
))));

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

struct S7165
{
    int* ptr;
    bool f() const { return !!ptr; }
}

static assert(!S7165().f());

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

int[] f7187() { return [0]; }
int[] f7187b(int n) { return [0]; }

int g7187(int[] r)
{
    auto t = r[0 .. 0];
    return 1;
}

static assert(g7187(f7187()));
static assert(g7187(f7187b(7)));

struct S7187 { const(int)[] field; }

const(int)[] f7187c()
{
    auto s = S7187([0]);
    return s.field;
}

bool g7187c(const(int)[] r)
{
    auto t = r[0 .. 0];
    return true;
}

static assert(g7187c(f7187c()));


/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=6933
// struct destructors

struct Bug6933
{
    int x = 3;
    ~this() { }
}

int test6933()
{
    Bug6933 q;
    assert(q.x == 3);
    return 3;
}

static assert(test6933());

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

int foo7197(int[] x...)
{
    return 1;
}
template bar7197(y...)
{
    enum int bar7197 = foo7197(y);
}
enum int bug7197 = 7;
static assert(bar7197!(bug7197));

/**************************************************
    Enum string compare
**************************************************/

enum EScmp : string { a = "aaa" }

bool testEScmp()
{
    EScmp x = EScmp.a;
    assert(x < "abc");
    return true;
}

static assert(testEScmp());

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

bool baz7667(int[] vars...)
{
     return true;
}

struct S7667
{
    static void his(int n)
    {
        static assert(baz7667(2));
    }
}

bool bug7667()
{
    S7667 unused;
    unused.his(7);
    return true;
}
enum e7667 = bug7667();

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

bool bug7536(string expr)
{
    return true;
}

void vop()
{
    const string x7536 = "x";
    static assert(bug7536(x7536));
}

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

struct S6681
{
    this(int a, int b) { this.a = b; this.b = a; }
    union
    {
        ulong g;
        struct { int a, b; };
    }
}

static immutable S6681 s6681 = S6681(0, 1);

bool bug6681(int test)
{
    S6681 x = S6681(0, 1);
    x.g = 5;
    auto u = &x.g;
    auto v = &x.a;
    long w = *u;
    int  z;
    assert(w == 5);
    if (test == 4)
        z = *v; // error
    x.a = 2; // invalidate g, and hence u.
    if (test == 1)
        w = *u; // error
    z = *v;
    assert(z == 2);
    x.g = 6;
    w = *u;
    assert(w == 6);
    if (test == 3)
        z = *v;
    return true;
}
static assert(bug6681(2));
static assert(!is(typeof(compiles!(bug6681(1)))));
static assert(!is(typeof(compiles!(bug6681(3)))));
static assert(!is(typeof(compiles!(bug6681(4)))));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=9113
// ICE with struct in union

union U9113
{
    struct M
    {
        int y;
    }
    int xx;
}

int bug9113(T)()
{
    U9113 x;
    x.M.y = 10; // error, need 'this'
    return 1;
}

static assert(!is(typeof(compiles!(bug9113!(int)()))));

/**************************************************
    Creation of unions
**************************************************/

union UnionTest1
{
    int x;
    float y;
}

int uniontest1()
{
    UnionTest1 u = UnionTest1(1);
    return 1;
}

static assert(uniontest1());

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

struct S6438
{
    int a;
    int b = void;
}

void fill6438(int[] arr, int testnum)
{
    if (testnum == 2)
    {
        auto u = arr[0];
    }
    foreach (ref x; arr)
        x = 7;
    auto r = arr[0];
    S6438[2] s;
    auto p = &s[0].b;
    if (testnum == 3)
    {
        auto v = *p;
    }
}

bool bug6438(int testnum)
{
    int[4] stackSpace = void;
    fill6438(stackSpace[], testnum);
    assert(stackSpace == [7, 7, 7, 7]);
    return true;
}

static assert( is(typeof(compiles!(bug6438(1)))));
static assert(!is(typeof(compiles!(bug6438(2)))));
static assert(!is(typeof(compiles!(bug6438(3)))));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10994
// void static array members

struct Bug10994
{
    ubyte[2] buf = void;
}

static bug10994 = Bug10994.init;

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10937
// struct inside union

struct S10937
{
    union
    {
        ubyte[1] a;
        struct
        {
            ubyte b;
        }
    }

    this(ubyte B)
    {
        if (B > 6)
            this.b = B;
        else
            this.a[0] = B;
    }
}

enum test10937 = S10937(7);
enum west10937 = S10937(2);

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

struct Vector13831()
{
}

struct Coord13831
{
    union
    {
        struct { short x; }
        Vector13831!() vector;
    }
}

struct Chunk13831
{
    this(Coord13831)
    {
        coord = coord;
    }

    Coord13831 coord;

    static const Chunk13831* unknownChunk = new Chunk13831(Coord13831());
}

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

struct AssociativeArray
{
    int* impl;
    int f()
    {
        if (impl !is null)
            auto x = *impl;
        return 1;
    }
}

int test7732()
{
    AssociativeArray aa;
    return aa.f;
}

static assert(test7732());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7784
struct Foo7784
{
    void bug()
    {
        tab["A"] = Bar7784(&this);
        auto pbar = "A" in tab;
        auto bar = *pbar;
    }

    Bar7784[string] tab;
}

struct Bar7784
{
    Foo7784* foo;
    int val;
}

bool ctfe7784()
{
    auto foo = Foo7784();
    foo.bug();
    return true;
}

static assert(ctfe7784());

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

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

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

bool bug7785(int n)
{
    int val = 7;
    auto p = &val;
    if (n == 2)
    {
        auto ary = p[0 .. 1];
    }
    auto x = p[0];
    val = 6;
    assert(x == 7);
    if (n == 3)
        p[0 .. 1] = 1;
    return true;
}

static assert(bug7785(1));
static assert(!is(typeof(compiles!(bug7785(2)))));
static assert(!is(typeof(compiles!(bug7785(3)))));

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

class C7987
{
    int m;
}

struct S7987
{
    int* p;
    C7987 c;
}

bool bug7987()
{
    int[7] q;
    int[][2] b = q[0 .. 5];
    assert(b == b);
    assert(b is b);
    C7987 c1 = new C7987;
    C7987 c2 = new C7987;
    S7987 s, t;
    s.p = &q[0];
    t.p = &q[1];
    assert(s != t);
    s.p = &q[1];
    /*assert(s == t);*/     assert(s.p == t.p);
    s.c = c1;
    t.c = c2;
    /*assert(s != t);*/     assert(s.c !is t.c);
    assert(s !is t);
    s.c = c2;
    /*assert(s == t);*/     assert(s.p == t.p && s.c is t.c);
    assert(s is t);
    return true;
}

static assert(bug7987());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10579
// typeinfo.func() must not segfault

static assert(!is(typeof(compiles!(typeid(int).toString.length))));

class Bug10579
{
    int foo() { return 1; }
}
Bug10579 uninitialized10579;

static assert(!is(typeof(compiles!(uninitialized10579.foo()))));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10804
// mixin ArrayLiteralExp typed string

void test10804()
{
    String identity(String)(String a) { return a; }

    string cfun()
    {
        char[] s;
        s.length = 8 + 2 + (2) + 1 + 2;
        s[] = "identity(`Ω`c)"c[];
        return cast(string)s;   // Return ArrayLiteralExp as the CTFE result
    }
    {
        enum a1 = "identity(`Ω`c)"c;
        enum a2 = cfun();
        static assert(cast(ubyte[])mixin(a1) == [0xCE, 0xA9]);
        static assert(cast(ubyte[])mixin(a2) == [0xCE, 0xA9]);  // should pass
    }

    wstring wfun()
    {
        wchar[] s;
        s.length = 8 + 2 + (2) + 1 + 2;
        s[] = "identity(`\U0002083A`w)"w[];
        return cast(wstring)s;  // Return ArrayLiteralExp as the CTFE result
    }
    {
        enum a1 = "identity(`\U0002083A`w)"w;
        enum a2 = wfun();
        static assert(cast(ushort[])mixin(a1) == [0xD842, 0xDC3A]);
        static assert(cast(ushort[])mixin(a2) == [0xD842, 0xDC3A]);
    }

    dstring dfun()
    {
        dchar[] s;
        s.length = 8 + 2 + (1) + 1 + 2;
        s[] = "identity(`\U00101000`d)"d[];
        return cast(dstring)s;  // Return ArrayLiteralExp as the CTFE result
    }
    {
        enum a1 = "identity(`\U00101000`d)"d;
        enum a2 = dfun();
        static assert(cast(uint[])mixin(a1) == [0x00101000]);
        static assert(cast(uint[])mixin(a2) == [0x00101000]);
    }
}

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

struct B73 {}
struct C73 { B73 b; }
C73 func73() { C73 b = void; b.b = B73(); return b; }
C73 test73 = func73();

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

struct S74
{
    int[1] n;
    static S74 test(){ S74 ret = void; ret.n[0] = 0; return ret; }
}

enum Test74 = S74.test();

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

static bool bug8865()
in
{
    int x = 0;
label:
    foreach (i; (++x) .. 3)
    {
        if (i == 1)
            continue label;     // doesn't work.
        else
            break label;        // doesn't work.
    }
}
out
{
    int x = 0;
label:
    foreach (i; (++x) .. 3)
    {
        if (i == 1)
            continue label;     // doesn't work.
        else
            break label;        // doesn't work.
    }
}
do
{
    int x = 0;
label:
    foreach (i; (++x) .. 3)
    {
        if (i == 1)
            continue label;     // works.
        else
            break label;        // works.
    }

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

/******************************************************/
// https://issues.dlang.org/show_bug.cgi?id=15450
// labeled foreach + continue/break

static assert({
  L1:
    foreach (l; [0])
        continue L1;

  L2:
    foreach (l; [0])
        break L2;

    return true;
}());

struct Test75
{
    this(int) pure {}
}

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

static assert( __traits(compiles, { static shared(Test75*)   t75 = new shared(Test75)(0);    return t75; }));
static assert( __traits(compiles, { static shared(Test75)*   t75 = new shared(Test75)(0);    return t75; }));
static assert( __traits(compiles, { static __gshared Test75* t75 = new Test75(0);            return t75; }));
static assert( __traits(compiles, { static const(Test75*)    t75 = new const(Test75)(0);     return t75; }));
static assert( __traits(compiles, { static immutable Test75* t75 = new immutable(Test75)(0); return t75; }));
static assert(!__traits(compiles, { static Test75*           t75 = new Test75(0);            return t75; }));
/+
static assert(!__traits(compiles, { enum                 t75 = new shared(Test75)(0); return t75; }));
static assert(!__traits(compiles, { enum                 t75 = new Test75(0);         return t75; }));
static assert(!__traits(compiles, { enum shared(Test75)* t75 = new shared(Test75)(0); return t75; }));
static assert(!__traits(compiles, { enum Test75*         t75 = new Test75(0);         return t75; }));

static assert( __traits(compiles, { enum                    t75 = new const(Test75)(0);     return t75;}));
static assert( __traits(compiles, { enum                    t75 = new immutable(Test75)(0); return t75;}));
static assert( __traits(compiles, { enum const(Test75)*     t75 = new const(Test75)(0);     return t75;}));
static assert( __traits(compiles, { enum immutable(Test75)* t75 = new immutable(Test75)(0); return t75;}));
+/
/******************************************************/

class Test76
{
    this(int) pure {}
}
/+
static assert(!__traits(compiles, { enum                   t76 = new shared(Test76)(0); return t76;}));
static assert(!__traits(compiles, { enum                   t76 = new Test76(0);         return t76;}));
static assert(!__traits(compiles, { enum shared(Test76)    t76 = new shared(Test76)(0); return t76;}));
static assert(!__traits(compiles, { enum Test76            t76 = new Test76(0);         return t76;}));

static assert( __traits(compiles, { enum                   t76 = new const(Test76)(0);     return t76;}));
static assert( __traits(compiles, { enum                   t76 = new immutable(Test76)(0); return t76;}));
static assert( __traits(compiles, { enum const(Test76)     t76 = new const(Test76)(0);     return t76;}));
static assert( __traits(compiles, { enum immutable(Test76) t76 = new immutable(Test76)(0); return t76;}));
+/
/******************************************************/

static assert( __traits(compiles, { static shared Test76    t76 = new shared(Test76)(0);   return t76; }));
static assert( __traits(compiles, { static shared(Test76)   t76 = new shared(Test76)(0);   return t76; }));
static assert( __traits(compiles, { static __gshared Test76 t76 = new Test76(0);           return t76; }));
static assert( __traits(compiles, { static const Test76     t76 = new const(Test76)(0);    return t76; }));
static assert( __traits(compiles, { static immutable Test76 t76 = new immutable Test76(0); return t76; }));
static assert(!__traits(compiles, { static Test76           t76 = new Test76(0);           return t76; }));

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

struct Bug5678
{
    this(int) {}
}

static assert(!__traits(compiles, { enum const(Bug5678)* b5678 = new const(Bug5678)(0); return b5678; }));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10782
// run semantic2 for class field

enum e10782 = 0;
class C10782 { int x = e10782; }
string f10782()
{
    auto c = new C10782();
    return "";
}
mixin(f10782());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10929
// NRVO support in CTFE

struct S10929
{
    this(this)
    {
        postblitCount++;
    }
    ~this()
    {
        dtorCount++;
    }
    int payload;
    int dtorCount;
    int postblitCount;
}

auto makeS10929()
{
    auto s = S10929(42, 0, 0);
    return s;
}

bool test10929()
{
    auto s = makeS10929();
    assert(s.postblitCount == 0);
    assert(s.dtorCount == 0);
    return true;
};
static assert(test10929());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=9245
// support postblit call on array assignments

bool test9245()
{
    int postblits = 0;
    struct S
    {
        this(this)
        {
            ++postblits;
        }
    }

    S s;
    S[2] a;
    assert(postblits == 0);

    {
        S[2] arr = s;
        assert(postblits == 2);
        arr[] = s;
        assert(postblits == 4);
        postblits = 0;

        S[2] arr2 = arr;
        assert(postblits == 2);
        arr2 = arr;
        assert(postblits == 4);
        postblits = 0;

        const S[2] constArr = s;
        assert(postblits == 2);
        postblits = 0;

        const S[2] constArr2 = arr;
        assert(postblits == 2);
        postblits = 0;
    }
    {
        S[2][2] arr = s;
        assert(postblits == 4);
        arr[] = a;
        assert(postblits == 8);
        postblits = 0;

        S[2][2] arr2 = arr;
        assert(postblits == 4);
        arr2 = arr;
        assert(postblits == 8);
        postblits = 0;

        const S[2][2] constArr = s;
        assert(postblits == 4);
        postblits = 0;

        const S[2][2] constArr2 = arr;
        assert(postblits == 4);
        postblits = 0;
    }

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

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12906
// don't call postblit on blit initializing

struct S12906 { this(this) { assert(0); } }

static assert({
    S12906[1] arr;
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=11510
// support overlapped field access in CTFE

struct S11510
{
    union
    {
        size_t x;
        int* y; // pointer field
    }
}
bool test11510()
{
    S11510 s;

    s.y = [1,2,3].ptr;            // writing overlapped pointer field is OK
    assert(s.y[0 .. 3] == [1,2,3]); // reading valid field is OK

    s.x = 10;
    assert(s.x == 10);

    // There's no reinterpretation between S.x and S.y
    return true;
}
static assert(test11510());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=11534
// subtitude inout

struct MultiArray11534
{
    void set(size_t[] sizes...)
    {
        storage = new size_t[5];
    }

    @property auto raw_ptr() inout
    {
        return storage.ptr + 1;
    }
    size_t[] storage;
}

enum test11534 = () {
    auto m = MultiArray11534();
    m.set(3,2,1);
    auto start = m.raw_ptr;   //this trigger the bug
    //auto start = m.storage.ptr + 1; //this obviously works
    return 0;
}();

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=11941
// Regression of 11534 fix

void takeConst11941(const string[]) {}
string[] identity11941(string[] x) { return x; }

bool test11941a()
{
    struct S { string[] a; }
    S s;

    takeConst11941(identity11941(s.a));
    s.a ~= [];

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

bool test11941b()
{
    struct S { string[] a; }
    S s;

    takeConst11941(identity11941(s.a));
    s.a ~= "foo"; /* Error refers to this line (15), */
    string[] b = s.a[]; /* but only when this is here. */

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

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=11535
// element-wise assignment from string to ubyte array literal

struct Hash11535
{
    ubyte[6] _buffer;

    void put(scope const(ubyte)[] data...)
    {
        uint i = 0, index = 0;
        auto inputLen = data.length;

        (&_buffer[index])[0 .. inputLen - i] = (&data[i])[0 .. inputLen - i];
    }
}

auto md5_digest11535(T...)(scope const T data)
{
    Hash11535 hash;
    hash.put(cast(const(ubyte[]))data[0]);
    return hash._buffer;
}

static assert(md5_digest11535(`TEST`) == [84, 69, 83, 84, 0, 0]);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=11540
// goto label + try-catch-finally / with statement

static assert(()
{
    // jump inside TryCatchStatement.body
    {
        bool c = false;
        try
        {
            if (c)  // need to bypass front-end optimization
                throw new Exception("");
            else
                goto L2;
          L2:
            ;
        }
        catch (Exception e) {}
    }

    // exit from TryCatchStatement.body
    {
        bool c = false;
        try
        {
            if (c)  // need to bypass front-end optimization
                throw new Exception("");
            else
                goto L3;
        }
        catch (Exception e) {}

        c = true;
      L3:
        assert(!c);
    }

    return 1;
}());

static assert(()
{
    // enter to TryCatchStatement.catches which has no exception variable
    {
        bool c = false;
        goto L1;
        try
        {
            c = true;
        }
        catch (Exception/* e*/)
        {
          L1:
            ;
        }
        assert(c == false);
    }

    // jump inside TryCatchStatement.catches
    {
        bool c = false;
        try
        {
            throw new Exception("");
        }
        catch (Exception e)
        {
            goto L2;
            c = true;
          L2:
            ;
        }
        assert(c == false);
    }

    // exit from TryCatchStatement.catches
    {
        bool c = false;
        try
        {
            throw new Exception("");
        }
        catch (Exception e)
        {
            goto L3;
            c = true;
        }
      L3:
        assert(c == false);
    }

    return 1;
}());

static assert(()
{
    // jump inside TryFinallyStatement.body
    {
        try
        {
            goto L2;
          L2: ;
        }
        finally {}
    }

    // exit from TryFinallyStatement.body
    {
        bool c = false;
        try
        {
            goto L3;
        }
        finally {}

        c = true;
      L3:
        assert(!c);
    }

    // enter in / exit out from finally block is rejected in semantic analysis

    // jump inside TryFinallyStatement.finalbody
    {
        bool c = false;
        try
        {
        }
        finally
        {
            goto L4;
            c = true;
          L4:
            assert(c == false);
        }
    }

    return 1;
}());

static assert(()
{
    {
        bool c = false;
        with (Object.init)
        {
            goto L2;
            c = true;
          L2:
            ;
        }
        assert(c == false);
    }

    {
        bool c = false;
        with (Object.init)
        {
            goto L3;
            c = true;
        }
      L3:
        assert(c == false);
    }

    return 1;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=11627
//cast dchar to char at compile time on AA assignment

bool test11627()
{
    char[ubyte] toCharTmp;
    dchar letter = 'A';

    //char c = cast(char)letter;    // OK
    toCharTmp[0] = cast(char)letter;    // NG

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

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=11664
// ignore function local static variables

bool test11664()
{
    static int x;
    static int y = 1;
    return true;
}
static assert(test11664());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12110
// operand of dereferencing does not need to be an lvalue

struct SliceOverIndexed12110
{
    Uint24Array12110* arr;

    @property front(uint val)
    {
        arr.dupThisReference();
    }
}

struct Uint24Array12110
{
    ubyte[] data;

    this(ubyte[] range)
    {
        data = range;
        SliceOverIndexed12110(&this).front = 0;
        assert(data.length == range.length * 2);
    }

    void dupThisReference()
    {
        auto new_data = new ubyte[data.length * 2];
        data = new_data;
    }
}

static m12110 = Uint24Array12110([0x80]);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12310
// heap allocation for built-in sclar types

bool test12310()
{
    auto p1 = new int, p2 = p1;
    assert(*p1 == 0);
    assert(*p2 == 0);
    *p1 = 10;
    assert(*p1 == 10);
    assert(*p2 == 10);

    auto q1 = new int(3), q2 = q1;
    assert(*q1 == 3);
    assert(*q2 == 3);
    *q1 = 20;
    assert(*q1 == 20);
    assert(*q2 == 20);

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

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12499
// initialize TupleDeclaraion in CTFE

auto f12499()
{
    //Initialize 3 ints to 5.
    TypeTuple!(int, int, int) a = 5;
    return a[0]; //Error: variable _a_field_0 cannot be read at compile time
}
static assert(f12499() == 5);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12602
// slice in struct literal members

struct Result12602
{
    uint[] source;
}

auto wrap12602a(uint[] r)
{
    return Result12602(r);
}

auto wrap12602b(uint[] r)
{
    Result12602 x;
    x.source = r;
    return x;
}

auto testWrap12602a()
{
    uint[] dest = [1, 2, 3, 4];

    auto ra = wrap12602a(dest[0 .. 2]);
    auto rb = wrap12602a(dest[2 .. 4]);

    foreach (i; 0 .. 2)
        rb.source[i] = ra.source[i];

    assert(ra.source == [1,2]);
    assert(rb.source == [1,2]);
    assert(&ra.source[0] == &dest[0]);
    assert(&rb.source[0] == &dest[2]);
    assert(dest == [1,2,1,2]);
    return dest;
}

auto testWrap12602b()
{
    uint[] dest = [1, 2, 3, 4];

    auto ra = wrap12602b(dest[0 .. 2]);
    auto rb = wrap12602b(dest[2 .. 4]);

    foreach (i; 0 .. 2)
        rb.source[i] = ra.source[i];

    assert(ra.source == [1,2]);
    assert(rb.source == [1,2]);
    assert(&ra.source[0] == &dest[0]);
    assert(&rb.source[0] == &dest[2]);
    assert(dest == [1,2,1,2]);
    return dest;
}

auto testWrap12602c()
{
    uint[] dest = [1, 2, 3, 4];

    auto ra = Result12602(dest[0 .. 2]);
    auto rb = Result12602(dest[2 .. 4]);

    foreach (i; 0 .. 2)
        rb.source[i] = ra.source[i];

    assert(ra.source == [1,2]);
    assert(rb.source == [1,2]);
    assert(&ra.source[0] == &dest[0]);
    assert(&rb.source[0] == &dest[2]);
    assert(dest == [1,2,1,2]);
    return dest;
}

auto testWrap12602d()
{
    uint[] dest = [1, 2, 3, 4];

    Result12602 ra; ra.source = dest[0 .. 2];
    Result12602 rb; rb.source = dest[2 .. 4];

    foreach (i; 0 .. 2)
        rb.source[i] = ra.source[i];

    assert(ra.source == [1,2]);
    assert(rb.source == [1,2]);
    assert(&ra.source[0] == &dest[0]);
    assert(&rb.source[0] == &dest[2]);
    assert(dest == [1,2,1,2]);
    return dest;
}

static assert(testWrap12602a() == [1,2,1,2]);
static assert(testWrap12602b() == [1,2,1,2]);
static assert(testWrap12602c() == [1,2,1,2]);
static assert(testWrap12602d() == [1,2,1,2]);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12677
// class type initializing from DotVarExp

final class C12677
{
    TypeTuple!(Object, int[]) _test;
    this()
    {
        auto t0 = _test[0]; //
        auto t1 = _test[1]; //
        assert(t0 is null);
        assert(t1 is null);
    }
}

struct S12677
{
    auto f = new C12677();
}

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12851
// interpret function local const static array

void test12851()
{
    const int[5] arr;
    alias staticZip = TypeTuple!(arr[0]);
}

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=13630
// indexing and setting array element via pointer

struct S13630(T)
{
    T[3] arr;

    this(A...)(auto ref in A args)
    {
        auto p = arr.ptr;

        foreach (ref v; args)
        {
            *p = 0;
        }
    }
}

enum s13630 = S13630!float(1);

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

struct Matrix13827(T, uint N)
{
    private static defaultMatrix()
    {
        T[N] arr;
        return arr;
    }

    union
    {
        T[N] A = defaultMatrix;
        T[N] flat;
    }

    this(A...)(auto ref in A args)
    {
        uint k;

        foreach (ref v; args)
            flat[k++] = cast(T)v;
    }
}
enum m13827 = Matrix13827!(int, 3)(1, 2, 3);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=13847
// support DotTypeExp

class B13847
{
    int foo() { return 1; }
}

class C13847 : B13847
{
    override int foo() { return 2; }

    final void test(int n)
    {
        assert(foo() == n);
        assert(B13847.foo() == 1);
        assert(C13847.foo() == 2);
        assert(this.B13847.foo() == 1);
        assert(this.C13847.foo() == 2);
    }
}

class D13847 : C13847
{
    override int foo() { return 3; }
}

static assert({
    C13847 c = new C13847();
    c.test(2);
    assert(c.B13847.foo() == 1);
    assert(c.C13847.foo() == 2);

    D13847 d = new D13847();
    d.test(3);
    assert(d.B13847.foo() == 1);
    assert(d.C13847.foo() == 2);
    assert(d.D13847.foo() == 3);

    c = d;
    c.test(3);
    assert(c.B13847.foo() == 1);
    assert(c.C13847.foo() == 2);
    return true;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12495
// cast from string to immutable(ubyte)[]

string getStr12495()
{
    char[1] buf = void;                     // dummy starting point.
    string s = cast(string)buf[0..0];       // empty slice, .ptr points mutable.
    assert(buf.ptr == s.ptr);
    s ~= 'a';                               // this should allocate.
    assert(buf.ptr != s.ptr);
    return s.idup;                          // this should allocate again, and
                                            // definitely point immutable memory.
}
auto indexOf12495(string s)
{
    auto p1 = s.ptr;
    auto p2 = (cast(immutable(ubyte)[])s).ptr;
    assert(cast(void*)p1 == cast(void*)p2); // OK <- fails
    return cast(void*)p2 - cast(void*)p1;   // OK <- "cannot subtract pointers ..."
}
static assert(indexOf12495(getStr12495()) == 0);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=13992
// Repainting pointer arithmetic result

enum hash13992 = hashOf13992("abcd".ptr);

@trusted hashOf13992(const void* buf)
{
    auto data = cast(const(ubyte)*) buf;
    size_t hash;
    data += 2;      // problematic pointer arithmetic
    hash += *data;  // CTFE internal issue was shown by the dereference
    return hash;
}

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=13739
// Precise copy for ArrayLiteralExp elements

static assert(
{
    int[] a1 = [13];
    int[][] a2 = [a1];
    assert(a2[0] is a1);            // OK
    assert(a2[0].ptr is a1.ptr);    // OK <- NG

    a1[0] = 1;
    assert(a2[0][0] == 1);  // OK <- NG

    a2[0][0] = 2;
    assert(a1[0] == 2);     // OK <- NG

    return 1;
}());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=14463
// ICE on slice assignment without postblit

struct Boo14463
{
    private int[1] c;
    this(int[] x)
    {
        c = x;
    }
}
immutable Boo14463 a14463 = Boo14463([1]);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=13295
// Don't copy struct literal in VarExp::interpret()

struct S13295
{
    int n;
}

void f13295(ref const S13295 s)
{
    *cast(int*) &s.n = 1;
    assert(s.n == 1);     // OK <- fail
}

static assert(
{
    S13295 s;
    f13295(s);
    return s.n == 1; // true <- false
}());

int foo14061(int[] a)
{
    foreach (immutable x; a)
    {
        auto b = a ~ x;
        return b == [1, 1];
    }
    return 0;
}
static assert(foo14061([1]));

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=14024
// CTFE version

bool test14024()
{
    string op;

    struct S
    {
        char x = 'x';
        this(this) { op ~= x-0x20; }    // upper case
        ~this()    { op ~= x; }         // lower case
    }

    S[4] mem;
    ref S[2] slice(int a, int b) { return mem[a .. b][0 .. 2]; }

    op = null;
    mem[0].x = 'a';
    mem[1].x = 'b';
    mem[2].x = 'x';
    mem[3].x = 'y';
    slice(0, 2) = slice(2, 4);  // [ab] = [xy]
    assert(op == "XaYb", op);

    op = null;
    mem[0].x = 'x';
    mem[1].x = 'y';
    mem[2].x = 'a';
    mem[3].x = 'b';
    slice(2, 4) = slice(0, 2);  // [ab] = [xy]
    assert(op == "XaYb", op);

    op = null;
    mem[0].x = 'a';
    mem[1].x = 'b';
    mem[2].x = 'c';
    slice(0, 2) = slice(1, 3);  // [ab] = [bc]
    assert(op == "BaCb", op);

    op = null;
    mem[0].x = 'x';
    mem[1].x = 'y';
    mem[2].x = 'z';
    slice(1, 3) = slice(0, 2);  // [yz] = [xy]
    assert(op == "YzXy", op);

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

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=14304
// cache of static immutable value

immutable struct Bug14304
{
    string s_name;
    alias s_name this;

    string fun()()
    {
        return "fun";
    }
}
class Buggy14304
{
    static string fun(string str)()
    {
        return str;
    }
    static immutable val = immutable Bug14304("val");
}
void test14304()
{
    enum kt = Buggy14304.fun!(Buggy14304.val);
    static assert(kt == "val");
    enum bt = Buggy14304.val.fun();
    static assert(bt == "fun");
}

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=14371
// evaluate BinAssignExp as lvalue

int test14371()
{
    int x;
    ++(x += 1);
    return x;
}
static assert(test14371() == 2);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=7151
// [CTFE] cannot compare classes with ==

bool test7151()
{
    auto a = new Object;
    return a == a && a != new Object;
}
static assert(test7151());


/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=12603
// [CTFE] goto does not correctly call dtors

struct S12603
{
    this(uint* dtorCalled)
    {
        *dtorCalled = 0;
        this.dtorCalled = dtorCalled;
    }

    @disable this();

    ~this()
    {
        ++*dtorCalled;
    }

    uint* dtorCalled;
}


auto numDtorCallsByGotoWithinScope()
{
    uint dtorCalled;
    {
        S12603 s = S12603(&dtorCalled);
        assert(dtorCalled == 0);
        goto L_abc;
        L_abc:
        assert(dtorCalled == 0);
    }
    assert(dtorCalled == 1);
    return dtorCalled;
}
static assert(numDtorCallsByGotoWithinScope() == 1);


auto numDtorCallsByGotoOutOfScope()
{
    uint dtorCalled;
    {
        S12603 s = S12603(&dtorCalled);
        assert(dtorCalled == 0);
        goto L_abc;
    }
    L_abc:
    assert(dtorCalled == 1);
    return dtorCalled;
}
static assert(numDtorCallsByGotoOutOfScope() == 1);


uint numDtorCallsByGotoDifferentScopeAfter()
{
    uint dtorCalled;
    {
        S12603 s = S12603(&dtorCalled);
        assert(dtorCalled == 0);
    }
    assert(dtorCalled == 1);
    goto L_abc;
    L_abc:
    assert(dtorCalled == 1);
    return dtorCalled;
}
static assert(numDtorCallsByGotoDifferentScopeAfter() == 1);


auto numDtorCallsByGotoDifferentScopeBefore()
{
    uint dtorCalled;
    assert(dtorCalled == 0);
    goto L_abc;
    L_abc:
    assert(dtorCalled == 0);
    {
        S12603 s = S12603(&dtorCalled);
        assert(dtorCalled == 0);
    }
    assert(dtorCalled == 1);
    return dtorCalled;
}
static assert(numDtorCallsByGotoDifferentScopeBefore() == 1);


struct S12603_2
{
    ~this()
    {
        dtorCalled = true;
    }

    bool dtorCalled = false;
}

auto structInCaseScope()
{
    auto charsets = S12603_2();
    switch(1)
    {
    case 0:
        auto set = charsets;
        break;
    default:
        break;
    }
    return charsets.dtorCalled;
}

static assert(!structInCaseScope());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=15233
// ICE in TupleExp, Copy On Write bug

alias TT15233(stuff ...) = stuff;

struct Tok15233 {}
enum tup15233 = TT15233!(Tok15233(), "foo");
static assert(tup15233[0] == Tok15233());
static assert(tup15233[1] == "foo");

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=15251
// void cast in ForStatement.increment

int test15251()
{
    for (ubyte lwr = 19;
        lwr != 20;
        cast(void)++lwr)    // have to to be evaluated with CTFEGoal.Nothing
    {}
    return 1;
}
static assert(test15251());

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=15998
// Sagfault caused by memory corruption

immutable string[2] foo15998 = ["",""];
immutable string[2][] bar15998a = foo15998 ~ baz15998;
immutable string[2][] bar15998b = baz15998 ~ foo15998;

auto baz15998()
{
    immutable(string[2])[] r;
    return r;
}

static assert(bar15998a == [["", ""]]);
static assert(bar15998b == [["", ""]]);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=16094
// Non-overlapped slice assignment on an aggregate

char[] f16094a()
{
    char[] x = new char[](6);
    x[3..6] = x[0..3];
    return x;
}

int[] f16094b()
{
    int[] x = new int[](6);
    x[3..6] = x[0..3];
    return x;
}

enum copy16094a = f16094a();
enum copy16094b = f16094b();

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

bool foo17407()
{
    void delegate ( ) longest_convert;
    return __traits(compiles, longest_convert = &doesNotExists);
}

static assert(!foo17407);

/**************************************************/
// https://issues.dlang.org/show_bug.cgi?id=18057
// Recursive field initializer causes segfault.

struct RBNode(T)
{
    RBNode!T *copy = new RBNode!T;
}

static assert(!__traits(compiles, { alias bug18057 = RBNode!int; }));

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

void test19140()
{
    real f19140();
    static if (__traits(compiles, (){ enum real r = f19140(); })) {}
}

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

struct S19074a { }

struct S19074b
{
    S19074a field;
    this(S19074a) { }

    static const S19074b* data = new S19074b(S19074a());
}

void test19074()
{
    auto var = S19074b.data;
}

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

bool f19447()
{
    int[3] c=1;
    assert(c[0]==1);
    g19447(c[0..2]);
    assert(c[0]!=1); //fails
    assert(c[0]==2);
    return true;
}
void g19447(ref int[2] a)
{
    int[2] b=2;
    a=b;
    //a[]=b;            // works
    //a[] = b[];                // works
    assert(a[0]==2);
}
static assert(f19447());

/***/

char[] mangle19447(char[] dst)
{
   dst.length = 10;
   size_t i = "_D".length;
   dst[0 .. i] = "_D";
   return dst;
}

static char[] x19447 = mangle19447(null);

/***/
enum KindEnum
{
    integer,
    arrayOf
}

struct FullKind
{
    KindEnum[] contents;

    this(KindEnum ) { opAssign; }

    this(KindEnum , FullKind contentKind)
    {
         contents = contentKind.contents;
    }

    void opAssign()
    {
        contents = [];
    }
}

enum fk = FullKind(KindEnum.integer);
enum fk2 = FullKind(KindEnum.arrayOf, fk);

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

int test9937()
{
    import core.math;

    float x = float.max;
    x *= 2;
    x = toPrec!float(x);
    x /= 2;
    assert(x == float.infinity);
    return 1;
}

static assert(test9937());

/************************************************/
// static array .tupleof

struct SArrayTupleEquiv(T)
{
    T f1;
    T f2;
}

// basic .tupleof invariants
bool testSArrayTupleA()
{
    int[2] xs;
    assert(xs.tupleof == TypeTuple!(0, 0));
    assert(xs.tupleof == (cast(int[2])[0, 0]).tupleof);

    xs.tupleof = TypeTuple!(1, 2);
    assert(xs.tupleof == TypeTuple!(1, 2));

    auto ys = SArrayTupleEquiv!int(1, 2);
    assert(xs.tupleof == ys.tupleof);

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

// tuples with side effects
bool testSArrayTupleB()
{
    // Counter records lifetime events in copies/dtors, as a cheap way to check that .tupleof for
    // static arrays exhibit all the same side effects as an equivalent struct's .tupleof
    int[int] copies;
    int[int] dtors;
    struct Counter
    {
        int id = -1;

        this(this)
        {
            copies[id] = copies.get(id, 0) + 1;
        }

        ~this()
        {
            dtors[id] = dtors.get(id, 0) + 1;
        }
    }

    void consume(Counter, Counter) {}
    Counter[2] produce(int id1, int id2)
    {
        return [Counter(id1), Counter(id2)];
    }

    // first sample expected behavior from struct .tupleof
    // braces create a subscope, shortening lifetimes
    {
        auto a = SArrayTupleEquiv!Counter(Counter(0), Counter(1));

        typeof(a) b;
        b.tupleof = a.tupleof;

        Counter x, y;
        TypeTuple!(x, y) = a.tupleof;

        a.tupleof[0] = Counter(2);
        a.tupleof[1] = Counter(3);
        consume(a.tupleof);

        a.tupleof = produce(4, 5).tupleof;
    }
    int[int][2] expected = [copies.dup, dtors.dup];
    copies = null; // .clear is not CTFE friendly
    dtors = null;

    // the real test -- sample behavior of array .tupleof
    {
        Counter[2] a = [Counter(0), Counter(1)];

        typeof(a) b;
        b.tupleof = a.tupleof;

        Counter x, y;
        TypeTuple!(x, y) = a.tupleof;

        a.tupleof[0] = Counter(2);
        a.tupleof[1] = Counter(3);
        consume(a.tupleof);

        a.tupleof = produce(4, 5).tupleof;
    }
    assert(expected[0] == copies);
    assert(expected[1] == dtors);

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