// PERMUTE_ARGS: // REQUIRED_ARGS: import core.exception; import core.stdc.math; import core.vararg; extern(C) { int atoi(const char*); int memcmp(const void*, const void*, size_t); int printf(const char*, ...); } int cmp(const(char)[] s1, const(char)[] s2) { assert(s1.length == s2.length); return memcmp(s1.ptr, s2.ptr, s1.length); } /* ================================ */ void test1() { int i; int[6] foo = 1; for (i = 0; i < foo.length; i++) assert(foo[i] == 1); int[10] bar; for (i = 0; i < bar.length; i++) assert(bar[i] == 0); foo[3] = 4; int[6] abc = foo; for (i = 0; i < abc.length; i++) assert(abc[i] == foo[i]); abc[2] = 27; foo[] = abc; for (i = 0; i < abc.length; i++) assert(abc[i] == foo[i]); } /* ================================ */ void test2() { byte[5] foo1; ubyte[6] foo2; short[7] foo3; ushort[8] foo4; int[9] foo5; uint[10] foo6; long[11] foo7; ulong[12] foo8; float[13] foo9; double[14] foo10; real[15] foo11; int i; printf("test2()\n"); for (i = 0; i < foo1.length; i++) assert(foo1[i] == 0); for (i = 0; i < foo2.length; i++) { printf("foo2[%d] = %d\n", i, foo2[i]); assert(foo2[i] == 0); } for (i = 0; i < foo3.length; i++) assert(foo3[i] == 0); for (i = 0; i < foo4.length; i++) assert(foo4[i] == 0); for (i = 0; i < foo5.length; i++) { printf("foo5[%d] = %d\n", i, foo5[i]); assert(foo5[i] == 0); } for (i = 0; i < foo6.length; i++) assert(foo6[i] == 0); for (i = 0; i < foo7.length; i++) assert(foo7[i] == 0); for (i = 0; i < foo8.length; i++) assert(foo8[i] == 0); for (i = 0; i < foo9.length; i++) assert(isnan(foo9[i])); for (i = 0; i < foo10.length; i++) assert(isnan(foo10[i])); for (i = 0; i < foo11.length; i++) assert(isnan(foo11[i])); } /* ================================ */ void test3() { byte[5] foo1 = 20; ubyte[6] foo2 = 21; short[7] foo3 = 22; ushort[8] foo4 = 23; int[9] foo5 = 24; uint[10] foo6 = 25; long[11] foo7 = 26; ulong[12] foo8 = 27; float[13] foo9 = 28; double[14] foo10 = 29; real[15] foo11 = 30; int i; for (i = 0; i < foo1.length; i++) assert(foo1[i] == 20); for (i = 0; i < foo2.length; i++) assert(foo2[i] == 21); for (i = 0; i < foo3.length; i++) assert(foo3[i] == 22); for (i = 0; i < foo4.length; i++) assert(foo4[i] == 23); for (i = 0; i < foo5.length; i++) assert(foo5[i] == 24); for (i = 0; i < foo6.length; i++) assert(foo6[i] == 25); for (i = 0; i < foo7.length; i++) assert(foo7[i] == 26); for (i = 0; i < foo8.length; i++) assert(foo8[i] == 27); for (i = 0; i < foo9.length; i++) assert(foo9[i] == 28); for (i = 0; i < foo10.length; i++) assert(foo10[i] == 29); for (i = 0; i < foo11.length; i++) assert(foo11[i] == 30); } /* ================================ */ struct a4 { string b = "string"; int c; } void test4() { a4 a; int i; assert(a.b.length == 6); i = cmp(a.b, "string"); assert(i == 0); a4[3] c; int j; for (j = 0; j < 3; j++) { assert(c[j].b.length == 6); i = cmp(c[j].b, "string"); assert(i == 0); } } /* ================================ */ float f5; const char[4] x5 = "abcd"; struct a5 { string b = "string"; int c; } a5[5] foo5; void test5() { printf("test5()\n"); assert(isnan(f5)); assert(cmp(x5, "abcd") == 0); int i; for (i = 0; i < 5; i++) { assert(foo5[i].c == 0); assert(cmp(foo5[i].b, "string") == 0); } } /* ================================ */ struct TRECT6 { int foo1 = 2; union { struct { int Left = 3, Top = 4, Right = 5, Bottom = 6; } struct { long TopLeft, BottomRight; } } int foo2 = 7; } void test6() { TRECT6 t; assert(t.foo1 == 2); assert(t.Left == 3); assert(t.Top == 4); assert(t.Right == 5); assert(t.Bottom == 6); assert(t.foo2 == 7); assert(&t.foo1 < &t.Left); assert(&t.Bottom < &t.foo2); assert(TRECT6.foo1.offsetof == 0); static if (long.alignof == 8) { assert(TRECT6.Left.offsetof == 8); assert(TRECT6.Top.offsetof == 12); assert(TRECT6.Right.offsetof == 16); assert(TRECT6.Bottom.offsetof == 20); assert(TRECT6.TopLeft.offsetof == 8); assert(TRECT6.BottomRight.offsetof == 16); assert(TRECT6.foo2.offsetof == 24); } else { assert(TRECT6.Left.offsetof == 4); assert(TRECT6.Top.offsetof == 8); assert(TRECT6.Right.offsetof == 12); assert(TRECT6.Bottom.offsetof == 16); assert(TRECT6.TopLeft.offsetof == 4); assert(TRECT6.BottomRight.offsetof == 12); assert(TRECT6.foo2.offsetof == 20); } } /* ================================ */ struct TestVectors { string pattern; string input; string result; string format; string replace; }; TestVectors[] tva = [ { pattern:"(a)\\1", input:"abaab", result:"y", format:"&", replace:"aa" }, { pattern:"abc", input:"abc", result:"y", format:"&", replace:"abc" }, ]; TestVectors[2] tvs = [ { pattern:"(a)\\1", input:"abaab", result:"y", format:"&", replace:"aa" }, { pattern:"abc", input:"abc", result:"y", format:"&", replace:"abc" }, ]; TestVectors* tvp = [ { pattern:"(a)\\1", input:"abaab", result:"y", format:"&", replace:"aa" }, { pattern:"abc", input:"abc", result:"y", format:"&", replace:"abc" }, ]; void test7() { int i; //printf("start\n"); //printf("%d\n", tva[0].pattern.length); //printf("%.*s\n", tva[0].pattern.length, tva[0].pattern.ptr); i = cmp(tva[0].pattern, "(a)\\1"); assert(i == 0); i = cmp(tva[1].replace, "abc"); assert(i == 0); i = cmp(tvs[0].pattern, "(a)\\1"); assert(i == 0); i = cmp(tvs[1].replace, "abc"); assert(i == 0); i = cmp(tvp[0].pattern, "(a)\\1"); assert(i == 0); i = cmp(tvp[1].replace, "abc"); assert(i == 0); //printf("finish\n"); } /* ================================ */ const uint WSABASEERR = 10000; const uint WSAENOTCONN = (WSABASEERR+57); void test8() { switch (10057) { case WSAENOTCONN: break; default: assert(0); } } /* ================================ */ alias T9* PPixel; align(1) struct TAG { int foo; } alias TAG T9; alias TAG Pixel; void func9(PPixel x) { } void test9() { Pixel p; func9(&p); } /* ================================ */ string[] colors10 = [ "red", "green", "blue" ]; void test10() { printf("test10()\n"); int i; i = cmp(colors10[0], "red"); assert(i == 0); } /* ================================ */ const uint MAX_PATH1 = 260; enum { MAX_PATH2 = 261 } struct WIN32_FIND_DATA { char[MAX_PATH1] cFileName1; char[MAX_PATH2] cFileName2; } void test11() { } /* ================================ */ interface IPersistent { int store(Object); int retrieve(Object); } class Persistent: IPersistent { int store(Object n) { return 1; } int retrieve(Object n) { return 2; } } void func12(IPersistent p) { Object o = new Object(); assert(p.store(o) == 1); assert(p.retrieve(o) == 2); } void test12() { Persistent p = new Persistent(); Object o = new Object(); assert(p.store(o) == 1); assert(p.retrieve(o) == 2); func12(p); } /* ================================ */ class X13 { } class A13 { X13 B(X13 x, out int i) { i = 666; return new X13; } X13 B(X13 x) { int j; return B(x, j); } } void test13() { A13 a; X13 x; int i; a = new A13(); x = a.B(x, i); assert(i == 666); } /* ================================ */ void foo14() { } int testx14(int x) { try { return 3; } finally { foo14(); } } class bar { int y; synchronized int sync(int x) { printf("in sync(%d) = %d\n", x, y + 3); return y + 3; } } void test14() { auto b = new shared(bar)(); int i; i = b.sync(4); printf("i = %d\n", i); assert(i == 3); assert(testx14(7) == 3); } /* ================================ */ /+ int foo15(int i) { switch (i) { case 7: case 8: return i; } return 0; } void test15() { int i = 0; try { foo15(3); } catch (SwitchError sw) { //printf("caught switch error\n"); i = 1; } assert(i == 1); } +/ /* ================================ */ struct GUID { // size is 16 align(1): uint Data1; ushort Data2; ushort Data3; ubyte[8] Data4; } GUID CLSID_Hello = { 0x30421140, 0, 0, [0xC0,0,0,0,0,0,0,0x46] }; GUID IID_IHello = { 0x00421140, 0, 0, [0xC0,0,0,0,0,0,0,0x46] }; int testa() { return CLSID_Hello == IID_IHello; } int testb() { return CLSID_Hello != IID_IHello; } int testc() { return CLSID_Hello == IID_IHello ? 5 : 3; } int testd() { return CLSID_Hello != IID_IHello ? 7 : 9; } void test16() { assert(testa() == 0); assert(testb() == 1); assert(testc() == 3); assert(testd() == 7); } /* ================================ */ private const uint[256] crc_table = [ 0x00000000u, 0x77073096u, 0xee0e612cu, 0x990951bau, 0x076dc419u, 0x2d02ef8du ]; public const(uint)[] get_crc_table() { return crc_table; } void test18() { const(uint)[] c; c = get_crc_table(); assert(c[3] == 0x990951bau); } /* ================================ */ int[0xffff] foo19; void test19() { int i; for (i = 0; i < 0xffff; i++) assert(foo19[i] == 0); } /* ================================ */ extern (Windows) int cfw(int x, int y) { return x * 10 + y; } extern (C) int cfc(int x, int y) { return x * 10 + y; } int cfd(int x, int y) { return x * 10 + y; } extern (Windows) int function (int, int) fpw; extern (C) int function (int, int) fpc; int function (int, int) fpd; void test20() { printf("test20()\n"); int i; fpw = &cfw; fpc = &cfc; fpd = &cfd; //printf("test w\n"); i = (*fpw)(1, 2); assert(i == 12); //printf("test c\n"); i = (*fpc)(3, 4); assert(i == 34); //printf("test d\n"); i = (*fpd)(7, 8); assert(i == 78); } /* ================================ */ int def23(int x, int y) { return x * y; } struct Foo23 { int a = 7; int b = 8; int c = 9; int abc() { def23(3, 4); a *= b; bar(); return a; } int bar() { a *= 2; return a; } invariant() { assert(c == 9); } } void test23() { Foo23 f; int i; assert(f.a == 7 && f.b == 8); i = f.abc(); assert(i == 112); } /* ================================ */ struct Foo24 { int x, y; int[] z; } void test24() { assert(Foo24.z.offsetof == 8); } /* ================================ */ void test27() { static real[1] n = [ -1 ]; //printf("%Le\n", n[0]); assert(n[0] == -1.0); } /* ================================ */ int x29; class Foo29 { ~this() { x29 = bar(); } int bar() { return 3; } } void test29() { printf("test29()\n"); Foo29 f = new Foo29(); destroy(f); assert(x29 == 3); } /* ================================ */ struct GC30 { static ClassInfo gcLock; invariant() { } void *malloc() { void *p; synchronized (gcLock) { p = test(); if (!p) return null; } return p; } void *test() { return null; } } void test30() { printf("test30()\n"); GC30 gc; GC30.gcLock = Object.classinfo; assert(gc.malloc() == null); } /* ================================ */ void test31() { char[14] foo; char[] bar; int i = 3; while (i--) bar = foo; } /* ================================ */ real foo32() { return 4 % 1.0; } void test32() { assert(foo32() == 0); } /* ================================ */ void test33() { char[8] foo; foo[] = "12345678"; assert(foo[7] == '8'); } /* ================================ */ void foo34(int[] a) { //printf("a.length = %d\n", a.length); assert(a.length == 5); assert(a[0] == 11); assert(a[1] == 22); assert(a[2] == 33); assert(a[3] == 44); assert(a[4] == 55); } void test34() { printf("test34()\n"); static int[5] x = [11,22,33,44,55]; int[] y; int* z; foo34(x); y = x; foo34(y); z = x.ptr; foo34(z[0..5]); } /* ================================ */ class X35 { final synchronized void foo() { for(;;) { break; } } } void test35() { auto x = new shared(X35); x.foo(); } /* ================================ */ void test36() { synchronized { } } void test36b() @nogc nothrow { synchronized { } } /* ================================ */ int test37() { string one = "1"; debug printf("pre\n"); int N = atoi(one.ptr); assert(N == 1); return 0; } /* ================================ */ void test39() { char[] array; array.length=4; char letter = 'a'; array[0..4]=letter; assert(array[0]=='a'); assert(array[1]=='a'); assert(array[2]=='a'); assert(array[3]=='a'); } /* ================================ */ int dummyJob; int dummy() { return ++dummyJob; } void bar40(){ return cast(void)dummy(); } int foo40() { bar40(); return dummyJob-1; } void test40() { assert(foo40() == 0); } /* ================================ */ int status; void check() { assert(status==1); void main(int dummy){ assert(status==3); status+=5; } status+=2; assert(status==3); main(2); assert(status==8); status+=7; } void test41() { status++; assert(status==1); check(); assert(status==15); } /* ================================ */ void test42() { real[10] array; real[] copy = array.dup; } /* ================================ */ void test43() { string s; s = __FILE__; printf("file = '%.*s'\n", cast(int)s.length, s.ptr); printf("line = %d\n", __LINE__); s = __DATE__; printf("date = '%.*s'\n", cast(int)s.length, s.ptr); s = __TIME__; printf("time = '%.*s'\n", cast(int)s.length, s.ptr); s = __TIMESTAMP__; printf("timestamp = '%.*s'\n", cast(int)s.length, s.ptr); } /* ================================ */ void test44() { int[] a; int i; a.length = 6; a = a[0 .. $ - 1]; assert(a.length == 5); } /* ================================ */ alias int MyInt; void test45() { MyInt test(string c="x"){ return 2; } assert(test("abc")==2); } /* ================================ */ int status46; class Check46 { void sum(byte[] b){ status46++; } void add(byte b){ assert(0); } alias sum write; alias add write; void test(){ byte[] buffer; write(buffer); } } void test46() { Check46 c = new Check46(); status46=0; assert(status46==0); c.test(); assert(status46==1); } /* ================================ */ int status47; int foo47(int arg) { loop: while(1) { try { try { if (arg == 1) { break loop; } } finally { assert(status47==0); status47+=2; } try { assert(0); } finally { assert(0); } } finally { assert(status47==2); status47+=3; } assert(0); return 0; } return -1; } void test47() { assert(status47 == 0); assert(foo47(1) == -1); assert(status47 == 5); } /* ================================ */ int status48; int foo48(int arg) { loop: while(1){ try{ try{ if(arg == 1) { break loop; } }finally{ assert(status48==0); status48+=2; } }finally{ assert(status48==2); status48+=3; } return 0; } return -1; } void test48() { assert(status48 == 0); assert(foo48(1) == -1); assert(status48 == 5); } /* ================================ */ int getch49() { return 0; } void writefln49(...) { } class Cout{ Cout set(int x){ return this; } Cout opBinary(string op)(int x) if (op == "<<") { return set(x); } } void test49() { Cout cout = new Cout; cout << 5 << 4; writefln49,getch49; } /* ================================ */ struct S50{ int i; } class C50{ static S50 prop(){ S50 s; return s; } static void prop(S50 s){ } } void test50() { C50 c = new C50(); c.prop = true ? C50.prop : C50.prop; assert(c.prop.i == 0); c.prop.i = 7; assert(c.prop.i != 7); } /* ================================ */ void func1() { static class foo { public int a; } } void test51() { static class foo { public int b; } foo bar = new foo(); bar.b = 255; } /* ================================ */ struct S52 { int i; } const int a52 = 3; const S52 b52 = { a52 }; const S52 c52 = b52; void test52() { assert(c52.i == 3); } /* ================================ */ const int c53 = b53 + 1; const int a53 = 1; const int b53 = a53 + 1; void test53() { assert(a53==1); assert(b53==2); assert(c53==3); } /* ================================ */ void test54() { int status=0; try { try { status++; assert(status==1); throw new Exception("first"); } finally { printf("finally\n"); status++; assert(status==2); status++; throw new Exception("second"); } } catch(Exception e) { printf("catch %.*s\n", cast(int)e.msg.length, e.msg.ptr); assert(e.msg == "first"); assert(e.next.msg == "second"); } printf("success54\n"); } /* ================================ */ void foo55() { try { Exception x = new Exception("second"); printf("inner throw %p\n", x); throw x; } catch (Exception e) { printf("inner catch %p\n", e); printf("e.msg == %.*s\n", cast(int)e.msg.length, e.msg.ptr); assert(e.msg == "second"); //assert(e.msg == "first"); //assert(e.next.msg == "second"); } } void test55() { int status=0; try{ try{ status++; assert(status==1); Exception x = new Exception("first"); printf("outer throw %p\n", x); throw x; }finally{ printf("finally\n"); status++; assert(status==2); status++; foo55(); printf("finally2\n"); } }catch(Exception e){ printf("outer catch %p\n", e); assert(e.msg == "first"); assert(status==3); } printf("success55\n"); } /* ================================ */ void test56() { assert('\²'==178); assert('\³'==179); assert('\¹'==185); assert('\¼'==188); assert('\½'==189); assert('\¾'==190); assert('\∴'==8756); } /* ================================ */ void test57() { version (D_Bits) { void displayb(char[] name, bit[] x) { writef("%-5s: ", name); foreach(bit b; x) writef("%d",b); writefln(""); } bit[] a; bit[] b; a.length = 7; a[0] = 0; a[1] = 1; a[2] = 1; a[3] = 0; a[4] = 0; a[5] = 1; a[6] = 0; displayb("a", a); b ~= a; displayb("b1", b); b ~= a; displayb("b2", b); for (int i = 0; i < a.length; i++) { assert(b[i] == a[i]); assert(b[i+7] == a[i]); } b.length = 0; b ~= a; displayb("b3", b); b.length = b.length + 7; for(int i = 0; i < a.length; i++) b[i+7] = a[i]; displayb("b4", b); for (int i = 0; i < a.length; i++) { assert(b[i] == a[i]); assert(b[i+7] == a[i]); } } } /* ================================ */ interface Foo58 { } interface Bar58 : Foo58 { } class Baz58 : Bar58 { } Object test58() { Bar58 b = new Baz58; return cast(Object)b; } /* ================================ */ float x59; void test59() { return cast(void)(x59 = -x59); } /* ================================ */ // https://issues.dlang.org/show_bug.cgi?id=10664 Exception collectExceptionE(int delegate () expression, ref int result) { try { result = expression(); } catch (Exception e) { return e; } return null; } RangeError collectExceptionR(int delegate () expression, ref int result) { try { result = expression(); } catch (RangeError e) { return e; } return null; } void test10664() { int b; int foo() { throw new Exception("blah"); } assert(collectExceptionE(&foo, b)); int[] a = new int[3]; int goo() { return a[4]; } collectExceptionR(&goo, b); } /* ================================ */ int main() { test1(); test2(); test3(); test4(); test5(); test6(); test7(); test8(); test9(); test10(); test11(); test12(); test13(); test14(); //test15(); test16(); test18(); test19(); test20(); test23(); test24(); // test26(); test27(); // test28(); test29(); test30(); test31(); test32(); test33(); test34(); test35(); test36(); test37(); test39(); test40(); test41(); test42(); test43(); test44(); test45(); test46(); test47(); test48(); test49(); test50(); test51(); test52(); test53(); test54(); test55(); test56(); test57(); test58(); test59(); test10664(); printf("Success\n"); return 0; }