blob: d3f4503a187a6f036953b3ce680b4670d73bd975 [file] [log] [blame]
import core.vararg;
import core.stdc.stdio;
/******************************************************/
void test2()
{
assert(typeid(int) == typeid(int));
assert(typeid(int) != typeid(uint));
}
/******************************************************/
class FOO3 { }
FOO3 foox3;
void foo3(int x, ...)
{
printf("%zd arguments\n", _arguments.length);
for (int i = 0; i < _arguments.length; i++)
{
//writeln(_arguments[i].toString());
if (_arguments[i] is typeid(int))
{
int j = va_arg!int(_argptr);
printf("\t%d\n", j);
assert(j == 2);
}
else if (_arguments[i] == typeid(long))
{
long j = va_arg!long(_argptr);
printf("\t%lld\n", j);
assert(j == 3);
}
else if (_arguments[i] is typeid(double))
{
double d = va_arg!double(_argptr);
printf("\t%g\n", d);
assert(d == 4.5);
}
else if (_arguments[i] is typeid(FOO3))
{
FOO3 f = va_arg!FOO3(_argptr);
printf("\t%p\n", f);
assert(f is foox3);
}
else
assert(0);
}
}
void test3()
{
FOO3 f = new FOO3();
printf("\t%p\n", f);
foox3 = f;
foo3(1,2,3L,4.5,f);
foo3(1,2,3L,4.5,f);
}
/******************************************************/
void test4()
{
TypeInfo ti;
ti = typeid(float[]);
assert(!(ti is null));
ti = typeid(double[]);
assert(!(ti is null));
ti = typeid(real[]);
assert(!(ti is null));
ti = typeid(void);
assert(!(ti is null));
ti = typeid(void[]);
assert(!(ti is null));
ti = typeid(bool[]);
assert(!(ti is null));
}
/******************************************************/
void test6()
{
TypeInfo ti = typeid(void*);
assert(!(ti is null));
assert(ti.tsize==(void*).sizeof);
assert(ti.toString()=="void*");
}
/******************************************************/
void test7()
{
TypeInfo ti = typeid(bool*);
assert(!(ti is null));
assert(ti.tsize==(bool*).sizeof);
assert(ti.toString()=="bool*");
}
/******************************************************/
void test8()
{
TypeInfo ti = typeid(byte*);
assert(!(ti is null));
assert(ti.tsize==(byte*).sizeof);
assert(ti.toString()=="byte*");
}
/******************************************************/
void test9()
{
TypeInfo ti = typeid(byte[]);
assert(!(ti is null));
assert(ti.tsize==(byte[]).sizeof);
assert(ti.toString()=="byte[]");
}
/******************************************************/
void test10()
{
TypeInfo ti = typeid(short*);
assert(!(ti is null));
assert(ti.tsize==(short*).sizeof);
assert(ti.toString()=="short*");
}
/******************************************************/
void test11()
{
TypeInfo ti = typeid(ushort*);
assert(!(ti is null));
assert(ti.tsize==(ushort*).sizeof);
assert(ti.toString()=="ushort*");
}
/******************************************************/
void test12()
{
TypeInfo ti = typeid(int*);
assert(!(ti is null));
assert(ti.tsize==(int*).sizeof);
assert(ti.toString()=="int*");
}
/******************************************************/
void test13()
{
TypeInfo ti = typeid(uint*);
assert(!(ti is null));
assert(ti.tsize==(uint*).sizeof);
assert(ti.toString()=="uint*");
}
/******************************************************/
void test14()
{
TypeInfo ti = typeid(ulong*);
assert(!(ti is null));
assert(ti.tsize==(ulong*).sizeof);
assert(ti.toString()=="ulong*");
}
/******************************************************/
void test15()
{
TypeInfo ti = typeid(long*);
assert(!(ti is null));
assert(ti.tsize==(long*).sizeof);
assert(ti.toString()=="long*");
}
/******************************************************/
void test16()
{
TypeInfo ti = typeid(float*);
assert(!(ti is null));
assert(ti.tsize==(float*).sizeof);
assert(ti.toString()=="float*");
}
/******************************************************/
void test19()
{
TypeInfo ti = typeid(double*);
assert(!(ti is null));
assert(ti.tsize==(double*).sizeof);
assert(ti.toString()=="double*");
}
/******************************************************/
void test22()
{
TypeInfo ti = typeid(real*);
assert(!(ti is null));
assert(ti.tsize==(real*).sizeof);
assert(ti.toString()=="real*");
}
/******************************************************/
void test25()
{
TypeInfo ti = typeid(char*);
assert(!(ti is null));
assert(ti.tsize==(char*).sizeof);
assert(ti.toString()=="char*");
}
/******************************************************/
void test26()
{
TypeInfo ti = typeid(wchar*);
assert(!(ti is null));
assert(ti.tsize==(wchar*).sizeof);
assert(ti.toString()=="wchar*");
}
/******************************************************/
void test27()
{
TypeInfo ti = typeid(dchar*);
assert(!(ti is null));
assert(ti.tsize==(dchar*).sizeof);
assert(ti.toString()=="dchar*");
}
/******************************************************/
enum MyEnum { A, B }
void test28()
{
TypeInfo ti = typeid(MyEnum);
assert(!(ti is null));
assert(ti.tsize==(MyEnum).sizeof);
assert(ti.toString()=="testtypeid.MyEnum");
}
/******************************************************/
void test29()
{
alias void function() func;
TypeInfo ti = typeid(func);
assert(ti !is null);
assert(ti.tsize == func.sizeof);
}
/******************************************************/
void test30()
{
alias int delegate() del;
TypeInfo ti = typeid(del);
assert(ti !is null);
assert(ti.tsize == del.sizeof);
}
/******************************************************/
void test31()
{
TypeInfo ti = typeid(void);
assert(!(ti is null));
assert(ti.tsize == void.sizeof);
assert(ti.toString()=="void");
}
/******************************************************/
class Foo32 { int x = 3; }
class Bar32 { long y = 4; }
void printargs(int x, ...)
{
printf("%zd arguments\n", _arguments.length);
for (int i = 0; i < _arguments.length; i++)
{
//writeln(_arguments[i].toString());
if (_arguments[i] == typeid(int))
{
int j = va_arg!int(_argptr);
printf("\t%d\n", j);
}
else if (_arguments[i] == typeid(long))
{
long j = va_arg!long(_argptr);
printf("\t%lld\n", j);
}
else if (_arguments[i] == typeid(double))
{
double d = va_arg!double(_argptr);
printf("\t%g\n", d);
}
else if (_arguments[i] == typeid(Foo32))
{
Foo32 f = va_arg!Foo32(_argptr);
assert(f.x == 3);
printf("\t%p\n", f);
}
else if (_arguments[i] == typeid(Bar32))
{
Bar32 b = va_arg!Bar32(_argptr);
assert(b.y == 4);
printf("\t%p\n", b);
}
else
assert(0);
}
}
void test32()
{
Foo32 f = new Foo32();
Bar32 b = new Bar32();
printf("%p\n", f);
printargs(1, 2, 3L, 4.5, f, b);
}
/******************************************************/
void test33()
{
}
/******************************************************/
void test34()
{
class C { }
C c;
auto a = typeid(C).info;
}
/******************************************************/
void test35()
{
auto ti = typeid(shared(int));
auto sti = cast(TypeInfo_Shared)ti;
assert(sti);
// allow both next and base as field names in TypeInfo_Const
static if (is(typeof(&sti.base) == TypeInfo*))
assert(sti.base == typeid(int));
else
assert(sti.next == typeid(int));
}
/******************************************************/
void test36()
{
int i;
assert(typeid(i++) == typeid(int));
assert(i == 1);
assert(typeid(i + 1) == typeid(int));
}
/******************************************************/
class A37 {}
class B37 : A37 {}
void test37()
{
auto a = new B37;
//writeln(typeid(A));
assert(typeid(a) == typeid(B37));
}
/******************************************************/
void test38()
{
static if (is(cent))
{
TypeInfo ti = typeid(cent*);
assert(!(ti is null));
assert(ti.tsize==(cent*).sizeof);
assert(ti.toString()=="cent*");
}
}
/******************************************************/
void test39()
{
static if (is(ucent))
{
TypeInfo ti = typeid(ucent*);
assert(!(ti is null));
assert(ti.tsize==(ucent*).sizeof);
assert(ti.toString()=="ucent*");
}
}
/******************************************************/
void test40()
{
static if (is(cent))
{
cent i;
assert(typeid(i++) == typeid(cent));
assert(i == 1);
assert(typeid(i + 1) == typeid(cent));
}
}
/******************************************************/
// https://issues.dlang.org/show_bug.cgi?id=9442
class C
{
this()
{
c = this;
auto x = typeid(c); // NG
auto y = typeid(this.c); // ok
}
C c;
}
void test9442()
{
auto c = new C();
}
/******************************************************/
// https://issues.dlang.org/show_bug.cgi?id=10451
struct Foo10451;
struct Bar10451
{
Foo10451*[] foos;
}
void test10451()
{
Foo10451*[] foos = [];
foos ~= null;
foos = new Foo10451*[2];
}
/******************************************************/
// https://issues.dlang.org/show_bug.cgi?id=11010
struct S11010 { S11010* p; }
class C11010 { C11010 p; }
class D11010 : C11010 {}
void test11010()
{
TypeInfo ti;
S11010 s;
ti = typeid(s.p);
assert(cast(TypeInfo_Pointer)ti !is null);
assert(ti.toString() == "testtypeid.S11010*");
C11010 c = new C11010();
c.p = new D11010();
ti = typeid(c.p);
assert(cast(TypeInfo_Class)ti !is null);
assert(ti.toString() == "testtypeid.D11010");
}
/******************************************************/
// https://issues.dlang.org/show_bug.cgi?id=13045
void test13045a()
{
static struct S
{
int[] a;
}
auto s1 = S([1,2]);
auto s2 = S([1,2]);
assert(s1 !is s2);
assert(s1 == s2);
assert(typeid(S).getHash(&s1) == typeid(S).getHash(&s2)); // should succeed
}
void test13045b()
{
bool thrown(T)(lazy T cond)
{
import core.exception;
try
cond();
catch (Error e)
return true;
return false;
}
struct S
{
size_t toHash() const nothrow @safe
{
// all getHash call should reach here
throw new Error("");
}
}
struct T
{
S s;
}
S s;
assert(thrown(typeid(S).getHash(&s))); // OK
S[1] ssa;
assert(thrown(typeid(S[1]).getHash(&ssa))); // OK
S[] sda = [S(), S()];
assert(thrown(typeid(S[]).getHash(&sda))); // OK
T t;
assert(thrown(typeid(T).getHash(&t))); // OK <- NG
T[1] tsa;
assert(thrown(typeid(T[1]).getHash(&tsa))); // OK <- NG
T[] tda = [T(), T()];
assert(thrown(typeid(T[]).getHash(&tda))); // OK <- NG
}
/******************************************************/
// https://issues.dlang.org/show_bug.cgi?id=15680
void test15680()
{
auto tid = typeid(null);
auto iz = tid.initializer();
assert(iz.length == typeof(null).sizeof);
assert(iz.ptr is null || *(cast(void**)iz.ptr) is null);
}
/******************************************************/
int main()
{
test2();
test3();
test4();
test6();
test7();
test8();
test9();
test10();
test11();
test12();
test13();
test14();
test15();
test16();
test19();
test22();
test25();
test26();
test27();
test28();
test29();
test30();
test31();
test32();
test33();
test34();
test35();
test36();
test37();
test38();
test39();
test40();
test9442();
test10451();
test11010();
test13045a();
test13045b();
test15680();
return 0;
}