blob: 0e21e30920e5a19b26d950bd7517cd10338f0c0e [file] [log] [blame]
import core.vararg;
extern(C) int printf(const char*, ...);
/*****************************************/
class A1
{
union
{
struct
{
int x;
public int y;
}
protected int z;
}
}
class A2
{
struct
{
int x;
public int y;
}
}
class A3
{
union
{
int x;
public int y;
}
}
void test1()
{
A1 a1 = new A1();
A2 a2 = new A2();
A3 a3 = new A3();
a1.x = 1;
a1.y = 2;
a1.z = 3;
assert(a1.x == 3);
assert(a1.y == 2);
a2.x = 1;
a2.y = 2;
assert(a2.x == 1);
a3.x = 1;
a3.y = 2;
assert(a3.x == 2);
}
/*****************************************/
struct A4
{
union
{
struct
{
int x = 13;
}
int y;
}
}
void test4()
{
printf("A4.sizeof = %d\n", A4.sizeof);
assert(A4.sizeof == 1 * int.sizeof);
A4 q;
assert(q.y == 13);
}
/*****************************************/
class A5
{
union {
struct {
int x;
}
public int y;
}
}
void test5()
{
A5 a = new A5;
a.x = 3;
a.y = 4;
assert(a.x == 4);
}
/*****************************************/
int i6 = 5;
float m6 = 5.0;
void test6()
{
void f()
{
void i6(float j)
{
m6 = j;
}
void g()
{
i6 = 1;
}
g();
}
f();
printf( "%d %f\n", i6, m6);
assert(i6 == 5);
assert(m6 == 1);
}
/*****************************************/
const int a1 = 50;
const int a2 = 50;
const int a3 = a1 * a2;
const int b1 = a1 - 1;
const int b2 = a2 - 1;
const int c1 = 50*50;
const int c2 = (a1-1)*(a2-1);
const int c3 = b1*b2;
int[4*c1] array1; // illegal!
int[4*c2] array2; // illegal!
int[4*c3] array3; // illegal!
int[a3] array4; // valid! no error!
void test7()
{
assert(a1 == 50);
assert(a2 == 50);
assert(a3 == 2500);
assert(b1 == 49);
assert(b2 == 49);
assert(c1 == 2500);
assert(c2 == 2401);
assert(c3 == 2401);
assert(array1.length == 10000);
assert(array2.length == 9604);
assert(array3.length == 9604);
}
/*****************************************/
struct Foo8
{
static Foo8 bar()
{
Foo8 res;
return res;
}
}
void test8()
{
Foo8[8] x;
x[] = Foo8.bar;
}
/*****************************************/
void test9()
{
try {
} catch (Exception e) {
debug printf("Exception happened\n");
}
}
/*****************************************/
struct Foo10 {
const bool opEquals(const ref Foo10 x) {
return this.normalize is x.normalize;
}
const Foo10 normalize() {
Foo10 res;
return res;
}
}
void test10()
{
}
/*****************************************/
scope class T11
{
this(){}
~this(){}
}
void test11()
{
scope T11 t=new T11();
int i=1;
switch(i)
{
case 1:
break;
default:
break;
}
}
/*****************************************/
void test12()
{
char[] s;
char[] t;
if (true)
s = null;
s = (true) ? null : t;
t = (true) ? s : null;
}
/*****************************************/
class Foo13
{
int init (int x) { return 1; }
static int init (long y) { return 2; }
}
void test13()
{
Foo13 f = new Foo13();
int i;
i = f.init(1);
assert(i == 1);
i = f.init(1L);
assert(i == 2);
}
/*****************************************/
void write14(bool[] c)
{
printf("[%2d]: ", c.length);
foreach (bool x; c)
printf("%d,", x);
printf("\n");
}
void test14()
{
static bool[] a = [ 1, 1, 0, 1, 0 ];
static bool[] b = [ 1, 0, 0, 1 ];
bool[] c = a ~ b;
static bool[] r1 = [1,1,0,1,0,1,0,0,1];
static bool[] r2 = [1,1,0,1,0,1,0,0,1,1,1,0,1,0];
static bool[] r3 = [1,1,0,1,0,1,0,0,1,1,1,0,1,0,0];
static bool[] r4 = [1,1,0,1,0,1,0,0,1,1,1,0,1,0,0,1];
write14(c);
assert(c == r1);
c ~= a;
write14(c);
assert(c == r2);
c ~= 0;
write14(c);
assert(c == r3);
c ~= 1;
write14(c);
assert(c == r4);
}
/*****************************************/
void test15()
{
bool[] b;
bool[] c;
b.length = 10;
c = b[0..4];
c[] = true;
assert(b[0] == true);
assert(b[1] == true);
assert(b[2] == true);
assert(b[3] == true);
assert(b[4] == false);
assert(b[5] == false);
assert(b[6] == false);
assert(b[7] == false);
assert(b[8] == false);
assert(b[9] == false);
}
/*****************************************/
int y16;
class C16
{
new(size_t size, byte blah){
void* v = (new byte[C16.classinfo.initializer.length]).ptr;
y16 = 1;
assert(blah == 3);
return v;
}
int x;
this()
{
x = 4;
}
}
void test16()
{
C16 c = new(3) C16;
assert(y16 == 1);
assert(c.x == 4);
}
/*****************************************/
ubyte* ptr17;
void test17()
{
ubyte[16] foo;
printf("foo = %p\n", foo.ptr);
ptr17 = foo.ptr;
abc17(foo);
}
void abc17(ref ubyte[16] bar)
{
printf("bar = %p\n", bar.ptr);
assert(bar.ptr == ptr17);
}
/*****************************************/
struct Iterator18(T)
{
T* m_ptr;
const bool opEquals(const ref Iterator18 iter)
{
return (m_ptr == iter.m_ptr);
}
const int opCmp(const ref Iterator18 iter)
{
return cast(int)(m_ptr - iter.m_ptr);
}
}
void test18()
{
Iterator18!(int) iter;
}
/*****************************************/
struct S29(T)
{
const bool opEquals(const ref S29!(T) len2)
{
return 0;
}
const int opCmp(const ref S29!(T) len2)
{
return 0;
}
}
void test19()
{
TypeInfo info = typeid(S29!(int));
}
/*****************************************/
class Mapped : Buffer
{
this()
{
}
~this()
{
}
}
class Buffer
{
private uint limit;
private uint capacity;
private uint position;
invariant()
{
assert (position <= limit);
assert (limit <= capacity);
}
}
void test20()
{
Buffer b = new Buffer();
delete b;
}
/*****************************************/
class T21
{
char[1] p1;
char[1] p2;
public:
char[] P() {return p1~p2;}
}
void test21()
{
T21 t = new T21;
t.p1[0] = 'a';
t.p2[0] = 'b';
assert(t.P() == "ab");
}
/*****************************************/
void test22()
{
struct foo1 { int a; int b; int c; }
class foo2
{
foo1[] x;
foo1 fooret(foo1 foo2)
{
x.length = 9;
return x[0] = foo2; // Here
// x[0] = foo2; --- This version does not
// return x[0]; --- cause the error.
}
}
}
/*****************************************/
void test23()
{
float f;
double d;
real r;
if (f > ifloat.max)
goto Loverflow;
if (d > ifloat.max)
goto Loverflow;
if (r > ifloat.max)
goto Loverflow;
if (ifloat.max < f)
goto Loverflow;
if (ifloat.max < d)
goto Loverflow;
if (ifloat.max < r)
goto Loverflow;
return;
Loverflow:
return;
}
/*****************************************/
interface I24 { }
void test24()
{
}
/*****************************************/
interface D25{}
interface C25:D25{}
interface B25:C25{}
interface A25:B25{}
void test25()
{
}
class A26:B26{}
interface B26:C26{}
interface C26:D26{}
interface D26{}
void test26()
{
}
interface A27:B27{}
interface B27:C27{}
interface C27:D27{}
interface D27{}
void test27()
{
}
/*****************************************/
void test28()
{
const double d = -1.0;
int i = cast(int)d;
printf("i = %d\n", i);
assert(-1 == i);
}
/*****************************************/
static int[1][5] array = [[1],[2],[3],[4],[5] ];
void Lookup( int which )
{
switch( which )
{
case 0 : return cast(void)array[which];
default: assert(0);
}
}
void test29()
{
}
/*****************************************/
void test30()
{
double d = 1;
cdouble cd = 1+0i;
assert(cd == 1.0 + 0i);
}
/*****************************************/
void foo31(...)
{
byte b = va_arg!byte(_argptr);
assert(b == 8);
}
void test31()
{
byte x = 9;
foo31(--x);
--x;
foo31(++x);
}
/*****************************************/
template Foo33(T, int L)
{
T[L] arr;
class Bar {
int before = 6;
T[L] arr;
int after = 7;
}
}
void test33()
{
alias Foo33!(int, 100) foo;
foreach (int x; foo.arr)
assert(x == int.init);
foo.Bar bar = new foo.Bar();
foreach (int x; bar.arr)
{ //printf("%d\n", x);
assert(x == int.init);
}
}
/*****************************************/
void test34()
{
bool[1] a;
bool[1] b;
bool[] concat() {
return a~b;
}
a[]=0;
b[]=1;
bool[] arr=concat();
assert(arr.length==2);
assert(arr[0]==0);
assert(arr[1]==1);
}
/*****************************************/
void dummy35(...) {}
void test35()
{
byte x = 9;
dummy35(x);
int y = --x;
assert (y == 8);
assert (x == 8);
}
/*****************************************/
void test36()
{
int[] a;
a.length = 2;
a[0]=1;
a[1]=2;
int[] b;
b.length = 1;
b[0]=3;
a~=b;
assert(a.length==3);
assert(a[0]==1);
assert(a[1]==2);
assert(a[2]==3);
assert(b.length==1);
assert(b[0]==3);
}
/*****************************************/
struct Range{
int width(){
return 1;
}
}
class Container {
Range opIndex(int i){
return data[i];
}
Range[2] data;
}
void test37()
{
Container ranges=new Container;
// fails with -inline
// assert(ranges[0].width() == 1);
}
/*****************************************/
void test38()
{
uint mask = (uint.max >> 1);
assert(mask == (uint.max >> 1));
}
/*****************************************/
void test41()
{
assert(new void[40] == new void[40]);
}
/*****************************************/
void test42()
{
static ubyte[] master = [
0xE3u, 0x83u, 0xAFu, 0xE3u, 0x83u, 0xADu, 0xE3u, 0x82u,
0xB9u, 0xEFu, 0xBDu, 0x97u
];
string string1 = "ワロスw";
string string2 = r"ワロスw";
string string3 = `ワロスw`;
string string4 = x"E3 83 AF E3 83 AD E3 82 B9 EF BD 97";
assert(string1.length==master.length);
for(int i=0; i<master.length; i++){
assert(string1[i]==master[i]);
}
assert(string2.length==master.length);
for(int i=0; i<master.length; i++){
assert(string2[i]==master[i]);
}
assert(string3.length==master.length);
for(int i=0; i<master.length; i++){
assert(string3[i]==master[i]);
}
assert(string4.length==master.length);
for(int i=0; i<master.length; i++){
assert(string4[i]==master[i]);
}
}
/*****************************************/
struct S43
{
int i=1;
}
static S43[3] s= [ 1: { 2 } ];
void test43()
{
assert(s[0].i==1);
assert(s[1].i==2);
assert(s[2].i==1);
}
/*****************************************/
struct S44
{
int i;
}
static S44[12] S44s = [];
void test44()
{
}
/*****************************************/
struct S45
{
double x = 0, y = 0;
static S45 opCall(int i) { S45 r; r.x = i; return r; }
S45 opMul(S45 s)
{
S45 r;
r.x = x * s.x;
r.y = y * s.y;
return r;
}
}
template sqr(F) { F sqr(F x) { return x * x; } }
template pow(F)
{
F pow(F x, int i) {
if (i < 1)
{
static if (is(F : real))
return 1;
else
return F(1);
}
if (i & 1)
{
if (i == 1)
return x;
else
return x * pow(x,i-1);
}
return sqr!(F)(pow(x,i/2));
}
}
void test45()
{
S45 s = S45(10);
S45 val = pow!(S45)(s,2);
printf("x = %2.2lf, y = %2.2lf\n", val.x, val.y);
assert(val.x == 100);
assert(val.y == 0);
double d = pow!(double)(10,3);
printf("%2.2lf\n", d);
assert(d == 1000);
}
/*****************************************/
struct Node46
{
Node46* left,right,parent;
int color = 5;
char[] key;
char[] value;
}
void test46()
{
Node46* x = new Node46;
assert( x.left is null );
assert( x.right is null );
assert( x.parent is null );
assert( x.color is 5 );
assert( x.key is null );
assert( x.value is null );
}
/*****************************************/
void test47()
{
cdouble[] a;
cdouble[] b;
foreach(ref cdouble d; b)
{
d = -a[0];
for(;;){}
}
}
/*****************************************/
string foo48(string s)
{
return s;
}
void test48()
{
char c = '?';
string s;
s = foo48("is this it" ~ c ~ " yep!");
assert(s == "is this it? yep!");
s = foo48("is this it" ~ c);
assert(s == "is this it?");
s = foo48(c ~ "is this it");
assert(s == "?is this it");
}
/*****************************************/
char[10] foo49 = void;
void test49()
{
int i = void;
//printf("i = %d\n", i);
int[10] a = void;
foreach (int x; a)
{
printf("\tx = %d\n", x);
}
}
/*****************************************/
void foo50(string s) { assert(s == "is this it? yep!"); }
void test50()
{
char c = '?';
foo50("is this it"~c~" yep!");
}
/*****************************************/
void test51()
{
bool[9][3] qwert;
printf("qwert.sizeof = %d\n", qwert.sizeof);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 9; j++)
assert(qwert[i][j] == false);
version (D_Bits)
assert(qwert.sizeof == 12);
else
assert(qwert.sizeof == 27);
qwert[0][3] = true;
qwert[0][5] = true;
qwert[0][7] = true;
qwert[1..3] = qwert[0];
for (int i = 0; i < 3; i++)
{
assert(qwert[i][0] == false);
assert(qwert[i][1] == false);
assert(qwert[i][2] == false);
assert(qwert[i][3] == true);
assert(qwert[i][4] == false);
assert(qwert[i][5] == true);
assert(qwert[i][6] == false);
assert(qwert[i][7] == true);
assert(qwert[i][8] == false);
}
}
/*****************************************/
void test52()
{
size_t vsize = void.sizeof;
assert(vsize == 1);
}
/*****************************************/
const char[3][13] month = [
1: "Jan", "Feb", "Mar", "Apr", "May", "Jun",
8: "Aug", "Sep", "Oct", "Nov", "Dec"
];
void test53()
{
printf("%.*s\n", month[1].length, month[1].ptr);
printf("%.*s\n", month[2].length, month[2].ptr);
printf("%.*s\n", month[3].length, month[3].ptr);
printf("%.*s\n", month[4].length, month[4].ptr);
printf("%.*s\n", month[5].length, month[5].ptr);
printf("%.*s\n", month[6].length, month[6].ptr);
printf("%.*s\n", month[8].length, month[8].ptr);
assert(month[1] == "Jan");
assert(month[2] == "Feb");
assert(month[3] == "Mar");
assert(month[4] == "Apr");
assert(month[5] == "May");
assert(month[6] == "Jun");
assert(month[8] == "Aug");
assert(month[9] == "Sep");
assert(month[10] == "Oct");
assert(month[11] == "Nov");
assert(month[12] == "Dec");
assert(month[0][0] == 0xFF);
assert(month[0][1] == 0xFF);
assert(month[0][2] == 0xFF);
assert(month[7][0] == 0xFF);
assert(month[7][1] == 0xFF);
assert(month[7][2] == 0xFF);
}
/*****************************************/
struct S54
{
static S54 foo()
{
S54 s;
with (s) {} // bug
return s;
}
static S54 bar()
{
return S54.foo() * S54.foo();
}
S54 opMul(S54 s)
{
return s;
}
}
void test54()
{
S54.bar();
}
/*****************************************/
void test55()
{
char c = 'a';
char[] str, uvw;
str = str ~ c;
uvw = c ~ uvw;
printf("%.*s\n", str.length, str.ptr);
assert(str == "a");
assert(uvw == "a");
c = 'b';
printf("%.*s\n", str.length, str.ptr);
assert(str == "a");
assert(uvw == "a");
}
/*****************************************/
void test56()
{
char[4] a, b;
a[] = 'a'; b[] = 'a';
for (int i = 0; i < 4; i++)
{
assert(a[i] == 'a');
assert(b[i] == 'a');
}
a[] = b[] = 'b';
for (int i = 0; i < 4; i++)
{
assert(a[i] == 'b');
assert(b[i] == 'b');
}
}
/*****************************************/
void test57()
{
char[] a;
char[] b;
a = a ~ 'x';
assert(a == "x");
b = 'c' ~ a ~ 'b';
assert(b == "cxb");
}
/*****************************************/
struct Foo58
{
ubyte a, b, c;
}
void test58()
{
Foo58 d;
foobar58(d);
return cast(void)0;
}
void foobar58(Foo58 e) {}
/*****************************************/
void foo59(string s)
{
assert(s == "hello");
}
void foo59(wstring s)
{
assert(s == "baby");
}
void foo59(dstring s)
{
assert(s == "jane");
}
void test59()
{
string h = "hello"c;
wstring b = "baby"w;
dstring j = "jane"d;
//writefln("%s %s %s", h, b, j);
foo59(h);
foo59("hello"c);
foo59(b);
foo59("baby"w);
foo59(j);
foo59("jane"d);
}
/*****************************************/
class C60
{
static const int x;
const int y;
void foo()
{
}
static this()
{
x = 5;
}
this()
{
y = 7;
}
}
const int z60;
static this()
{
z60 = 3;
}
void test60()
{
C60 c = new C60();
assert(c.x == 5);
assert(c.y == 7);
assert(z60 == 3);
}
/*****************************************/
void foo61(real[] arr)
{
// i = 0 doesn't trigger the bug, everything bigger seems to
// also, making this const fixes the bug
size_t i = 1;
for (size_t j = i; j >= i; j -= i)
{
// interesting results follow from this:
printf("%d ", i);
// it prints a _lot_ of ones
arr[j] = arr[j - i];
}
}
void test61()
{
real[] array;
array.length = 2; // whatever, as long as it's more than 1
foreach (ref real i; array)
i = 1; // just something
foo61(array);
}
/*****************************************/
void bug7493()
{
string str = "abcde";
const(void) [][1] arr = [str];
assert(arr[0].length == str.length);
const(void) [][1] arr2;
arr2 = [str];
assert(arr[0].length == str.length);
}
/*****************************************/
int main()
{
test1();
test4();
test5();
test6();
test7();
test8();
test9();
test10();
test11();
test12();
test13();
test14();
test15();
test16();
test17();
test18();
test19();
test20();
test21();
test22();
test23();
test24();
test25();
test26();
test27();
test28();
test29();
test30();
test31();
test33();
test34();
test35();
test36();
test37();
test38();
test41();
test42();
test43();
test44();
test45();
test46();
test47();
test48();
test49();
test50();
test51();
test52();
test53();
test54();
test55();
test56();
test57();
test58();
test59();
test60();
test61();
bug7493();
printf("Success\n");
return 0;
}