blob: 38a9cc367e522b158d811f4331379809f5cce4b0 [file] [log] [blame]
// 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;
}