| /* |
| RUN_OUTPUT: |
| --- |
| Success |
| --- |
| */ |
| extern(C) int printf(const char*, ...); |
| |
| void test14040() |
| { |
| uint[] values = [0, 1, 2, 3, 4, 5, 6, 7]; |
| uint offset = 0; |
| |
| auto a1 = values[offset .. offset += 2]; |
| if (a1 != [0, 1] || offset != 2) |
| assert(0); |
| |
| uint[] fun() |
| { |
| offset += 2; |
| return values; |
| } |
| auto a2 = fun()[offset .. offset += 2]; |
| if (a2 != [4, 5] || offset != 6) |
| assert(0); |
| |
| // Also test an offset of type size_t such that it is used |
| // directly without any implicit conversion in the slice expression. |
| size_t offset_szt = 0; |
| auto a3 = values[offset_szt .. offset_szt += 2]; |
| if (a3 != [0, 1] || offset_szt != 2) |
| assert(0); |
| } |
| |
| /******************************************/ |
| |
| int add8ret3(T)(ref T s) |
| { |
| s += 8; |
| return 3; |
| } |
| |
| int mul11ret3(T)(ref T s) |
| { |
| s *= 11; |
| return 3; |
| } |
| |
| void add() |
| { |
| static int test1(int val) { val += add8ret3(val); return val; } |
| assert(test1(1) == (1 + 8 + 3)); |
| static assert(test1(1) == (1 + 8 + 3)); |
| |
| static int test2(int val) { val = val + add8ret3(val); return val; } |
| // FIXME: assert(test2(1) == (1 + 3)); |
| static assert(test2(1) == (1 + 3)); |
| |
| static int test3(int val) { (val += 7) += mul11ret3(val); return val; } |
| assert(test3(2) == (((2+7)*11) + 3)); |
| static assert(test3(2) == (((2+7)*11) + 3)); |
| } |
| |
| void min() |
| { |
| static int test1(int val) { val -= add8ret3(val); return val; } |
| assert(test1(1) == (1 + 8 - 3)); |
| static assert(test1(1) == (1 + 8 - 3)); |
| |
| static int test2(int val) { val = val - add8ret3(val); return val; } |
| // FIXME: assert(test2(1) == (1 - 3)); |
| static assert(test2(1) == (1 - 3)); |
| |
| static int test3(int val) { (val -= 7) -= mul11ret3(val); return val; } |
| assert(test3(2) == (((2-7)*11) - 3)); |
| static assert(test3(2) == (((2-7)*11) - 3)); |
| } |
| |
| void mul() |
| { |
| static int test1(int val) { val *= add8ret3(val); return val; } |
| assert(test1(7) == ((7 + 8) * 3)); |
| static assert(test1(7) == ((7 + 8) * 3)); |
| |
| static int test2(int val) { val = val * add8ret3(val); return val; } |
| // FIXME: assert(test2(7) == (7 * 3)); |
| static assert(test2(7) == (7 * 3)); |
| |
| static int test3(int val) { (val *= 7) *= add8ret3(val); return val; } |
| assert(test3(2) == (((2*7)+8) * 3)); |
| static assert(test3(2) == (((2*7)+8) * 3)); |
| } |
| |
| void xor() |
| { |
| static int test1(int val) { val ^= add8ret3(val); return val; } |
| assert(test1(1) == ((1 + 8) ^ 3)); |
| static assert(test1(1) == ((1 + 8) ^ 3)); |
| |
| static int test2(int val) { val = val ^ add8ret3(val); return val; } |
| // FIXME: assert(test2(1) == (1 ^ 3)); |
| static assert(test2(1) == (1 ^ 3)); |
| |
| static int test3(int val) { (val ^= 7) ^= add8ret3(val); return val; } |
| assert(test3(2) == (((2^7)+8) ^ 3)); |
| static assert(test3(2) == (((2^7)+8) ^ 3)); |
| } |
| |
| void addptr() |
| { |
| static int* test1(int* val) { val += add8ret3(val); return val; } |
| assert(test1(cast(int*)4) == ((cast(int*)4) + 8 + 3)); |
| |
| static int* test2(int* val) { val = val + add8ret3(val); return val; } |
| // FIXME: assert(test2(cast(int*)4) == ((cast(int*)4) + 3)); |
| |
| static int* test3(int* val) { (val += 7) += add8ret3(val); return val; } |
| assert(test3(cast(int*)16) == ((cast(int*)16) + 7 + 8 + 3)); |
| } |
| |
| void lhsCast() |
| { |
| static byte test(byte val) |
| { |
| // lhs type `byte`, rhs type `int` => |
| // rewritten to `cast(int)(cast(int)val += 10) -= mul11ret3(val)` |
| (val += 10) -= mul11ret3(val); |
| return val; |
| } |
| |
| assert(test(1) == ((1 + 10) * 11 - 3)); |
| static assert(test(1) == ((1 + 10) * 11 - 3)); |
| } |
| |
| void shr() |
| { |
| static ubyte test(ubyte val) |
| { |
| // lhs type `ubyte`, rhs type `int` => |
| // rewritten to `cast(int)val >>= 1` |
| // we still want a logical (unsigned) right-shift though |
| val >>= 1; |
| return val; |
| } |
| |
| assert(test(0x80) == 0x40); |
| static assert(test(0x80) == 0x40); |
| } |
| |
| void ldc_github_1617() |
| { |
| add(); |
| min(); |
| mul(); |
| xor(); |
| addptr(); |
| lhsCast(); |
| shr(); |
| } |
| |
| /******************************************/ |
| |
| int main() |
| { |
| test14040(); |
| ldc_github_1617(); |
| |
| printf("Success\n"); |
| return 0; |
| } |