(root)/
gcc-13.2.0/
gcc/
testsuite/
gdc.test/
runnable/
test7.d
// PERMUTE_ARGS:

// Test memset style array assignments.

extern(C) int printf(const char*, ...);

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

char[] b1;

char[] func1(int dim)
{
    char[] a = new char[dim];

    b1 = a;
    return a;
}

void test1()
{
    printf("test1()\n");
    int i;
    int j;

    char[1] a1;
    a1[] = 'x';
    assert(a1[0] == 'x');

    char[2] a2;
    a2[] = 'x';
    for (i = 0; i < a2.length; i++)
        assert(a2[i] == 'x');

    char[3] a3;
    a3[] = 'x';
    for (i = 0; i < a3.length; i++)
        assert(a3[i] == 'x');

    char[4] a4;
    a4[] = 'x';
    for (i = 0; i < a4.length; i++)
        assert(a4[i] == 'x');

    char[8] a8;
    a8[] = 'x';
    for (i = 0; i < a8.length; i++)
        assert(a8[i] == 'x');

    char[27] a27;
    a27[] = 'x';
    for (i = 0; i < a27.length; i++)
        assert(a27[i] == 'x');

    func1(33)[] = 'y';
    for (i = 0; i < b1.length; i++)
        assert(b1[i] == 'y');


    char[23] a23 = 'x';
    i = 16;
    j = 18;
    a23[i++..++j] = 'c';
    printf("i = %d, j = %d\n", i, j);
    assert(i == 17);
    assert(j == 19);
    assert(a23[15] == 'x');
    assert(a23[16] == 'c');
    assert(a23[17] == 'c');
    assert(a23[18] == 'c');
    assert(a23[19] == 'x');
    assert(a23[20] == 'x');
}

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

short[] b2;

short[] func2(int dim)
{
    short[] a = new short[dim];

    b2 = a;
    return a;
}

void test2()
{
    printf("test2()\n");
    int i;
    int j;

    short[1] a1;
    a1[] = 0x1234;
    assert(a1[0] == 0x1234);

    short[2] a2;
    a2[] = 0x1234;
    for (i = 0; i < a2.length; i++)
        assert(a2[i] == 0x1234);

    short[3] a3;
    a3[] = 0x1234;
    for (i = 0; i < a3.length; i++)
        assert(a3[i] == 0x1234);

    short[4] a4;
    a4[] = 0x1234;
    for (i = 0; i < a4.length; i++)
        assert(a4[i] == 0x1234);

    short[8] a8;
    a8[] = 0x1234;
    for (i = 0; i < a8.length; i++)
        assert(a8[i] == 0x1234);

    short[27] a27;
    a27[] = 0x1234;
    for (i = 0; i < a27.length; i++)
        assert(a27[i] == 0x1234);

    func2(33)[] = 0x5678;
    for (i = 0; i < b2.length; i++)
        assert(b2[i] == 0x5678);


    short[23] a23 = 0x1234;
    i = 16;
    j = 18;
    a23[i++..++j] = 0x4554;
    printf("i = %d, j = %d\n", i, j);
    assert(i == 17);
    assert(j == 19);
    assert(a23[15] == 0x1234);
    assert(a23[16] == 0x4554);
    assert(a23[17] == 0x4554);
    assert(a23[18] == 0x4554);
    assert(a23[19] == 0x1234);
    assert(a23[20] == 0x1234);
}

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

int[] b3;

int[] func3(int dim)
{
    int[] a = new int[dim];

    b3 = a;
    return a;
}

void test3()
{
    printf("test3()\n");
    int i;
    int j;

    int[1] a1;
    a1[] = 0x12345678;
    assert(a1[0] == 0x12345678);

    int[2] a2;
    a2[] = 0x12345678;
    for (i = 0; i < a2.length; i++)
        assert(a2[i] == 0x12345678);

    int[3] a3;
    a3[] = 0x12345678;
    for (i = 0; i < a3.length; i++)
        assert(a3[i] == 0x12345678);

    int[4] a4;
    a4[] = 0x12345678;
    for (i = 0; i < a4.length; i++)
        assert(a4[i] == 0x12345678);

    int[8] a8;
    a8[] = 0x12345678;
    for (i = 0; i < a8.length; i++)
        assert(a8[i] == 0x12345678);

    int[27] a27;
    a27[] = 0x12345678;
    for (i = 0; i < a27.length; i++)
        assert(a27[i] == 0x12345678);

    func3(33)[] = 0x56781234;
    for (i = 0; i < b3.length; i++)
        assert(b3[i] == 0x56781234);


    int[23] a23 = 0x12345678;
    i = 16;
    j = 18;
    a23[i++..++j] = 0x45546776;
    printf("i = %d, j = %d\n", i, j);
    assert(i == 17);
    assert(j == 19);
    assert(a23[15] == 0x12345678);
    assert(a23[16] == 0x45546776);
    assert(a23[17] == 0x45546776);
    assert(a23[18] == 0x45546776);
    assert(a23[19] == 0x12345678);
    assert(a23[20] == 0x12345678);
}

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

long[] b4;

long[] func4(int dim)
{
    long[] a = new long[dim];

    b4 = a;
    return a;
}

void test4()
{
    printf("test4()\n");
    int i;
    int j;

    long[1] a1;
    a1[] = 0x123456789ABCDEF0;
    assert(a1[0] == 0x123456789ABCDEF0);

    long[2] a2;
    a2[] = 0x123456789ABCDEF0;
    for (i = 0; i < a2.length; i++)
        assert(a2[i] == 0x123456789ABCDEF0);

    long[3] a3;
    a3[] = 0x123456789ABCDEF0;
    for (i = 0; i < a3.length; i++)
        assert(a3[i] == 0x123456789ABCDEF0);

    long[4] a4;
    a4[] = 0x123456789ABCDEF0;
    for (i = 0; i < a4.length; i++)
        assert(a4[i] == 0x123456789ABCDEF0);

    long[8] a8;
    a8[] = 0x123456789ABCDEF0;
    for (i = 0; i < a8.length; i++)
        assert(a8[i] == 0x123456789ABCDEF0);

    long[27] a27;
    a27[] = 0x123456789ABCDEF0;
    for (i = 0; i < a27.length; i++)
        assert(a27[i] == 0x123456789ABCDEF0);

    func4(33)[] = 0x5678889911223344;
    for (i = 0; i < b4.length; i++)
        assert(b4[i] == 0x5678889911223344);


    long[23] a23 = 0x123456789ABCDEF0;
    i = 16;
    j = 18;
    a23[i++..++j] = 0x567888991122334B;
    printf("i = %d, j = %d\n", i, j);
    assert(i == 17);
    assert(j == 19);
    assert(a23[15] == 0x123456789ABCDEF0);
    assert(a23[16] == 0x567888991122334B);
    assert(a23[17] == 0x567888991122334B);
    assert(a23[18] == 0x567888991122334B);
    assert(a23[19] == 0x123456789ABCDEF0);
    assert(a23[20] == 0x123456789ABCDEF0);
}

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

real[] b5;

real[] func5(int dim)
{
    real[] a = new real[dim];

    b5 = a;
    return a;
}

void test5()
{
    printf("test5()\n");
    int i;
    int j;

    real[1] a1;
    a1[] = 31234;
    assert(a1[0] == 31234);

    real[2] a2;
    a2[] = 31234;
    for (i = 0; i < a2.length; i++)
        assert(a2[i] == 31234);

    real[3] a3;
    a3[] = 31234;
    for (i = 0; i < a3.length; i++)
        assert(a3[i] == 31234);

    real[4] a4;
    a4[] = 31234;
    for (i = 0; i < a4.length; i++)
        assert(a4[i] == 31234);

    real[8] a8;
    a8[] = 31234;
    for (i = 0; i < a8.length; i++)
        assert(a8[i] == 31234);

    real[27] a27;
    a27[] = 31234;
    for (i = 0; i < a27.length; i++)
        assert(a27[i] == 31234);

    func5(33)[] = 35678;
    for (i = 0; i < b5.length; i++)
        assert(b5[i] == 35678);


    real[23] a23 = 31234;
    i = 16;
    j = 18;
    a23[i++..++j] = 34554e+4;
    printf("i = %d, j = %d\n", i, j);
    assert(i == 17);
    assert(j == 19);
    assert(a23[15] == 31234);
    assert(a23[16] == 34554e+4);
    assert(a23[17] == 34554e+4);
    assert(a23[18] == 34554e+4);
    assert(a23[19] == 31234);
    assert(a23[20] == 31234);
}

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

struct ABC
{
    int a,b,c,d;
}

ABC abc1 = { a:1, b:2, c:3, d:4 };
ABC abc2 = { a:7, b:6, c:8, d:9 };
ABC abc3 = { a:5, b:10, c:11, d:12 };

ABC[] b6;

ABC[] func6(int dim)
{
    ABC[] a = new ABC[dim];

    b6 = a;
    return a;
}

void test6()
{
    printf("test6()\n");
    int i;
    int j;

    ABC[1] a1;
    a1[] = abc1;
    assert(a1[0] == abc1);

    ABC[2] a2;
    a2[] = abc1;
    for (i = 0; i < a2.length; i++)
        assert(a2[i] == abc1);

    ABC[3] a3;
    a3[] = abc1;
    for (i = 0; i < a3.length; i++)
        assert(a3[i] == abc1);

    ABC[4] a4;
    a4[] = abc1;
    for (i = 0; i < a4.length; i++)
        assert(a4[i] == abc1);

    ABC[8] a8;
    a8[] = abc1;
    for (i = 0; i < a8.length; i++)
        assert(a8[i] == abc1);

    ABC[27] a27;
    a27[] = abc1;
    for (i = 0; i < a27.length; i++)
        assert(a27[i] == abc1);

    func6(33)[] = abc2;
    for (i = 0; i < b6.length; i++)
        assert(b6[i] == abc2);


    ABC[23] a23 = abc1;
    i = 16;
    j = 18;
    a23[i++..++j] = abc3;
    printf("i = %d, j = %d\n", i, j);
    assert(i == 17);
    assert(j == 19);
    assert(a23[15] == abc1);
    assert(a23[16] == abc3);
    assert(a23[17] == abc3);
    assert(a23[18] == abc3);
    assert(a23[19] == abc1);
    assert(a23[20] == abc1);
}

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

bool[] b7;

bool[] func7(int dim)
{
    bool[] a = new bool[dim];

    b7 = a;
    return a;
}

void test7()
{
    printf("test7()\n");
    int i;
    int j;

    bool[1] a1;
    a1[] = 1;
    assert(a1[0] == 1);

    bool[2] a2;
    a2[] = 1;
    for (i = 0; i < a2.length; i++)
        assert(a2[i] == 1);

    bool[3] a3;
    a3[] = 1;
    for (i = 0; i < a3.length; i++)
        assert(a3[i] == 1);

    bool[4] a4;
    a4[] = 1;
    for (i = 0; i < a4.length; i++)
        assert(a4[i] == 1);

    bool[8] a8;
    a8[] = 1;
    for (i = 0; i < a8.length; i++)
        assert(a8[i] == 1);

    bool[27] a27;
    a27[] = 1;
    for (i = 0; i < a27.length; i++)
        assert(a27[i] == 1);

    func7(33)[] = 1;
    assert(b7.length == 33);
    for (i = 0; i < b7.length; i++)
        assert(b7[i] == 1);

    func7(33)[3..6] = 1;
    //printf("b7.ptr = %p, b7.length = %d\n", b7.ptr, b7.length);
    assert(b7.length == 33);
    for (i = 0; i < b7.length; i++)
    {
        //printf("b7[%d] = %d\n", i, b7[i]);
        if (i >= 3 && i < 6)
            assert(b7[i] == 1);
        else
            assert(b7[i] == 0);
    }

    bool[23] a23 = 1;
    i = 16;
    j = 18;
    a23[i++..++j] = 0;
    printf("i = %d, j = %d\n", i, j);
    assert(i == 17);
    assert(j == 19);
    assert(a23[15] == 1);
    assert(a23[16] == 0);
    assert(a23[17] == 0);
    assert(a23[18] == 0);
    assert(a23[19] == 1);
    assert(a23[20] == 1);

}

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

bool[] slice8(bool[] b)
{
    return b[8..16];
}

void test8()
{
    bool[16] b;
    bool[] b2;
    b[9] = true;
    b2 = slice8(b);
    assert(b2.length == 8);
    assert(b2[1] == true);
    b[9] = false;
    assert(b2[1] == false);
}


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

bool[] slice9(bool[] b, int i, int j)
{
    return b[i..j];
}

void test9()
{
    bool[17] b;
    bool[] b2;
    b[9] = true;
    b[16] = true;
    b2 = slice9(b,8,17);
    assert(b2.length == 9);
    assert(b2[1] == true);
    assert(b2[8] == true);
    b[9] = false;
    b[16] = false;
    assert(b2[1] == false);
    assert(b2[8] == false);
}


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

bool* foo10(bool[] b, int i)
{
    return &b[i];
}

void test10()
{
    bool[17] b;
    bool* pb;

    b[8] = true;
    b[9] = true;
    pb = foo10(b, 8);
    assert(*pb == true);
    b[8] = false;
    assert(*pb == false);
}

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

bool* foo11(bool[] b, int i)
{
    return &b[i];
}

void test11()
{
    bool[17] b;
    bool* pb;

    b[9] = true;
    b[10] = true;
    pb = foo11(b, 8);
    assert(pb[1] == true);
    b[9] = false;
    assert(pb[1] == false);
}


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

bool* foo12(bool[] b, int i)
{
    return &b[i];
}

void test12()
{
    bool[17] b;
    bool* pb;

    b[9] = true;
    b[10] = true;
    pb = foo12(b, 0);
    pb = pb + 8;
    assert(pb[1] == true);
    b[9] = false;
    assert(pb[1] == false);
}

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

bool* foo13(bool* b, int i)
{
    return &b[i];
}

void test13()
{
    bool[17] b;
    bool* pb;

    b[9] = true;
    b[10] = true;
    pb = foo13(b.ptr, 8);
    assert(pb[1] == true);
    b[9] = false;
    assert(pb[1] == false);
}

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

void test14()
{
    bool b = true;
    assert(b);
    b = !b;
    assert(!b);
}

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

void test15()
{
   bool b = 1;
   bool *pb = &b;
   *pb = false;
   assert(!b);
}


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

void foo16(bool[] b1, bool[] b2)
{
    b1[0..3] = b2[8..11];
}

void test16()
{
    static bool[16] b1 = [1,1,0,1,0,0,0,0];
    static bool[16] b2 = [0,0,0,0,0,0,0,0, 0,0,1,0,1,1,1,1];

    foo16(b1, b2);
    assert(b1[0] == false);
    assert(b1[1] == false);
    assert(b1[2] == true);
    assert(b1[3] == true);
    assert(b1[4] == false);
    assert(b1[5] == false);
    assert(b1[6] == false);
    assert(b1[7] == false);
    assert(b1[8] == false);
}

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

void test17()
{
  bool bi = true;
  byte by;

  by=bi;
  assert(by == 1);
}


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

void test18()
{
    bool b = 1;
    bool c = 1;
    b |= cast(bool)(3 + c);
    assert(b == true);
}


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

void test19()
{
        int i;
        for (i = 0; i < 10; i++){
                version(dummy) i=22;
        }
        assert(i==10);

        char[][] args;
        foreach(char[] p; args){
                version(dummy) int i;
        }
}

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

int main()
{
    test1();
    test2();
    test3();
    test4();
    test5();
    test6();
    test7();
    test8();
    test9();
    test10();
    test11();
    test12();
    test13();
    test14();
    test15();
    test16();
    test17();
    test18();
    test19();

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