blob: cec4c0f7fa435b21582cd2d2f7a9be6aff5b9614 [file] [log] [blame]
// PERMUTE_ARGS:
//http://d.puremagic.com/issues/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()
{//http://d.puremagic.com/issues/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 issue 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) {}
}));
static assert(!__traits(compiles, () @safe {
try {}
catch {}
}));
}
@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()
{//http://d.puremagic.com/issues/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()
{//http://d.puremagic.com/issues/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()
{//http://d.puremagic.com/issues/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));
}
/***************************************************/
// 6278
@safe
{
class A6278 {
int test()
in { assert(0); }
body { return 1; }
}
class B6278 : A6278 {
override int test()
in { assert(0); }
body { return 1; }
}
}
/***************************************************/
// 7803
@safe int f7803() {
scope(success) {/* ... */}
return 3;
}
nothrow int g7803() {
scope(success) {/* ... */}
return 3;
}
/***************************************************/
// 6405
void foo6405(int[][] args...) @trusted { }
void test6405() @safe { foo6405([1,2,3], [1,2,3]); }
/***************************************************/
// 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();
}