| // REQUIRED_ARGS: |
| |
| import core.stdc.stdarg; |
| |
| extern(C) |
| { |
| int printf(const char*, ...); |
| version(Windows) |
| { |
| int _snprintf(char*, size_t, const char*, ...); |
| alias _snprintf snprintf; |
| } |
| else |
| int snprintf(char*, size_t, const char*, ...); |
| } |
| |
| /*************************************/ |
| |
| // https://www.digitalmars.com/d/archives/digitalmars/D/bugs/4766.html |
| // Only with -O |
| |
| real randx() |
| { |
| return 1.2; |
| } |
| |
| void test1() |
| { |
| float x10=randx(); |
| float x11=randx(); |
| float x20=randx(); |
| float x21=randx(); |
| float y10=randx(); |
| float y11=randx(); |
| float y20=randx(); |
| float y21=randx(); |
| |
| float tmp=( |
| x20*x21 + y10*y10 + y10*y11 + y11*y11 + |
| y11*y20 + y20*y20 + y10*y21 + y11*y21 + |
| y21*y21); |
| assert(tmp > 0); |
| } |
| |
| /*************************************/ |
| |
| void test2() |
| { |
| double x10=randx(); |
| double x11=randx(); |
| double x20=randx(); |
| double x21=randx(); |
| double y10=randx(); |
| double y11=randx(); |
| double y20=randx(); |
| double y21=randx(); |
| |
| double tmp=( |
| x20*x21 + y10*y10 + y10*y11 + y11*y11 + |
| y11*y20 + y20*y20 + y10*y21 + y11*y21 + |
| y21*y21); |
| assert(tmp > 0); |
| } |
| |
| /*************************************/ |
| |
| void test3() |
| { |
| real x10=randx(); |
| real x11=randx(); |
| real x20=randx(); |
| real x21=randx(); |
| real y10=randx(); |
| real y11=randx(); |
| real y20=randx(); |
| real y21=randx(); |
| |
| real tmp=( |
| x20*x21 + y10*y10 + y10*y11 + y11*y11 + |
| y11*y20 + y20*y20 + y10*y21 + y11*y21 + |
| y21*y21); |
| assert(tmp > 0); |
| } |
| |
| /*************************************/ |
| |
| void test4() |
| { |
| printf("main() : (-128 >= 0)=%s, (-128 <= 0)=%s\n", |
| cast(char*)(-128 >= 0 ? "true" : "false"), |
| cast(char*)(-128 <= 0 ? "true" : "false")); |
| |
| printf("main() : (128 >= 0)=%s, (128 <= 0)=%s\n", |
| cast(char*)(128 >= 0 ? "true" : "false"), |
| cast(char*)(128 <= 0 ? "true" : "false")); |
| |
| assert((-128 >= 0 ? "true" : "false") == "false"), |
| assert((-128 <= 0 ? "true" : "false") == "true"); |
| assert((+128 >= 0 ? "true" : "false") == "true"), |
| assert((+128 <= 0 ? "true" : "false") == "false"); |
| } |
| |
| |
| /*************************************/ |
| |
| int foo5() { assert(0); } // No return. |
| |
| int abc5() |
| { |
| printf("foo = %d\n", foo5()); |
| return 0; |
| } |
| |
| void test5() |
| { |
| } |
| |
| /*************************************/ |
| |
| class A9 |
| { |
| this(int[] params ...) |
| { |
| for (int i = 0; i < params.length; i++) |
| { |
| assert(params[i] == i + 1); |
| } |
| } |
| } |
| |
| class B9 |
| { |
| this() |
| { |
| init(); |
| } |
| |
| private void init() |
| { |
| A9 test1 = new A9(1, 2, 3); |
| A9 test2 = new A9(1, 2, 3, 4); |
| int[3] arg; |
| arg[0]=1, arg[1]=2, arg[2]=3; |
| A9 test3 = new A9(arg); |
| } |
| } |
| |
| void test9() |
| { |
| B9 test2 = new B9(); |
| } |
| |
| /*************************************/ |
| |
| void test10() |
| { |
| auto i = 5u; |
| auto s = typeid(typeof(i)).toString; |
| printf("%.*s\n", cast(int)s.length, s.ptr); |
| assert(typeid(typeof(i)) == typeid(uint)); |
| } |
| |
| /*************************************/ |
| |
| void test11() |
| { |
| printf("%d\n", 3); |
| printf("xhello world!\n"); |
| } |
| |
| /*************************************/ |
| |
| real x16; |
| |
| void foo16() |
| { |
| x16 = -x16; |
| } |
| |
| void bar16() |
| { |
| return foo16(); |
| } |
| |
| void test16() |
| { |
| x16=2; |
| bar16(); |
| assert(x16==-2); |
| } |
| |
| /*************************************/ |
| |
| class Bar17 |
| { |
| this(...) {} |
| } |
| |
| class Foo17 |
| { |
| void opBinary(string op : "+") (Bar17 b) {} |
| } |
| |
| void test17() |
| { |
| auto f = new Foo17; |
| f + new Bar17; |
| } |
| |
| |
| /*************************************/ |
| |
| template u18(int n) |
| { |
| static if (n==1) { |
| int a = 1; |
| } else |
| int b = 4; |
| } |
| |
| void test18() |
| { |
| mixin u18!(2); |
| assert(b == 4); |
| } |
| |
| /*************************************/ |
| |
| class DP |
| { |
| private: |
| void I(char[] p) |
| { |
| I(p[1..p.length]); |
| } |
| } |
| |
| void test19() |
| { |
| } |
| |
| /*************************************/ |
| |
| struct Struct20 |
| { |
| int i; |
| } |
| |
| void test20() |
| { |
| auto s = new Struct20; |
| s.i = 7; |
| } |
| |
| /*************************************/ |
| |
| class C21(float f) |
| { |
| float ff = f; |
| } |
| |
| void test21() |
| { |
| auto a = new C21!(1.2); |
| C21!(1.2) b = new C21!(1.2); |
| } |
| |
| /*************************************/ |
| |
| const int c23 = b23 * b23; |
| const int a23 = 1; |
| const int b23 = a23 * 3; |
| |
| template T23(int n) |
| { |
| int[n] x23; |
| } |
| |
| mixin T23!(c23); |
| |
| void test23() |
| { |
| assert(x23.length==9); |
| } |
| |
| /*************************************/ |
| |
| template cat(int n) |
| { |
| const int dog = n; |
| } |
| |
| const char [] bird = "canary"; |
| |
| const int sheep = cat!(bird.length).dog; |
| |
| void test25() |
| { |
| assert(sheep == 6); |
| } |
| |
| /*************************************/ |
| |
| void test27() |
| { int x; |
| |
| string s = (int*function(int ...)[]).mangleof; |
| printf("%.*s\n", cast(int)s.length, s.ptr); |
| assert((int*function(int ...)[]).mangleof == "APFiXPi"); |
| assert(typeof(x).mangleof == "i"); |
| assert(x.mangleof == "_D6test226test27FZ1xi"); |
| } |
| |
| /*************************************/ |
| |
| void test29() |
| { |
| ulong a = 10_000_000_000_000_000, |
| b = 1_000_000_000_000_000; |
| |
| printf("test29\n%llx\n%llx\n%llx\n", a, b, a / b); |
| assert((a / b) == 10); |
| } |
| |
| static assert((10_000_000_000_000_000 / 1_000_000_000_000_000) == 10); |
| |
| /*************************************/ |
| |
| template chook(int n) |
| { |
| const int chook = 3; |
| } |
| |
| template dog(alias f) { |
| const int dog = chook!(f.mangleof.length); |
| } |
| |
| class pig {} |
| |
| const int goose = dog!(pig); |
| |
| void test30() |
| { |
| printf("%d\n", goose); |
| assert(goose == 3); |
| } |
| |
| /*************************************/ |
| |
| template dog31(string sheep) |
| { |
| immutable string dog31 = "daschund"; |
| } |
| |
| void test31() |
| { |
| string duck = dog31!("bird"[1..3]); |
| |
| assert(duck == "daschund"); |
| } |
| |
| /*************************************/ |
| |
| struct particle |
| { |
| int active; /* Active (Yes/No) */ |
| float life; /* Particle Life */ |
| float fade; /* Fade Speed */ |
| |
| float r; /* Red Value */ |
| float g; /* Green Value */ |
| float b; /* Blue Value */ |
| |
| float x; /* X Position */ |
| float y; /* Y Position */ |
| |
| float xi; /* X Direction */ |
| float yi; /* Y Direction */ |
| |
| float xg; /* X Gravity */ |
| float yg; /* Y Gravity */ |
| } |
| |
| particle[10000] particles; |
| |
| void test32() |
| { |
| } |
| |
| /*************************************/ |
| |
| class Foo33 |
| { |
| template foo() |
| { |
| int foo() { return 6; } |
| } |
| } |
| |
| |
| void test33() |
| { |
| Foo33 f = new Foo33; |
| |
| assert(f.foo!()() == 6); |
| with (f) |
| assert(foo!()() == 6); |
| } |
| |
| /*************************************/ |
| |
| template dog34(string duck) |
| { |
| const int dog34 = 2; |
| } |
| |
| void test34() |
| { |
| int aardvark = dog34!("cat" ~ "pig"); |
| |
| assert(aardvark == 2); |
| } |
| |
| /*************************************/ |
| |
| class A35 |
| { |
| private bool quit; |
| void halt() {quit = true;} |
| bool isHalted() {return quit;} |
| } |
| |
| void test35() |
| { |
| auto a = new A35; |
| |
| a.halt; // error here |
| a.halt(); |
| |
| a.isHalted; // error here |
| bool done = a.isHalted; |
| if (a.isHalted) |
| { |
| } |
| } |
| |
| |
| /*************************************/ |
| |
| void test36() |
| { |
| bool q = (0.9 + 3.5L == 0.9L + 3.5L); |
| assert(q); |
| static assert(0.9 + 3.5L == 0.9L + 3.5L); |
| assert(0.9 + 3.5L == 0.9L + 3.5L); |
| } |
| |
| /*************************************/ |
| |
| abstract class Foo37(T) |
| { |
| void bar () { } |
| } |
| |
| class Bar37 : Foo37!(int) |
| { |
| } |
| |
| void test37() |
| { |
| auto f = new Bar37; |
| } |
| |
| /*************************************/ |
| |
| void test38() |
| { |
| auto s=`hello`; |
| assert(s.length==5); |
| assert(s[0]=='h'); |
| assert(s[1]=='e'); |
| assert(s[2]=='l'); |
| assert(s[3]=='l'); |
| assert(s[4]=='o'); |
| } |
| |
| /*************************************/ |
| |
| void test39() |
| { |
| int value=1; |
| string key = "eins"; |
| int[char[]] array; |
| |
| array[key]=value; |
| int* ptr = key in array; |
| |
| assert(value == *ptr); |
| } |
| |
| /*************************************/ |
| |
| void test40() |
| { |
| auto s=r"hello"; |
| assert(s.length==5); |
| assert(s[0]=='h'); |
| assert(s[1]=='e'); |
| assert(s[2]=='l'); |
| assert(s[3]=='l'); |
| assert(s[4]=='o'); |
| } |
| |
| /*************************************/ |
| |
| void test41() |
| { |
| version (Windows) |
| { |
| version(D_InlineAsm){ |
| double a = 1.2; |
| double b = 0.2; |
| double c = 1.4; |
| |
| asm{ |
| movq XMM0, a; |
| movq XMM1, b; |
| addsd XMM1, XMM0; |
| movq c, XMM1; |
| } |
| |
| a += b; |
| |
| b = a-c; |
| b = (b>0) ? b : (-1 * b); |
| |
| assert(b < b.epsilon*4); |
| } |
| } |
| } |
| |
| /*************************************/ |
| |
| const char[] tapir = "some horned animal"; |
| |
| const byte[] antelope = cast(byte []) tapir; |
| |
| void test42() |
| { |
| } |
| |
| /*************************************/ |
| |
| void test43() |
| { |
| string armadillo = "abc" ~ 'a'; |
| assert(armadillo == "abca"); |
| string armadillo2 = 'b' ~ "abc"; |
| assert(armadillo2 == "babc"); |
| } |
| |
| /*************************************/ |
| |
| const uint baboon44 = 3; |
| |
| const int monkey44 = 4; |
| |
| const ape44 = monkey44 * baboon44; |
| |
| void test44() |
| { |
| assert(ape44 == 12); |
| } |
| |
| /*************************************/ |
| |
| class A45 |
| { |
| this() |
| { |
| b = new B(); |
| b.x = 5; // illegal |
| } |
| |
| class B |
| { |
| protected int x; |
| } |
| |
| B b; |
| } |
| |
| void test45() |
| { |
| } |
| |
| |
| /*************************************/ |
| |
| class C46(T) |
| { |
| private T i; // or protected or package |
| } |
| |
| void test46() |
| { |
| C46!(int) c = new C46!(int); // class t4.C46!(int).C46 member i is not accessible |
| c.i = 10; |
| } |
| |
| /*************************************/ |
| |
| void bug5809() |
| { |
| ushort[2] x = void; |
| x[0] = 0; |
| x[1] = 0x1234; |
| ushort *px = &x[0]; |
| |
| uint b = px[0]; |
| |
| assert(px[0] == 0); |
| } |
| |
| /*************************************/ |
| |
| void bug7546() |
| { |
| double p = -0.0; |
| assert(p == 0); |
| } |
| |
| |
| /*************************************/ |
| |
| real poly_asm(real x, real[] A) |
| in |
| { |
| assert(A.length > 0); |
| } |
| do |
| { |
| version (D_InlineAsm_X86) |
| { |
| version (linux) |
| { |
| asm // assembler by W. Bright |
| { |
| // EDX = (A.length - 1) * real.sizeof |
| mov ECX,A[EBP] ; // ECX = A.length |
| dec ECX ; |
| lea EDX,[ECX][ECX*8] ; |
| add EDX,ECX ; |
| add EDX,ECX ; |
| add EDX,ECX ; |
| add EDX,A+4[EBP] ; |
| fld real ptr [EDX] ; // ST0 = coeff[ECX] |
| jecxz return_ST ; |
| fld x[EBP] ; // ST0 = x |
| fxch ST(1) ; // ST1 = x, ST0 = r |
| align 4 ; |
| L2: fmul ST,ST(1) ; // r *= x |
| fld real ptr -12[EDX] ; |
| sub EDX,12 ; // deg-- |
| faddp ST(1),ST ; |
| dec ECX ; |
| jne L2 ; |
| fxch ST(1) ; // ST1 = r, ST0 = x |
| fstp ST(0) ; // dump x |
| align 4 ; |
| return_ST: ; |
| ; |
| } |
| } |
| else version (OSX) |
| { |
| asm // assembler by W. Bright |
| { |
| // EDX = (A.length - 1) * real.sizeof |
| mov ECX,A[EBP] ; // ECX = A.length |
| dec ECX ; |
| lea EDX,[ECX*8] ; |
| add EDX,EDX ; |
| add EDX,A+4[EBP] ; |
| fld real ptr [EDX] ; // ST0 = coeff[ECX] |
| jecxz return_ST ; |
| fld x[EBP] ; // ST0 = x |
| fxch ST(1) ; // ST1 = x, ST0 = r |
| align 4 ; |
| L2: fmul ST,ST(1) ; // r *= x |
| fld real ptr -16[EDX] ; |
| sub EDX,16 ; // deg-- |
| faddp ST(1),ST ; |
| dec ECX ; |
| jne L2 ; |
| fxch ST(1) ; // ST1 = r, ST0 = x |
| fstp ST(0) ; // dump x |
| align 4 ; |
| return_ST: ; |
| ; |
| } |
| } |
| else version (FreeBSD) |
| { |
| asm // assembler by W. Bright |
| { |
| // EDX = (A.length - 1) * real.sizeof |
| mov ECX,A[EBP] ; // ECX = A.length |
| dec ECX ; |
| lea EDX,[ECX][ECX*8] ; |
| add EDX,ECX ; |
| add EDX,ECX ; |
| add EDX,ECX ; |
| add EDX,A+4[EBP] ; |
| fld real ptr [EDX] ; // ST0 = coeff[ECX] |
| jecxz return_ST ; |
| fld x[EBP] ; // ST0 = x |
| fxch ST(1) ; // ST1 = x, ST0 = r |
| align 4 ; |
| L2: fmul ST,ST(1) ; // r *= x |
| fld real ptr -12[EDX] ; |
| sub EDX,12 ; // deg-- |
| faddp ST(1),ST ; |
| dec ECX ; |
| jne L2 ; |
| fxch ST(1) ; // ST1 = r, ST0 = x |
| fstp ST(0) ; // dump x |
| align 4 ; |
| return_ST: ; |
| ; |
| } |
| } |
| else version (Solaris) |
| { |
| asm // assembler by W. Bright |
| { |
| // EDX = (A.length - 1) * real.sizeof |
| mov ECX,A[EBP] ; // ECX = A.length |
| dec ECX ; |
| lea EDX,[ECX][ECX*8] ; |
| add EDX,ECX ; |
| add EDX,ECX ; |
| add EDX,ECX ; |
| add EDX,A+4[EBP] ; |
| fld real ptr [EDX] ; // ST0 = coeff[ECX] |
| jecxz return_ST ; |
| fld x[EBP] ; // ST0 = x |
| fxch ST(1) ; // ST1 = x, ST0 = r |
| align 4 ; |
| L2: fmul ST,ST(1) ; // r *= x |
| fld real ptr -12[EDX] ; |
| sub EDX,12 ; // deg-- |
| faddp ST(1),ST ; |
| dec ECX ; |
| jne L2 ; |
| fxch ST(1) ; // ST1 = r, ST0 = x |
| fstp ST(0) ; // dump x |
| align 4 ; |
| return_ST: ; |
| ; |
| } |
| } |
| else |
| { |
| asm // assembler by W. Bright |
| { |
| // EDX = (A.length - 1) * real.sizeof |
| mov ECX,A[EBP] ; // ECX = A.length |
| dec ECX ; |
| lea EDX,[ECX][ECX*8] ; |
| add EDX,ECX ; |
| add EDX,A+4[EBP] ; |
| fld real ptr [EDX] ; // ST0 = coeff[ECX] |
| jecxz return_ST ; |
| fld x[EBP] ; // ST0 = x |
| fxch ST(1) ; // ST1 = x, ST0 = r |
| align 4 ; |
| L2: fmul ST,ST(1) ; // r *= x |
| fld real ptr -10[EDX] ; |
| sub EDX,10 ; // deg-- |
| faddp ST(1),ST ; |
| dec ECX ; |
| jne L2 ; |
| fxch ST(1) ; // ST1 = r, ST0 = x |
| fstp ST(0) ; // dump x |
| align 4 ; |
| return_ST: ; |
| ; |
| } |
| } |
| } |
| else |
| { |
| printf("Sorry, you don't seem to have InlineAsm_X86\n"); |
| return 0; |
| } |
| } |
| |
| real poly_c(real x, real[] A) |
| in |
| { |
| assert(A.length > 0); |
| } |
| do |
| { |
| ptrdiff_t i = A.length - 1; |
| real r = A[i]; |
| while (--i >= 0) |
| { |
| r *= x; |
| r += A[i]; |
| } |
| return r; |
| } |
| |
| void test47() |
| { |
| real x = 3.1; |
| static real[] pp = [56.1, 32.7, 6]; |
| real r; |
| |
| printf("The result should be %Lf\n",(56.1L + (32.7L + 6L * x) * x)); |
| printf("The C version outputs %Lf\n", poly_c(x, pp)); |
| printf("The asm version outputs %Lf\n", poly_asm(x, pp)); |
| |
| r = (56.1L + (32.7L + 6L * x) * x); |
| assert(r == poly_c(x, pp)); |
| version (D_InlineAsm_X86) |
| assert(r == poly_asm(x, pp)); |
| } |
| |
| /*************************************/ |
| |
| const c48 = 1uL-1; |
| |
| void test48() |
| { |
| assert(c48 == 0); |
| } |
| |
| /*************************************/ |
| |
| template cat49() |
| { |
| static assert(1); // OK |
| static if (1) |
| { |
| static assert(1); // doesn't work |
| static if (1) |
| { |
| static assert(1); // OK |
| const int cat49 = 3; |
| } |
| } |
| } |
| |
| void test49() |
| { |
| const int a = cat49!(); |
| assert(a == 3); |
| } |
| |
| /*************************************/ |
| |
| void test50() |
| { |
| if (auto x = 1) |
| { |
| assert(typeid(typeof(x)) == typeid(int)); |
| assert(x == 1); |
| } |
| else |
| assert(0); |
| |
| if (int x = 1) |
| { |
| assert(typeid(typeof(x)) == typeid(int)); |
| assert(x == 1); |
| } |
| else |
| assert(0); |
| |
| if (1) |
| { |
| } |
| else |
| assert(0); |
| } |
| |
| /*************************************/ |
| |
| void test51() |
| { |
| bool b; |
| assert(b == false); |
| b &= 1; |
| assert(b == false); |
| b |= 1; |
| assert(b == true); |
| b ^= 1; |
| assert(b == false); |
| b = b | true; |
| assert(b == true); |
| b = b & false; |
| assert(b == false); |
| b = b ^ true; |
| assert(b == true); |
| b = !b; |
| assert(b == false); |
| } |
| |
| /*************************************/ |
| |
| alias int function (int) x52; |
| |
| template T52(string str){ |
| const int T52 = 1; |
| } |
| |
| static assert(T52!(x52.mangleof)); |
| |
| void test52() |
| { |
| } |
| |
| /*************************************/ |
| |
| void myfunc(int a1, ...) { |
| va_list argument_list; |
| TypeInfo argument_type; |
| string sa; int ia; double da; |
| assert(_arguments.length == 9); |
| |
| va_start(argument_list, a1); |
| for (int i = 0; i < _arguments.length; ) { |
| if ((argument_type=_arguments[i++]) == typeid(string)) { |
| va_arg(argument_list, sa); |
| switch (i) |
| { |
| case 1: assert(sa == "2"); break; |
| case 7: assert(sa == "8"); break; |
| case 8: assert(sa == "9"); break; |
| case 9: assert(sa == "10"); break; |
| default: |
| printf("i = %d\n", i); |
| assert(false); |
| } |
| } else if (argument_type == typeid(int)) { |
| va_arg(argument_list, ia); |
| assert(ia == i+1); |
| } else if (argument_type == typeid(double)) { |
| va_arg(argument_list, da); |
| const e = i+1; |
| assert((e - 0.0001) < da && da < (e + 0.0001)); |
| } else { |
| assert(false, argument_type.toString()); |
| } |
| } |
| va_end(argument_list); |
| } |
| |
| void test6758() { |
| myfunc(1, 2, 3, 4, 5, 6, 7, 8, "9", "10"); // Fails. |
| myfunc(1, 2.0, 3, 4, 5, 6, 7, 8, "9", "10"); // Works OK. |
| myfunc(1, 2, 3, 4, 5, 6, 7, "8", "9", "10"); // Works OK. |
| myfunc(1, "2", 3, 4, 5, 6, 7, 8, "9", "10"); // Works OK. |
| } |
| |
| |
| /*************************************/ |
| |
| real f18573() { return 1; } |
| |
| void test18573() |
| { |
| cast(void) f18573(); |
| cast(void) f18573(); |
| cast(void) f18573(); |
| cast(void) f18573(); |
| cast(void) f18573(); |
| cast(void) f18573(); |
| cast(void) f18573(); |
| |
| real b = 2; |
| assert(b == 2); /* fails; should pass */ |
| } |
| |
| /*************************************/ |
| |
| int main() |
| { |
| test1(); |
| test2(); |
| test3(); |
| test4(); |
| test5(); |
| test9(); |
| test10(); |
| test11(); |
| test16(); |
| test17(); |
| test18(); |
| test19(); |
| test20(); |
| test21(); |
| test23(); |
| test25(); |
| test27(); |
| test29(); |
| test30(); |
| test31(); |
| test32(); |
| test33(); |
| test34(); |
| test35(); |
| test36(); |
| test37(); |
| test38(); |
| test39(); |
| test40(); |
| test41(); |
| test42(); |
| test43(); |
| test44(); |
| test45(); |
| test46(); |
| bug5809(); |
| bug7546(); |
| test47(); |
| test48(); |
| test49(); |
| test50(); |
| test51(); |
| test52(); |
| test6758(); |
| test18573(); |
| |
| printf("Success\n"); |
| return 0; |
| } |