1 // PERMUTE_ARGS:
2
3 //http://d.puremagic.com/issues/show_bug.cgi?id=5415
4
5 @safe
pointercast()6 void pointercast()
7 {
8 int* a;
9 void* b;
10
11 static assert( __traits(compiles, cast(void*)a));
12 static assert(!__traits(compiles, cast(int*)b));
13 static assert(!__traits(compiles, cast(int*)b));
14 static assert(!__traits(compiles, cast(short*)b));
15 static assert(!__traits(compiles, cast(byte*)b));
16 static assert( __traits(compiles, cast(short*)a));
17 static assert( __traits(compiles, cast(byte*)a));
18 }
19
20 @safe
pointercast2()21 void pointercast2()
22 {
23 size_t a;
24 int b;
25 Object c;
26
27 static assert(!__traits(compiles, cast(void*)a));
28 static assert(!__traits(compiles, cast(void*)b));
29 static assert(!__traits(compiles, cast(void*)c));
30 }
31
32 @safe
pointerarithmetic()33 void pointerarithmetic()
34 {//http://d.puremagic.com/issues/show_bug.cgi?id=4132
35 void* a;
36 int b;
37
38 static assert(!__traits(compiles, a + b));
39 static assert(!__traits(compiles, a - b));
40 static assert(!__traits(compiles, a += b));
41 static assert(!__traits(compiles, a -= b));
42 static assert(!__traits(compiles, a++));
43 static assert(!__traits(compiles, a--));
44 static assert(!__traits(compiles, ++a));
45 static assert(!__traits(compiles, --a));
46 static assert( __traits(compiles, a + 0));
47 static assert( __traits(compiles, a - 0));
48 static assert( __traits(compiles, 0 + a));
49 static assert(!__traits(compiles, a + 1));
50 static assert(!__traits(compiles, a - 1));
51 static assert(!__traits(compiles, 1 + a));
52 static assert( __traits(compiles, a += 0));
53 static assert( __traits(compiles, a -= 0));
54 static assert(!__traits(compiles, a += 1));
55 static assert(!__traits(compiles, a -= 1));
56 }
57
58
59
60 union SafeUnion1
61 {
62 int a;
63 struct
64 {
65 int b;
66 int* c;
67 }
68 }
69 union SafeUnion2
70 {
71 int a;
72 struct
73 {
74 int b;
75 int c;
76 }
77 }
78 union UnsafeUnion1
79 {
80 int a;
81 int* c;
82 }
83 union UnsafeUnion2
84 {
85 int a;
86 align(1)
87 struct
88 {
89 byte b;
90 int* c;
91 }
92 }
93 union UnsafeUnion3
94 {
95 int a;
96 Object c;
97 }
98 union UnsafeUnion4
99 {
100 int a;
101 align(1)
102 struct
103 {
104 byte b;
105 Object c;
106 }
107 }
108 struct pwrapper
109 {
110 int* a;
111 }
112 union UnsafeUnion5
113 {
114 SafeUnion2 x;
115 pwrapper b;
116 }
117
118 union uA
119 {
120 struct
121 {
122 int* a;
123 void* b;
124 }
125 }
126 struct uB
127 {
128 uA a;
129 }
130 struct uC
131 {
132 uB a;
133 }
134 struct uD
135 {
136 uC a;
137 }
138
139 @safe
140 void safeunions() // improved for https://issues.dlang.org/show_bug.cgi?id=11510
141 {
142 SafeUnion1 su1;
143 SafeUnion2 su2;
144 UnsafeUnion1 uu1;
145 UnsafeUnion2 uu2;
146 UnsafeUnion3 uu3;
147 UnsafeUnion4 uu4;
148 UnsafeUnion5 uu5;
149 uD uud;
150
151 int n;
152 void* p;
153 Object o;
154
155 // Writing field is always allowed, even if it is overlapped.
156 su1.a = 7, su1.b = 8, su1.c = null;
157 su2.a = 7, su2.b = 8, su2.c = 9;
158 uu1.a = 7, //uu1.c = null;
159 uu2.a = 7; uu2.b = 8, //uu2.c = null;
160 uu3.a = 7; //uu3.c = null;
161 uu4.a = 7; uu4.b = 8, //uu4.c = null;
162 uu5.x.a = 7; uu5.x.b = 8, uu5.x.c = 9;
163 uud.a.a.a.a = null, uud.a.a.a.b = null;
164
165 // Reading field is allowed, if it is not overlapped or has no pointers.
166 n = su1.a, n = su1.b, p = su1.c;
167 n = su2.a, n = su2.b, n = su2.c;
168 n = uu1.a;
169 n = uu2.a, n = uu2.b;
170 n = uu3.a;
171 n = uu4.a, n = uu4.b;
172 n = uu5.x.a, n = uu5.x.b, n = uu5.x.c;
173 p = uud.a.a.a.a, p = uud.a.a.a.b;
174
175 // Reading overlapped pointer field is not allowed.
176 static assert(!__traits(compiles, () @safe { auto p = uu1.c; }));
177 static assert(!__traits(compiles, () @safe { auto p = uu2.c; }));
178 static assert(!__traits(compiles, () @safe { auto c = uu3.c; }));
179 static assert(!__traits(compiles, () @safe { auto c = uu4.c; }));
180 static assert(!__traits(compiles, () @safe { auto p = uu5.b.a; }));
181 }
182
183
184
185 @safe
186 void safeexception()
187 {
188 try {}
189 catch(Exception e) {}
190
191 static assert(!__traits(compiles, () @safe {
192 try {}
193 catch(Error e) {}
194 }));
195
196 static assert(!__traits(compiles, () @safe {
197 try {}
198 catch(Throwable e) {}
199 }));
200 }
201
202 @safe
203 void inlineasm()
204 {
205 version (D_InlineAsm_X86)
206 static assert(!__traits(compiles, { asm { int 3; } }() ));
207 else version (D_InlineAsm_X86_64)
208 static assert(!__traits(compiles, { asm { int 3; } }() ));
209 }
210
211 @safe
212 void multablecast()
213 {
214 Object m;
215 const(Object) c;
216 immutable(Object) i;
217
218 static assert( __traits(compiles, cast(const(Object))m));
219 static assert( __traits(compiles, cast(const(Object))i));
220
221 static assert(!__traits(compiles, cast(immutable(Object))m));
222 static assert(!__traits(compiles, cast(immutable(Object))c));
223
224 static assert(!__traits(compiles, cast(Object)c));
225 static assert(!__traits(compiles, cast(Object)i));
226
227 void* mp;
228 const(void)* cp;
229 immutable(void)* ip;
230
231 static assert( __traits(compiles, cast(const(void)*)mp));
232 static assert( __traits(compiles, cast(const(void)*)ip));
233
234 static assert(!__traits(compiles, cast(immutable(void)*)mp));
235 static assert(!__traits(compiles, cast(immutable(void)*)cp));
236
237 static assert(!__traits(compiles, cast(void*)cp));
238 static assert(!__traits(compiles, cast(void*)ip));
239 }
240
241 @safe
242 void sharedcast()
243 {
244 Object local;
245 shared(Object) xshared;
246 immutable(Object) ishared;
247
248 static assert(!__traits(compiles, cast()xshared));
249 static assert(!__traits(compiles, cast(shared)local));
250
251 static assert(!__traits(compiles, cast(immutable)xshared));
252 static assert(!__traits(compiles, cast(shared)ishared));
253 }
254
255 int threadlocalvar;
256
257 @safe
258 void takeaddr()
259 {
260 static assert(!__traits(compiles, (int x) @safe { auto y = &x; } ));
261 static assert(!__traits(compiles, () @safe { int x; auto y = &x; } ));
262 static assert( __traits(compiles, () @safe { static int x; auto y = &x; } ));
263 static assert( __traits(compiles, () @safe { auto y = &threadlocalvar; } ));
264 }
265
266 __gshared int gsharedvar;
267
268 @safe
269 void use__gshared()
270 {
271 static assert(!__traits(compiles, () @safe { int x = gsharedvar; } ));
272 }
273
274 @safe
275 void voidinitializers()
276 {//http://d.puremagic.com/issues/show_bug.cgi?id=4885
277 static assert(!__traits(compiles, () @safe { uint* ptr = void; } ));
278 static assert( __traits(compiles, () @safe { uint i = void; } ));
279 static assert( __traits(compiles, () @safe { uint[2] a = void; } ));
280
281 struct ValueStruct { int a; }
282 struct NonValueStruct { int* a; }
283 static assert( __traits(compiles, () @safe { ValueStruct a = void; } ));
284 static assert(!__traits(compiles, () @safe { NonValueStruct a = void; } ));
285
286 static assert(!__traits(compiles, () @safe { uint[] a = void; } ));
287 static assert(!__traits(compiles, () @safe { int** a = void; } ));
288 static assert(!__traits(compiles, () @safe { int[int] a = void; } ));
289 }
290
291 @safe
292 void pointerindex()
293 {//http://d.puremagic.com/issues/show_bug.cgi?id=9195
294 static assert(!__traits(compiles, () @safe { int* p; auto a = p[30]; }));
295 static assert( __traits(compiles, () @safe{ int* p; auto a = p[0]; }));
296 }
297
298 @safe
299 void basiccast()
300 {//http://d.puremagic.com/issues/show_bug.cgi?id=5088
301 auto a = cast(int)cast(const int)1;
302 auto b = cast(real)cast(const int)1;
303 auto c = cast(real)cast(const real)2.0;
304 }
305
306 @safe
307 void arraycast()
308 {
309 int[] x;
310 void[] y = x;
311 static assert( __traits(compiles, cast(void[])x));
312 static assert(!__traits(compiles, cast(int[])y));
313 static assert(!__traits(compiles, cast(int*[])y));
314 static assert(!__traits(compiles, cast(void[][])y));
315
316 int[3] a;
317 int[] b = cast(int[])a;
318 uint[3] c = cast(uint[3])a;
319
320 const char[] cc;
321 static assert( __traits(compiles, cast(const(ubyte)[])cc));
322 static assert( __traits(compiles, cast(const(ubyte[]))cc));
323 static assert(!__traits(compiles, cast(shared(ubyte)[])cc));
324
325 shared char[] sc;
326 static assert( __traits(compiles, cast(shared(ubyte)[])sc));
327 static assert( __traits(compiles, cast(shared(ubyte[]))sc));
328 static assert(!__traits(compiles, cast(const(ubyte)[])sc));
329 }
330
331 @safe
332 void structcast()
333 {
334 struct A { ptrdiff_t x; }
335 struct B { size_t x; }
336 struct C { void* x; }
337 A a;
338 B b;
339 C c;
340
341 static assert( __traits(compiles, a = cast(A)b));
342 static assert( __traits(compiles, a = cast(A)c));
343 static assert( __traits(compiles, b = cast(B)a));
344 static assert( __traits(compiles, b = cast(B)c));
345 static assert(!__traits(compiles, c = cast(C)a));
346 static assert(!__traits(compiles, c = cast(C)b));
347 }
348
349 @safe void test6497()
350 {
351 int n;
352 (0 ? n : n) = 3;
353 }
354
355 @safe
356 void varargs()
357 {
358 static void fun(string[] val...) {}
359 fun("a");
360 }
361
362 extern(C++) interface E {}
363 extern(C++) interface F : E {}
364
365 @safe
366 void classcast()
367 {
368 class A {}
369 class B : A {}
370
371 A a;
372 B b;
373
374 static assert( __traits(compiles, cast(A)a));
375 static assert( __traits(compiles, cast(B)a));
376 static assert( __traits(compiles, cast(A)b));
377 static assert( __traits(compiles, cast(B)b));
378
379 const A ca;
380 const B cb;
381
382 static assert( __traits(compiles, cast(const(A))ca));
383 static assert( __traits(compiles, cast(const(B))ca));
384 static assert( __traits(compiles, cast(const(A))cb));
385 static assert( __traits(compiles, cast(const(B))cb));
386
387 static assert(!__traits(compiles, cast(A)ca));
388 static assert(!__traits(compiles, cast(B)ca));
389 static assert(!__traits(compiles, cast(A)cb));
390 static assert(!__traits(compiles, cast(B)cb));
391
392 interface C {}
393 interface D : C {}
394
395 C c;
396 D d;
397
398 static assert( __traits(compiles, cast(C)c));
399 static assert( __traits(compiles, cast(D)c));
400 static assert( __traits(compiles, cast(C)d));
401 static assert( __traits(compiles, cast(D)d));
402
403 E e;
404 F f;
405
406 static assert( __traits(compiles, cast(E)e));
407 static assert(!__traits(compiles, cast(F)e));
408 static assert( __traits(compiles, cast(E)f));
409 static assert( __traits(compiles, cast(F)f));
410 }
411
412 /***************************************************/
413 // https://issues.dlang.org/show_bug.cgi?id=6278
414
415 @safe
416 {
417
418 class A6278 {
419 int test()
420 in { assert(0); }
421 do { return 1; }
422 }
423 class B6278 : A6278 {
424 override int test()
425 in { assert(0); }
426 do { return 1; }
427 }
428
429 }
430
431 /***************************************************/
432 // https://issues.dlang.org/show_bug.cgi?id=7803
433
434 @safe int f7803() {
435 scope(success) {/* ... */}
436 return 3;
437 }
438
439 nothrow int g7803() {
440 scope(success) {/* ... */}
441 return 3;
442 }
443
444 /***************************************************/
445 // https://issues.dlang.org/show_bug.cgi?id=6405
446
447 void foo6405(int[][] args...) @trusted { }
448 void test6405() @safe { foo6405([1,2,3], [1,2,3]); }
449
450 /***************************************************/
451 // https://issues.dlang.org/show_bug.cgi?id=12502
452
453 void test12502() @safe
454 {
455 const char[1] arr;
456 auto ax = cast(const(char) []) arr[]; // ok
457 auto a1 = cast(const(ubyte)[]) arr[]; // ok
458 auto a2 = cast(const(char) []) arr; // ok
459 auto a3 = cast(const(ubyte)[]) arr; // ok <- error
460 }
461
462 /***************************************************/
463 // https://issues.dlang.org/show_bug.cgi?id=14162
464
465 @trusted auto trusted(alias fun)() { return fun(); }
466
467 @safe void func1()()
468 {
469 char[3] s = "abc";
470 string t = trusted!(() => cast(string)(s[]));
471 assert(t == "abc");
472 }
473
474 @safe void func2()()
475 {
476 char[3] s = "abc";
477 string t = trusted!(() => cast(string)(s[]));
478 assert(t == "abc");
479 }
480
481 @safe void test14162()
482 {
483 func1();
484 func2();
485 }
486
487 /***************************************************/
488
489 void main()
490 {
491 test14162();
492 }
493