blob: 4d17d33aebfc4bbd703a60aa7b05785b44d39ce0 [file] [log] [blame]
/*
RUNNABLE_PHOBOS_TEST
REQUIRED_ARGS: -mcpu=native
PERMUTE_ARGS: -O -inline
*/
import core.stdc.stdio;
void testgoto()
{
int i;
i = 3;
goto L4;
L3: i++;
goto L5;
L4: goto L3;
L5: assert(i == 4);
}
int testswitch()
{
int i;
i = 3;
switch (i)
{
case 0:
case 1:
default:
assert(0);
case 3:
break;
}
return 0;
}
void testdo()
{
int x = 0;
do
{
x++;
} while (x < 10);
printf("x == %d\n", x);
assert(x == 10);
}
void testbreak()
{ int i, j;
Louter:
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
if (j == 3)
break Louter;
}
}
printf("i = %d, j = %d\n", i, j);
assert(i == 0);
assert(j == 3);
}
///////////////////////
int foo(string s)
{
int i;
i = 0;
switch (s)
{
case "hello":
i = 1;
break;
case "goodbye":
i = 2;
break;
case "goodb":
i = 3;
break;
default:
i = 10;
break;
}
return i;
}
void teststringswitch()
{ int i;
i = foo("hello");
printf("i = %d\n", i);
assert(i == 1);
i = foo("goodbye");
printf("i = %d\n", i);
assert(i == 2);
i = foo("goodb");
printf("i = %d\n", i);
assert(i == 3);
i = foo("huzzah");
printf("i = %d\n", i);
assert(i == 10);
}
///////////////////////
struct Foo
{
int a;
char b;
long c;
}
Foo test(Foo f)
{
f.a += 1;
f.b += 3;
f.c += 4;
return f;
}
void teststrarg()
{
Foo g;
g.a = 1;
g.b = 2;
g.c = 3;
Foo q;
q = test(g);
assert(q.a == 2);
assert(q.b == 5);
assert(q.c == 7);
}
///////////////////////
align (1) struct Foo1
{
align (1):
int a;
char b;
long c;
}
struct Foo2
{
int a;
char b;
long c;
}
struct Foo3
{
int a;
align (1) char b;
long c;
}
struct Foo4
{
int a;
struct { char b; }
long c;
}
void testsizes()
{
printf("%d\n", Foo1.sizeof);
assert(Foo1.a.offsetof == 0);
assert(Foo1.b.offsetof == 4);
assert(Foo1.c.offsetof == 5);
assert(Foo1.sizeof == 13);
assert(Foo2.a.offsetof == 0);
assert(Foo2.b.offsetof == 4);
assert(Foo2.c.offsetof == 8);
assert(Foo2.sizeof == 16);
assert(Foo3.a.offsetof == 0);
assert(Foo3.b.offsetof == 4);
assert(Foo3.c.offsetof == 8);
assert(Foo3.b.sizeof == 1);
assert(Foo3.sizeof == 16);
assert(Foo4.sizeof == 16);
}
///////////////////////
size_t cond11565(size_t val)
{
return val ? size_t.max : 0;
}
void test11565()
{
assert(cond11565(true) == size_t.max);
}
///////////////////////
int[3] array1 = [1:1,2,0:3];
void testarrayinit()
{
assert(array1[0] == 3);
assert(array1[1] == 1);
assert(array1[2] == 2);
}
///////////////////////
void test13023(ulong n)
{
static void func(bool b) {}
ulong k = 0;
func(k >= n / 2);
if (k >= n / 2)
assert(0);
}
///////////////////////
struct U { int a; union { char c; int d; } long b; }
U f = { b:3, d:0x22222222, a:1 };
void testU()
{
assert(f.b == 3);
assert(f.d == 0x22222222);
assert(f.c == 0x22);
assert(f.a == 1);
assert(f.sizeof == 16);
assert(U.sizeof == 16);
}
///////////////////////
void testulldiv()
{
__gshared ulong[4][] vectors =
[
[10,3,3,1],
[10,1,10,0],
[3,10,0,3],
[10,10,1,0],
[10_000_000_000L, 11_000_000_000L, 0, 10_000_000_000L],
[11_000_000_000L, 10_000_000_000L, 1, 1_000_000_000L],
[11_000_000_000L, 11_000_000_000L, 1, 0],
[10_000_000_000L, 10, 1_000_000_000L, 0],
[0x8000_0000_0000_0000, 0x8000_0000_0000_0000, 1, 0],
[0x8000_0000_0000_0001, 0x8000_0000_0000_0001, 1, 0],
[0x8000_0001_0000_0000, 0x8000_0001_0000_0000, 1, 0],
[0x8000_0001_0000_0000, 0x8000_0000_0000_0000, 1, 0x1_0000_0000],
[0x8000_0001_0000_0000, 0x8000_0000_8000_0000, 1, 0x8000_0000],
[0x8000_0000_0000_0000, 0x7FFF_FFFF_FFFF_FFFF, 1, 1],
[0x8000_0000_0000_0000, 0x8000_0000_0000_0001, 0, 0x8000_0000_0000_0000],
[0x8000_0000_0000_0000, 0x8000_0001_0000_0000, 0, 0x8000_0000_0000_0000],
];
for (size_t i = 0; i < vectors.length; i++)
{
ulong q = vectors[i][0] / vectors[i][1];
if (q != vectors[i][2])
printf("[%d] %lld / %lld = %lld, should be %lld\n",
vectors[i][0], vectors[i][1], q, vectors[i][2]);
ulong r = vectors[i][0] % vectors[i][1];
if (r != vectors[i][3])
printf("[%d] %lld %% %lld = %lld, should be %lld\n",
i, vectors[i][0], vectors[i][1], r, vectors[i][3]);
}
}
////////////////////////////////////////////////////////////////////////
uint udiv10(uint x)
{
return x / 10;
}
uint udiv14(uint x)
{
return x / 14;
}
uint udiv14007(uint x)
{
return x / 14007;
}
uint umod10(uint x)
{
return x % 10;
}
uint umod14(uint x)
{
return x % 14;
}
uint umod14007(uint x)
{
return x % 14007;
}
uint uremquo10(uint x)
{
return (x / 10) | (x % 10);
}
uint uremquo14(uint x)
{
return (x / 14) | (x % 14);
}
uint uremquo14007(uint x)
{
return (x / 14007) | (x % 14007);
}
ulong uldiv10(ulong x)
{
return x / 10;
}
ulong uldiv14(ulong x)
{
return x / 14;
}
ulong uldiv14007(ulong x)
{
return x / 14007;
}
ulong ulmod10(ulong x)
{
return x % 10;
}
ulong ulmod14(ulong x)
{
return x % 14;
}
ulong ulmod14007(ulong x)
{
return x % 14007;
}
ulong ulremquo10(ulong x)
{
return (x / 10) | (x % 10);
}
ulong ulremquo14(ulong x)
{
return (x / 14) | (x % 14);
}
ulong ulremquo14007(ulong x)
{
return (x / 14007) | (x % 14007);
}
void testfastudiv()
{
{
static uint x10 = 10;
static uint x14 = 14;
static uint x14007 = 14007;
uint u = 10000;
uint r;
r = udiv10(u); assert(r == u/x10);
r = udiv14(u); assert(r == u/x14);
r = udiv14007(u); assert(r == u/x14007);
r = umod10(u); assert(r == u%x10);
r = umod14(u); assert(r == u%x14);
r = umod14007(u); assert(r == u%x14007);
r = uremquo10(u); assert(r == ((u/10)|(u%x10)));
r = uremquo14(u); assert(r == ((u/14)|(u%x14)));
r = uremquo14007(u); assert(r == ((u/14007)|(u%x14007)));
}
{
static ulong y10 = 10;
static ulong y14 = 14;
static ulong y14007 = 14007;
ulong u = 10000;
ulong r;
r = uldiv10(u); assert(r == u/y10);
r = uldiv14(u); assert(r == u/y14);
r = uldiv14007(u); assert(r == u/y14007);
r = ulmod10(u); assert(r == u%y10);
r = ulmod14(u); assert(r == u%y14);
r = ulmod14007(u); assert(r == u%y14007);
r = ulremquo10(u); assert(r == ((u/10)|(u%y10)));
r = ulremquo14(u); assert(r == ((u/14)|(u%y14)));
r = ulremquo14007(u); assert(r == ((u/14007)|(u%y14007)));
}
}
////////////////////////////////////////////////////////////////////////
void vfunc() {}
void test12095(int k)
{
int e = 0;
e ? k || assert(0) : !e || vfunc();
e ? k || assert(0) : e && vfunc();
!e ? !e || vfunc() : k || assert(0);
}
////////////////////////////////////////////////////////////////////////
bool test3918a( float t, real u )
{
printf("%f\n", u );
return t && u;
}
bool test3918b( real t, float u )
{
printf("%f\n", t );
return t && u;
}
void test3918()
{
assert(test3918a(float.nan, real.nan));
assert(test3918b(real.nan, float.nan));
}
////////////////////////////////////////////////////////////////////////
int div10(int x)
{
return x / 10;
}
int div14(int x)
{
return x / 14;
}
int div14007(int x)
{
return x / 14007;
}
int mod10(int x)
{
return x % 10;
}
int mod14(int x)
{
return x % 14;
}
int mod14007(int x)
{
return x % 14007;
}
int remquo10(int x)
{
return (x / 10) | (x % 10);
}
int remquo14(int x)
{
return (x / 14) | (x % 14);
}
int remquo14007(int x)
{
return (x / 14007) | (x % 14007);
}
////////////////////
int mdiv10(int x)
{
return x / -10;
}
int mdiv14(int x)
{
return x / -14;
}
int mdiv14007(int x)
{
return x / -14007;
}
int mmod10(int x)
{
return x % -10;
}
int mmod14(int x)
{
return x % -14;
}
int mmod14007(int x)
{
return x % -14007;
}
int mremquo10(int x)
{
return (x / -10) | (x % -10);
}
int mremquo14(int x)
{
return (x / -14) | (x % -14);
}
int mremquo14007(int x)
{
return (x / -14007) | (x % -14007);
}
////////////////////
long ldiv10(long x)
{
return x / 10;
}
long ldiv14(long x)
{
return x / 14;
}
long ldiv14007(long x)
{
return x / 14007;
}
long lmod10(long x)
{
return x % 10;
}
long lmod14(long x)
{
return x % 14;
}
long lmod14007(long x)
{
return x % 14007;
}
long lremquo10(long x)
{
return (x / 10) | (x % 10);
}
long lremquo14(long x)
{
return (x / 14) | (x % 14);
}
long lremquo14007(long x)
{
return (x / 14007) | (x % 14007);
}
////////////////////
long mldiv10(long x)
{
return x / -10;
}
long mldiv14(long x)
{
return x / -14;
}
long mldiv14007(long x)
{
return x / -14007;
}
long mlmod10(long x)
{
return x % -10;
}
long mlmod14(long x)
{
return x % -14;
}
long mlmod14007(long x)
{
return x % -14007;
}
long mlremquo10(long x)
{
return (x / -10) | (x % -10);
}
long mlremquo14(long x)
{
return (x / -14) | (x % -14);
}
long mlremquo14007(long x)
{
return (x / -14007) | (x % -14007);
}
void testfastdiv()
{
{
static int x10 = 10;
static int x14 = 14;
static int x14007 = 14007;
int u = 10000;
int r;
r = div10(u); assert(r == u/x10);
r = div14(u); assert(r == u/x14);
r = div14007(u); assert(r == u/x14007);
r = mod10(u); assert(r == u%x10);
r = mod14(u); assert(r == u%x14);
r = mod14007(u); assert(r == u%x14007);
r = remquo10(u); assert(r == ((u/x10)|(u%x10)));
r = remquo14(u); assert(r == ((u/x14)|(u%x14)));
r = remquo14007(u); assert(r == ((u/x14007)|(u%x14007)));
}
{
static int t10 = -10;
static int t14 = -14;
static int t14007 = -14007;
int u = 10000;
int r;
r = mdiv10(u); assert(r == u/t10);
r = mdiv14(u); assert(r == u/t14);
r = mdiv14007(u); assert(r == u/t14007);
r = mmod10(u); assert(r == u%t10);
r = mmod14(u); assert(r == u%t14);
r = mmod14007(u); assert(r == u%t14007);
r = mremquo10(u); assert(r == ((u/t10)|(u%t10)));
r = mremquo14(u); assert(r == ((u/t14)|(u%t14)));
r = mremquo14007(u); assert(r == ((u/t14007)|(u%t14007)));
}
{
static long y10 = 10;
static long y14 = 14;
static long y14007 = 14007;
long u = 10000;
long r;
r = ldiv10(u); assert(r == u/y10);
r = ldiv14(u); assert(r == u/y14);
r = ldiv14007(u); assert(r == u/y14007);
r = lmod10(u); assert(r == u%y10);
r = lmod14(u); assert(r == u%y14);
r = lmod14007(u); assert(r == u%y14007);
r = lremquo10(u); assert(r == ((u/y10)|(u%y10)));
r = lremquo14(u); assert(r == ((u/y14)|(u%y14)));
r = lremquo14007(u); assert(r == ((u/y14007)|(u%y14007)));
}
{
static long z10 = -10;
static long z14 = -14;
static long z14007 = -14007;
long u = 10000;
long r;
r = mldiv10(u); assert(r == u/z10);
r = mldiv14(u); assert(r == u/z14);
r = mldiv14007(u); assert(r == u/z14007);
r = mlmod10(u); assert(r == u%z10);
r = mlmod14(u); assert(r == u%z14);
r = mlmod14007(u); assert(r == u%z14007);
r = mlremquo10(u); assert(r == ((u/z10)|(u%z10)));
r = mlremquo14(u); assert(r == ((u/z14)|(u%z14)));
r = mlremquo14007(u); assert(r == ((u/z14007)|(u%z14007)));
}
}
////////////////////////////////////////////////////////////////////////
T docond1(T)(T l, ubyte thresh, ubyte val) {
l += (thresh < val);
return l;
}
T docond2(T)(T l, ubyte thresh, ubyte val) {
l -= (thresh >= val);
return l;
}
T docond3(T)(T l, ubyte thresh, ubyte val) {
l += (thresh >= val);
return l;
}
T docond4(T)(T l, ubyte thresh, ubyte val) {
l -= (thresh < val);
return l;
}
void testdocond()
{
assert(docond1!ubyte(10,3,5) == 11);
assert(docond1!ushort(10,3,5) == 11);
assert(docond1!uint(10,3,5) == 11);
assert(docond1!ulong(10,3,5) == 11);
assert(docond2!ubyte(10,3,5) == 10);
assert(docond2!ushort(10,3,5) == 10);
assert(docond2!uint(10,3,5) == 10);
assert(docond2!ulong(10,3,5) == 10);
assert(docond3!ubyte(10,3,5) == 10);
assert(docond3!ushort(10,3,5) == 10);
assert(docond3!uint(10,3,5) == 10);
assert(docond3!ulong(10,3,5) == 10);
assert(docond4!ubyte(10,3,5) == 9);
assert(docond4!ushort(10,3,5) == 9);
assert(docond4!uint(10,3,5) == 9);
assert(docond4!ulong(10,3,5) == 9);
assert(docond1!ubyte(10,5,3) == 10);
assert(docond1!ushort(10,5,3) == 10);
assert(docond1!uint(10,5,3) == 10);
assert(docond1!ulong(10,5,3) == 10);
assert(docond2!ubyte(10,5,3) == 9);
assert(docond2!ushort(10,5,3) == 9);
assert(docond2!uint(10,5,3) == 9);
assert(docond2!ulong(10,5,3) == 9);
assert(docond3!ubyte(10,5,3) == 11);
assert(docond3!ushort(10,5,3) == 11);
assert(docond3!uint(10,5,3) == 11);
assert(docond3!ulong(10,5,3) == 11);
assert(docond4!ubyte(10,5,3) == 10);
assert(docond4!ushort(10,5,3) == 10);
assert(docond4!uint(10,5,3) == 10);
assert(docond4!ulong(10,5,3) == 10);
}
////////////////////////////////////////////////////////////////////////
struct S8658
{
int[16385] a;
}
void foo8658(S8658 s)
{
int x;
}
void test8658()
{
S8658 s;
for(int i = 0; i < 1000; i++)
foo8658(s);
}
////////////////////////////////////////////////////////////////////////
uint neg(uint i)
{
return ~i + 1;
}
uint com(uint i)
{
return -i - 1;
}
float com(float i)
{
return -i - 1;
}
uint com2(uint i)
{
return -(i + 1);
}
void testnegcom()
{
assert(neg(3) == -3);
assert(com(3) == -4);
assert(com(3.0f) == -4.0f);
assert(com2(3) == -4);
}
////////////////////////////////////////////////////////////////////////
int oror1(char c)
{
return ((((((((((cast(int) c <= 32 || cast(int) c == 46) || cast(int) c == 44)
|| cast(int) c == 58) || cast(int) c == 59) || cast(int) c == 60)
|| cast(int) c == 62) || cast(int) c == 34) || cast(int) c == 92)
|| cast(int) c == 39) != 0);
}
int oror2(char c)
{
return ((((((((((c <= 32 || c == 46) || c == 44)
|| c == 58) || c == 59) || c == 60)
|| c == 62) || c == 34) || c == 92)
|| c == 39) != 0);
}
void testoror()
{
assert(oror1(0) == 1);
assert(oror1(32) == 1);
assert(oror1(46) == 1);
assert(oror1(44) == 1);
assert(oror1(58) == 1);
assert(oror1(59) == 1);
assert(oror1(60) == 1);
assert(oror1(62) == 1);
assert(oror1(34) == 1);
assert(oror1(92) == 1);
assert(oror1(39) == 1);
assert(oror1(33) == 0);
assert(oror1(61) == 0);
assert(oror1(93) == 0);
assert(oror1(255) == 0);
assert(oror2(0) == 1);
assert(oror2(32) == 1);
assert(oror2(46) == 1);
assert(oror2(44) == 1);
assert(oror2(58) == 1);
assert(oror2(59) == 1);
assert(oror2(60) == 1);
assert(oror2(62) == 1);
assert(oror2(34) == 1);
assert(oror2(92) == 1);
assert(oror2(39) == 1);
assert(oror2(33) == 0);
assert(oror2(61) == 0);
assert(oror2(93) == 0);
assert(oror2(255) == 0);
}
////////////////////////////////////////////////////////////////////////
bool bt1(int p, int a, int b)
{
return p && ((1 << b) & a);
}
bool bt2(int p, long a, long b)
{
return p && ((1L << b) & a);
}
void testbt()
{
assert(bt1(1,7,2) == 1);
assert(bt1(1,7,3) == 0);
assert(bt2(1,0x7_0000_0000,2+32) == 1);
assert(bt2(1,0x7_0000_0000,3+32) == 0);
}
////////////////////////////////////////////////////////////////////////
void test13383()
{
foreach (k; 32..33)
{
if (1L & (1L << k))
{
assert(0);
}
}
}
////////////////////////////////////////////////////////////////////////
int andand1(int c)
{
return (c > 32 && c != 46 && c != 44
&& c != 58 && c != 59
&& c != 60 && c != 62
&& c != 34 && c != 92
&& c != 39) != 0;
}
bool andand2(long c)
{
return (c > 32 && c != 46 && c != 44
&& c != 58 && c != 59
&& c != 60 && c != 62
&& c != 34 && c != 92
&& c != 39) != 0;
}
int foox3() { return 1; }
int andand3(uint op)
{
if (foox3() &&
op != 7 &&
op != 3 &&
op != 18 &&
op != 30 &&
foox3())
return 3;
return 4;
}
void testandand()
{
assert(andand1(0) == 0);
assert(andand1(32) == 0);
assert(andand1(46) == 0);
assert(andand1(44) == 0);
assert(andand1(58) == 0);
assert(andand1(59) == 0);
assert(andand1(60) == 0);
assert(andand1(62) == 0);
assert(andand1(34) == 0);
assert(andand1(92) == 0);
assert(andand1(39) == 0);
assert(andand1(33) == 1);
assert(andand1(61) == 1);
assert(andand1(93) == 1);
assert(andand1(255) == 1);
assert(andand2(0) == false);
assert(andand2(32) == false);
assert(andand2(46) == false);
assert(andand2(44) == false);
assert(andand2(58) == false);
assert(andand2(59) == false);
assert(andand2(60) == false);
assert(andand2(62) == false);
assert(andand2(34) == false);
assert(andand2(92) == false);
assert(andand2(39) == false);
assert(andand2(33) == true);
assert(andand2(61) == true);
assert(andand2(93) == true);
assert(andand2(255) == true);
assert(andand3(6) == 3);
assert(andand3(30) == 4);
}
////////////////////////////////////////////////////////////////////////
bool bittest11508(char c)
{
return c=='_' || c=='-' || c=='+' || c=='.';
}
void testbittest()
{
assert(bittest11508('_'));
}
////////////////////////////////////////////////////////////////////////
uint or1(ubyte x)
{
return x | (x<<8) | (x<<16) | (x<<24) | (x * 3);
}
void testor_combine()
{
printf("%x\n", or1(1));
assert(or1(5) == 5 * (0x1010101 | 3));
}
////////////////////////////////////////////////////////////////////////
int shrshl(int i) {
return ((i+1)>>1)<<1;
}
void testshrshl()
{
assert(shrshl(6) == 6);
assert(shrshl(7) == 8);
}
////////////////////////////////////////////////////////////////////////
struct S1
{
cdouble val;
}
void formatTest(S1 s, double re, double im)
{
assert(s.val.re == re);
assert(s.val.im == im);
}
void test10639()
{
S1 s = S1(3+2.25i);
formatTest(s, 3, 2.25);
}
////////////////////////////////////////////////////////////////////////
bool bt10715(in uint[] ary, size_t bitnum)
{
return !!(ary[bitnum >> 5] & 1 << (bitnum & 31)); // uses bt
}
bool neg_bt10715(in uint[] ary, size_t bitnum)
{
return !(ary[bitnum >> 5] & 1 << (bitnum & 31)); // does not use bt
}
void test10715()
{
static uint[2] a1 = [0x1001_1100, 0x0220_0012];
if ( bt10715(a1,30)) assert(0);
if (!bt10715(a1,8)) assert(0);
if ( bt10715(a1,30+32)) assert(0);
if (!bt10715(a1,1+32)) assert(0);
if (!neg_bt10715(a1,30)) assert(0);
if ( neg_bt10715(a1,8)) assert(0);
if (!neg_bt10715(a1,30+32)) assert(0);
if ( neg_bt10715(a1,1+32)) assert(0);
}
////////////////////////////////////////////////////////////////////////
ptrdiff_t compare12164(A12164* rhsPA, A12164* zis)
{
if (*rhsPA == *zis)
return 0;
return ptrdiff_t.min;
}
struct A12164
{
int a;
}
void test12164()
{
auto a = A12164(3);
auto b = A12164(2);
assert(compare12164(&a, &b));
}
////////////////////////////////////////////////////////////////////////
int foo10678(char[5] txt)
{
return txt[0] + txt[1] + txt[4];
}
void test10678()
{
char[5] hello = void;
hello[0] = 8;
hello[1] = 9;
hello[4] = 10;
int i = foo10678(hello);
assert(i == 27);
}
////////////////////////////////////////////////////////////////////////
struct S12051
{
this(char c)
{
assert(c == 'P' || c == 'M');
}
}
void test12051()
{
auto ip = ["abc"];
foreach (i, s; ip)
{
S12051(i < ip.length ? 'P' : 'M');
}
}
////////////////////////////////////////////////////////////////////////
void bug7565( double x) { assert(x == 3); }
void test7565()
{
double y = 3;
bug7565( y++ );
assert(y == 4);
}
////////////////////////////////////////////////////////////////////////
int bug8525(int[] devt)
{
return devt[$ - 1];
}
////////////////////////////////////////////////////////////////////////
void func13190(int) {}
struct Struct13190
{
ulong a;
uint b;
};
__gshared Struct13190* table13190 =
[
Struct13190(1, 1),
Struct13190(0, 2)
];
void test13190()
{
for (int i = 0; table13190[i].a; i++)
{
ulong tbl = table13190[i].a;
func13190(i);
if (1 + tbl)
{
if (tbl == 0x80000)
return;
}
}
}
////////////////////////////////////////////////////////////////////////
double foo13485(double c, double d)
{
// This must not be optimized to c += (d + d)
c += d;
c += d;
return c;
}
void test13485()
{
enum double d = 0X1P+1023;
assert(foo13485(-d, d) == d);
}
////////////////////////////////////////////////////////////////////////
void test12833a(int a)
{
long x = cast(long)a;
switch (cast(int)(cast(ushort)(x >> 16 & 65535L)))
{
case 1:
{
break;
}
default:
{
assert(0);
}
}
}
void test12833()
{
test12833a(0x1_0000);
}
/***********************************************/
struct Point9449
{
double f = 3.0;
double g = 4.0;
}
void test9449()
{
Point9449[1] arr;
if (arr[0].f != 3.0) assert(0);
if (arr[0].g != 4.0) assert(0);
}
////////////////////////////////////////////////////////////////////////
// https://issues.dlang.org/show_bug.cgi?id=12057
bool prop12057(real x) { return false; }
double f12057(real) { return double.init; }
void test12057()
{
real fc = f12057(real.init);
if (fc == 0 || fc.prop12057) {}
}
////////////////////////////////////////////////////////////////////////
long modulo24 (long ticks)
{
ticks %= 864000000000;
if (ticks < 0)
ticks += 864000000000;
return ticks;
}
void test13784()
{
assert (modulo24(-141600000000) == 722400000000);
}
////////////////////////////////////////////////////////////////////////
struct S13969 {
int x, y;
}
int test13969(const S13969* f) {
return 0 % ((f.y > 0) ? f.x / f.y : f.x / -f.y);
}
////////////////////////////////////////////////////////////////////////
int[] arr14436;
void test14436()
{
assert(arr14436 == null);
arr14436 = [1, 2, 3];
assert(arr14436 != null);
}
////////////////////////////////////////////////////////////////////////
void test14220()
{
auto a = toString(14);
printf("a.ptr = %p, a.length = %d\n", a.ptr, cast(int)a.length);
return;
}
auto toString(int value)
{
uint mValue = value;
char[int.sizeof * 3] buffer = void;
size_t index = buffer.length;
do
{
uint div = cast(int)(mValue / 10);
char mod = mValue % 10 + '0';
buffer[--index] = mod; // Line 22
mValue = div;
} while (mValue);
//printf("buffer.ptr = %p, index = %d\n", buffer.ptr, cast(int)index);
return dup(buffer[index .. $]);
}
char[] dup(char[] a)
{
//printf("a.ptr = %p, a.length = %d\n", a.ptr, cast(int)a.length);
a[0] = 1; // segfault
return a;
}
////////////////////////////////////////////////////////////////////////
int stripLeft(int str, int dc)
{
while (true)
{
int a = str;
int s = a;
str += 1;
if (dc) return s;
}
}
void test14829()
{
if (stripLeft(3, 1) != 3) // fails with -O
assert(0);
}
////////////////////////////////////////////////////////////////////////
void test2()
{
void test(cdouble v)
{
auto x2 = cdouble(v);
assert(x2 == v);
}
test(1.2+3.4i);
}
////////////////////////////////////////////////////////////////////////
void test3()
{
int[6] a;
int[] b;
b = a;
b = (b.ptr + b.length - 5)[0 .. b.ptr + b.length - 1 - a.ptr];
assert(b.ptr == a.ptr + 1);
assert(b.length == 5);
}
////////////////////////////////////////////////////////////////////////
// 14782
void test14782()
{
static struct Foo
{
long a = 8;
int b = 7;
}
static Foo[1] fun() { Foo[1] a; return a; }
auto result = fun();
assert(result[0].a == 8);
assert(result[0].b == 7);
}
////////////////////////////////////////////////////////////////////////
void test14987()
{
static struct Foo
{
int b = 7;
}
static assert((Foo[4]).sizeof == 16);
static Foo[4] fun() { Foo[4] a; return a; }
auto result = fun();
assert(result[0].b == 7);
assert(result[1].b == 7);
assert(result[2].b == 7);
assert(result[3].b == 7);
}
////////////////////////////////////////////////////////////////////////
void[] calloc15272(size_t bc) nothrow pure
{
assert(bc == 1);
return new void[1];
}
void test15272()
{
void[] scache = cast(void[])"abc";
size_t count = 1;
void[]* buckets = &scache;
*buckets = calloc15272(count)[0 .. count];
}
/*****************************************
* https://issues.dlang.org/show_bug.cgi?id=15861
*/
void test15861()
{
double val = 4286853117.;
(){
assert(val == 4286853117.);
}();
}
////////////////////////////////////////////////////////////////////////
// https://issues.dlang.org/show_bug.cgi?id=15629 comment 3
// -O
void test15629()
{
int[] a = [3];
int value = a[0] >= 0 ? a[0] : -a[0];
assert(a[0] == 3);
writeln(value, a);
}
void writeln(int v, int[] a)
{
}
////////////////////////////////////////////////////////////////////////
real binPosPow2() { return 1.0L; }
real binPow2()
{
return 1.0L/binPosPow2();
}
void test4()
{
assert(binPow2() == 1.0L);
}
////////////////////////////////////////////////////////////////////////
// https://issues.dlang.org/show_bug.cgi?id=13474
double sumKBN(double s = 0.0)
{
import std.math : fabs;
double c = 0.0;
foreach(double x; [1, 1e100, 1, -1e100])
{
x = multiply(x);
double t = s + x;
if(s.fabs >= x.fabs)
{
double y = s-t;
c += y+x;
}
else
{
double y = x-t;
c += y+s;
}
s = t;
}
return s + c;
}
double multiply(double a) { return a * 10000; }
void test13474()
{
double r = 20000;
assert(r == sumKBN());
}
////////////////////////////////////////////////////////////////////////
// https://issues.dlang.org/show_bug.cgi?id=16699
ulong[1] parseDateRange()
{
try
{
ulong[1] result;
result[0] = 6;
return result;
}
finally
{
}
}
void test16699()
{
ulong[1] range = parseDateRange();
assert(range[0] == 6);
}
////////////////////////////////////////////////////////////////////////
// https://issues.dlang.org/show_bug.cgi?id=16102
struct S16102 { ~this() { } }
long[1] f16102()
{
S16102 a;
return [1];
}
void test16102()
{
assert( f16102() == [1] );
}
////////////////////////////////////////////////////////////////////////
/* Test the pattern:
* replace ((i / C1) / C2) with (i / (C1 * C2))
* when e1 is 0 or 1 and (i2-i1) is a power of 2.
*/
void divdiv(T, T C1, T C2)(T i)
{
auto a = (i / C1) / C2;
auto b = i / (C1 * C2);
if (a != b) assert(0);
}
void testdivdiv()
{
divdiv!(int,10,20)(30);
divdiv!(uint,10,20)(30);
divdiv!(long,10,20)(30);
divdiv!(ulong,10,20)(30);
divdiv!(int,-10,20)(30);
divdiv!(long,-10,20)(30);
divdiv!(int,-10,-20)(-30);
divdiv!(long,-10,-20)(-30);
}
////////////////////////////////////////////////////////////////////////
void test5a(ulong x, ulong y)
{
int a;
if (x >> 32)
a = 1;
else
a = 2;
assert(a == 1);
if (y >> 32)
a = 1;
else
a = 2;
assert(a == 2);
}
void test5()
{
test5a(uint.max + 1L, uint.max);
}
////////////////////////////////////////////////////////////////////////
/* Test the pattern:
* replace (e ? i1 : i2) with (i1 + e * (i2 - i1))
* when e1 is 0 or 1 and (i2-i1) is a power of 2.
*/
int foo61(int i)
{
return (i % 2 != 0) ? 4 : 2;
}
int foo62(int i)
{
return (i % 2 != 0) ? 2 : 4;
}
bool bar6(bool b) { return b; }
int foo63(bool b)
{
return bar6(b) ? 16 : 8;
}
int foo64(bool b)
{
return bar6(b) ? 8 : 16;
}
void test6()
{
if (foo61(0) != 2) assert(0);
if (foo61(1) != 4) assert(0);
if (foo62(0) != 4) assert(0);
if (foo62(1) != 2) assert(0);
if (foo63(0) != 8) assert(0);
if (foo63(1) != 16) assert(0);
if (foo64(0) != 16) assert(0);
if (foo64(1) != 8) assert(0);
}
////////////////////////////////////////////////////////////////////////
int dataflow(int b) {
int ret;
if (b==4)
ret = 3;
else
ret = 5;
if (ret == 4)
return 0;
else
return 1;
}
void testeqeqranges()
{
int i = dataflow(4);
if (i != 1)
assert(0);
}
////////////////////////////////////////////////////////////////////////
int main()
{
testgoto();
testswitch();
testdo();
testbreak();
teststringswitch();
teststrarg();
test12164();
testsizes();
testarrayinit();
testU();
testulldiv();
testbittest();
test8658();
testfastudiv();
testfastdiv();
test3918();
test12051();
testdocond();
testnegcom();
test11565();
testoror();
testbt();
test12095(0);
testandand();
testor_combine();
testshrshl();
test13383();
test13190();
test13485();
test14436();
test10639();
test10715();
test10678();
test7565();
test13023(0x10_0000_0000);
test12833();
test9449();
test12057();
test13784();
test14220();
test14829();
test2();
test3();
test14782();
test14987();
test15272();
test15861();
test15629();
test4();
test13474();
test16699();
test16102();
testdivdiv();
test5();
test6();
testeqeqranges();
printf("Success\n");
return 0;
}