mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 13:10:12 +03:00
196 lines
4.8 KiB
D
196 lines
4.8 KiB
D
/*
|
|
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;
|
|
}
|
|
|
|
auto cat11ret3(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 cat()
|
|
{
|
|
static auto test1(int[] val) { val ~= cat11ret3(val); return val; }
|
|
assert(test1([1]) == [1, 11, 3]);
|
|
static assert(test1([1]) == [1, 11, 3]);
|
|
|
|
static auto test2(int[] val) { val = val ~ cat11ret3(val); return val; }
|
|
// FIXME: assert(test2([1]) == [1, 3]);
|
|
static assert(test2([1]) == [1, 3]);
|
|
|
|
static auto test3(int[] val) { (val ~= 7) ~= cat11ret3(val); return val; }
|
|
assert(test3([2]) == [2, 7, 11, 3]);
|
|
static assert(test3([2]) == [2, 7, 11, 3]);
|
|
|
|
static auto test4(int[] val) { (val ~= cat11ret3(val)) ~= 7; return val; }
|
|
assert(test4([2]) == [2, 11, 3, 7]);
|
|
static assert(test4([2]) == [2, 11, 3, 7]);
|
|
}
|
|
|
|
void ldc_github_1617()
|
|
{
|
|
add();
|
|
min();
|
|
mul();
|
|
xor();
|
|
addptr();
|
|
lhsCast();
|
|
shr();
|
|
cat();
|
|
}
|
|
|
|
/******************************************/
|
|
|
|
int main()
|
|
{
|
|
test14040();
|
|
ldc_github_1617();
|
|
|
|
printf("Success\n");
|
|
return 0;
|
|
}
|