// PERMUTE_ARGS: //https://issues.dlang.org/show_bug.cgi?id=5415 @safe void pointercast() { int* a; void* b; static assert( __traits(compiles, cast(void*)a)); static assert(!__traits(compiles, cast(int*)b)); static assert(!__traits(compiles, cast(int*)b)); static assert(!__traits(compiles, cast(short*)b)); static assert(!__traits(compiles, cast(byte*)b)); static assert( __traits(compiles, cast(short*)a)); static assert( __traits(compiles, cast(byte*)a)); } @safe void pointercast2() { size_t a; int b; Object c; static assert(__traits(compiles, cast(void*)a)); static assert(__traits(compiles, cast(void*)b)); static assert(__traits(compiles, cast(void*)c)); } @safe void pointerarithmetic() {//https://issues.dlang.org/show_bug.cgi?id=4132 void* a; int b; static assert(!__traits(compiles, a + b)); static assert(!__traits(compiles, a - b)); static assert(!__traits(compiles, a += b)); static assert(!__traits(compiles, a -= b)); static assert(!__traits(compiles, a++)); static assert(!__traits(compiles, a--)); static assert(!__traits(compiles, ++a)); static assert(!__traits(compiles, --a)); static assert( __traits(compiles, a + 0)); static assert( __traits(compiles, a - 0)); static assert( __traits(compiles, 0 + a)); static assert(!__traits(compiles, a + 1)); static assert(!__traits(compiles, a - 1)); static assert(!__traits(compiles, 1 + a)); static assert( __traits(compiles, a += 0)); static assert( __traits(compiles, a -= 0)); static assert(!__traits(compiles, a += 1)); static assert(!__traits(compiles, a -= 1)); } union SafeUnion1 { int a; struct { int b; int* c; } } union SafeUnion2 { int a; struct { int b; int c; } } union UnsafeUnion1 { int a; int* c; } union UnsafeUnion2 { int a; align(1) struct { byte b; int* c; } } union UnsafeUnion3 { int a; Object c; } union UnsafeUnion4 { int a; align(1) struct { byte b; Object c; } } struct pwrapper { int* a; } union UnsafeUnion5 { SafeUnion2 x; pwrapper b; } union uA { struct { int* a; void* b; } } struct uB { uA a; } struct uC { uB a; } struct uD { uC a; } @safe void safeunions() // improved for https://issues.dlang.org/show_bug.cgi?id=11510 { SafeUnion1 su1; SafeUnion2 su2; UnsafeUnion1 uu1; UnsafeUnion2 uu2; UnsafeUnion3 uu3; UnsafeUnion4 uu4; UnsafeUnion5 uu5; uD uud; int n; void* p; Object o; // Writing field is always allowed, even if it is overlapped. su1.a = 7, su1.b = 8, su1.c = null; su2.a = 7, su2.b = 8, su2.c = 9; uu1.a = 7, //uu1.c = null; uu2.a = 7; uu2.b = 8, //uu2.c = null; uu3.a = 7; //uu3.c = null; uu4.a = 7; uu4.b = 8, //uu4.c = null; uu5.x.a = 7; uu5.x.b = 8, uu5.x.c = 9; uud.a.a.a.a = null, uud.a.a.a.b = null; // Reading field is allowed, if it is not overlapped or has no pointers. n = su1.a, n = su1.b, p = su1.c; n = su2.a, n = su2.b, n = su2.c; n = uu1.a; n = uu2.a, n = uu2.b; n = uu3.a; n = uu4.a, n = uu4.b; n = uu5.x.a, n = uu5.x.b, n = uu5.x.c; p = uud.a.a.a.a, p = uud.a.a.a.b; // Reading overlapped pointer field is not allowed. static assert(!__traits(compiles, () @safe { auto p = uu1.c; })); static assert(!__traits(compiles, () @safe { auto p = uu2.c; })); static assert(!__traits(compiles, () @safe { auto c = uu3.c; })); static assert(!__traits(compiles, () @safe { auto c = uu4.c; })); static assert(!__traits(compiles, () @safe { auto p = uu5.b.a; })); } @safe void safeexception() { try {} catch(Exception e) {} static assert(!__traits(compiles, () @safe { try {} catch(Error e) {} })); static assert(!__traits(compiles, () @safe { try {} catch(Throwable e) {} })); } @safe void inlineasm() { version (D_InlineAsm_X86) static assert(!__traits(compiles, { asm { int 3; } }() )); else version (D_InlineAsm_X86_64) static assert(!__traits(compiles, { asm { int 3; } }() )); } @safe void multablecast() { Object m; const(Object) c; immutable(Object) i; static assert( __traits(compiles, cast(const(Object))m)); static assert( __traits(compiles, cast(const(Object))i)); static assert(!__traits(compiles, cast(immutable(Object))m)); static assert(!__traits(compiles, cast(immutable(Object))c)); static assert(!__traits(compiles, cast(Object)c)); static assert(!__traits(compiles, cast(Object)i)); void* mp; const(void)* cp; immutable(void)* ip; static assert( __traits(compiles, cast(const(void)*)mp)); static assert( __traits(compiles, cast(const(void)*)ip)); static assert(__traits(compiles, cast(immutable(void)*)mp)); static assert(__traits(compiles, cast(immutable(void)*)cp)); static assert(__traits(compiles, cast(void*)cp)); static assert(__traits(compiles, cast(void*)ip)); } @safe void sharedcast() { Object local; shared(Object) xshared; immutable(Object) ishared; static assert(!__traits(compiles, cast()xshared)); static assert(!__traits(compiles, cast(shared)local)); static assert(!__traits(compiles, cast(immutable)xshared)); static assert(!__traits(compiles, cast(shared)ishared)); } int threadlocalvar; @safe void takeaddr() { static assert(!__traits(compiles, (int x) @safe { auto y = &x; } )); static assert(!__traits(compiles, () @safe { int x; auto y = &x; } )); static assert( __traits(compiles, () @safe { static int x; auto y = &x; } )); static assert( __traits(compiles, () @safe { auto y = &threadlocalvar; } )); } __gshared int gsharedvar; @safe void use__gshared() { static assert(!__traits(compiles, () @safe { int x = gsharedvar; } )); } @safe void voidinitializers() {//https://issues.dlang.org/show_bug.cgi?id=4885 static assert(!__traits(compiles, () @safe { uint* ptr = void; } )); static assert( __traits(compiles, () @safe { uint i = void; } )); static assert( __traits(compiles, () @safe { uint[2] a = void; } )); struct ValueStruct { int a; } struct NonValueStruct { int* a; } static assert( __traits(compiles, () @safe { ValueStruct a = void; } )); static assert(!__traits(compiles, () @safe { NonValueStruct a = void; } )); static assert(!__traits(compiles, () @safe { uint[] a = void; } )); static assert(!__traits(compiles, () @safe { int** a = void; } )); static assert(!__traits(compiles, () @safe { int[int] a = void; } )); } @safe void pointerindex() {//https://issues.dlang.org/show_bug.cgi?id=9195 static assert(!__traits(compiles, () @safe { int* p; auto a = p[30]; })); static assert( __traits(compiles, () @safe{ int* p; auto a = p[0]; })); } @safe void basiccast() {//https://issues.dlang.org/show_bug.cgi?id=5088 auto a = cast(int)cast(const int)1; auto b = cast(real)cast(const int)1; auto c = cast(real)cast(const real)2.0; } @safe void arraycast() { int[] x; void[] y = x; static assert( __traits(compiles, cast(void[])x)); static assert(!__traits(compiles, cast(int[])y)); static assert(!__traits(compiles, cast(int*[])y)); static assert(!__traits(compiles, cast(void[][])y)); int[3] a; int[] b = cast(int[])a; uint[3] c = cast(uint[3])a; const char[] cc; static assert( __traits(compiles, cast(const(ubyte)[])cc)); static assert( __traits(compiles, cast(const(ubyte[]))cc)); static assert(!__traits(compiles, cast(shared(ubyte)[])cc)); shared char[] sc; static assert( __traits(compiles, cast(shared(ubyte)[])sc)); static assert( __traits(compiles, cast(shared(ubyte[]))sc)); static assert(!__traits(compiles, cast(const(ubyte)[])sc)); } @safe void structcast() { struct A { ptrdiff_t x; } struct B { size_t x; } struct C { void* x; } A a; B b; C c; static assert( __traits(compiles, a = cast(A)b)); static assert( __traits(compiles, a = cast(A)c)); static assert( __traits(compiles, b = cast(B)a)); static assert( __traits(compiles, b = cast(B)c)); static assert(!__traits(compiles, c = cast(C)a)); static assert(!__traits(compiles, c = cast(C)b)); } @safe void test6497() { int n; (0 ? n : n) = 3; } @safe void varargs() { static void fun(string[] val...) {} fun("a"); } extern(C++) interface E {} extern(C++) interface F : E {} @safe void classcast() { class A {} class B : A {} A a; B b; static assert( __traits(compiles, cast(A)a)); static assert( __traits(compiles, cast(B)a)); static assert( __traits(compiles, cast(A)b)); static assert( __traits(compiles, cast(B)b)); const A ca; const B cb; static assert( __traits(compiles, cast(const(A))ca)); static assert( __traits(compiles, cast(const(B))ca)); static assert( __traits(compiles, cast(const(A))cb)); static assert( __traits(compiles, cast(const(B))cb)); static assert(!__traits(compiles, cast(A)ca)); static assert(!__traits(compiles, cast(B)ca)); static assert(!__traits(compiles, cast(A)cb)); static assert(!__traits(compiles, cast(B)cb)); interface C {} interface D : C {} C c; D d; static assert( __traits(compiles, cast(C)c)); static assert( __traits(compiles, cast(D)c)); static assert( __traits(compiles, cast(C)d)); static assert( __traits(compiles, cast(D)d)); E e; F f; static assert( __traits(compiles, cast(E)e)); static assert(!__traits(compiles, cast(F)e)); static assert( __traits(compiles, cast(E)f)); static assert( __traits(compiles, cast(F)f)); } /***************************************************/ // https://issues.dlang.org/show_bug.cgi?id=6278 @safe { class A6278 { int test() in { assert(0); } do { return 1; } } class B6278 : A6278 { override int test() in { assert(0); } do { return 1; } } } /***************************************************/ // https://issues.dlang.org/show_bug.cgi?id=7803 @safe int f7803() { scope(success) {/* ... */} return 3; } nothrow int g7803() { scope(success) {/* ... */} return 3; } /***************************************************/ // https://issues.dlang.org/show_bug.cgi?id=6405 void foo6405(int[][] args...) @trusted { } void test6405() @safe { foo6405([1,2,3], [1,2,3]); } /***************************************************/ // https://issues.dlang.org/show_bug.cgi?id=12502 void test12502() @safe { const char[1] arr; auto ax = cast(const(char) []) arr[]; // ok auto a1 = cast(const(ubyte)[]) arr[]; // ok auto a2 = cast(const(char) []) arr; // ok auto a3 = cast(const(ubyte)[]) arr; // ok <- error } /***************************************************/ // https://issues.dlang.org/show_bug.cgi?id=14162 @trusted auto trusted(alias fun)() { return fun(); } @safe void func1()() { char[3] s = "abc"; string t = trusted!(() => cast(string)(s[])); assert(t == "abc"); } @safe void func2()() { char[3] s = "abc"; string t = trusted!(() => cast(string)(s[])); assert(t == "abc"); } @safe void test14162() { func1(); func2(); } /***************************************************/ void main() { test14162(); }