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 issue 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     static assert(!__traits(compiles, () @safe {
202         try {}
203         catch {}
204     }));
205 }
206 
207 @safe
208 void inlineasm()
209 {
210     version (D_InlineAsm_X86)
211         static assert(!__traits(compiles, { asm { int 3; } }() ));
212     else version (D_InlineAsm_X86_64)
213         static assert(!__traits(compiles, { asm { int 3; } }() ));
214 }
215 
216 @safe
217 void multablecast()
218 {
219     Object m;
220     const(Object) c;
221     immutable(Object) i;
222 
223     static assert( __traits(compiles, cast(const(Object))m));
224     static assert( __traits(compiles, cast(const(Object))i));
225 
226     static assert(!__traits(compiles, cast(immutable(Object))m));
227     static assert(!__traits(compiles, cast(immutable(Object))c));
228 
229     static assert(!__traits(compiles, cast(Object)c));
230     static assert(!__traits(compiles, cast(Object)i));
231 
232     void* mp;
233     const(void)* cp;
234     immutable(void)* ip;
235 
236     static assert( __traits(compiles, cast(const(void)*)mp));
237     static assert( __traits(compiles, cast(const(void)*)ip));
238 
239     static assert(!__traits(compiles, cast(immutable(void)*)mp));
240     static assert(!__traits(compiles, cast(immutable(void)*)cp));
241 
242     static assert(!__traits(compiles, cast(void*)cp));
243     static assert(!__traits(compiles, cast(void*)ip));
244 }
245 
246 @safe
247 void sharedcast()
248 {
249     Object local;
250     shared(Object) xshared;
251     immutable(Object) ishared;
252 
253     static assert(!__traits(compiles, cast()xshared));
254     static assert(!__traits(compiles, cast(shared)local));
255 
256     static assert(!__traits(compiles, cast(immutable)xshared));
257     static assert(!__traits(compiles, cast(shared)ishared));
258 }
259 
260 int threadlocalvar;
261 
262 @safe
263 void takeaddr()
264 {
265     static assert(!__traits(compiles, (int x) @safe { auto y = &x; } ));
266     static assert(!__traits(compiles, () @safe { int x; auto y = &x; } ));
267     static assert( __traits(compiles, () @safe { static int x; auto y = &x; } ));
268     static assert( __traits(compiles, () @safe { auto y = &threadlocalvar; } ));
269 }
270 
271 __gshared int gsharedvar;
272 
273 @safe
274 void use__gshared()
275 {
276     static assert(!__traits(compiles, () @safe { int x = gsharedvar; } ));
277 }
278 
279 @safe
280 void voidinitializers()
281 {//http://d.puremagic.com/issues/show_bug.cgi?id=4885
282     static assert(!__traits(compiles, () @safe { uint* ptr = void; } ));
283     static assert( __traits(compiles, () @safe { uint i = void; } ));
284     static assert( __traits(compiles, () @safe { uint[2] a = void; } ));
285 
286     struct ValueStruct { int a; }
287     struct NonValueStruct { int* a; }
288     static assert( __traits(compiles, () @safe { ValueStruct a = void; } ));
289     static assert(!__traits(compiles, () @safe { NonValueStruct a = void; } ));
290 
291     static assert(!__traits(compiles, () @safe { uint[] a = void; } ));
292     static assert(!__traits(compiles, () @safe { int** a = void; } ));
293     static assert(!__traits(compiles, () @safe { int[int] a = void; } ));
294 }
295 
296 @safe
297 void pointerindex()
298 {//http://d.puremagic.com/issues/show_bug.cgi?id=9195
299     static assert(!__traits(compiles, () @safe { int* p; auto a = p[30]; }));
300     static assert( __traits(compiles, () @safe{ int* p; auto a = p[0]; }));
301 }
302 
303 @safe
304 void basiccast()
305 {//http://d.puremagic.com/issues/show_bug.cgi?id=5088
306     auto a = cast(int)cast(const int)1;
307     auto b = cast(real)cast(const int)1;
308     auto c = cast(real)cast(const real)2.0;
309 }
310 
311 @safe
312 void arraycast()
313 {
314     int[] x;
315     void[] y = x;
316     static assert( __traits(compiles, cast(void[])x));
317     static assert(!__traits(compiles, cast(int[])y));
318     static assert(!__traits(compiles, cast(int*[])y));
319     static assert(!__traits(compiles, cast(void[][])y));
320 
321     int[3] a;
322     int[] b = cast(int[])a;
323     uint[3] c = cast(uint[3])a;
324 
325     const char[] cc;
326     static assert( __traits(compiles, cast(const(ubyte)[])cc));
327     static assert( __traits(compiles, cast(const(ubyte[]))cc));
328     static assert(!__traits(compiles, cast(shared(ubyte)[])cc));
329 
330     shared char[] sc;
331     static assert( __traits(compiles, cast(shared(ubyte)[])sc));
332     static assert( __traits(compiles, cast(shared(ubyte[]))sc));
333     static assert(!__traits(compiles, cast(const(ubyte)[])sc));
334 }
335 
336 @safe
337 void structcast()
338 {
339     struct A { ptrdiff_t x; }
340     struct B { size_t x; }
341     struct C { void* x; }
342     A a;
343     B b;
344     C c;
345 
346     static assert( __traits(compiles, a = cast(A)b));
347     static assert( __traits(compiles, a = cast(A)c));
348     static assert( __traits(compiles, b = cast(B)a));
349     static assert( __traits(compiles, b = cast(B)c));
350     static assert(!__traits(compiles, c = cast(C)a));
351     static assert(!__traits(compiles, c = cast(C)b));
352 }
353 
354 @safe void test6497()
355 {
356     int n;
357     (0 ? n : n) = 3;
358 }
359 
360 @safe
361 void varargs()
362 {
363     static void fun(string[] val...) {}
364     fun("a");
365 }
366 
367 extern(C++) interface E {}
368 extern(C++) interface F : E {}
369 
370 @safe
371 void classcast()
372 {
373     class A {}
374     class B : A {}
375 
376     A a;
377     B b;
378 
379     static assert( __traits(compiles, cast(A)a));
380     static assert( __traits(compiles, cast(B)a));
381     static assert( __traits(compiles, cast(A)b));
382     static assert( __traits(compiles, cast(B)b));
383 
384     const A ca;
385     const B cb;
386 
387     static assert( __traits(compiles, cast(const(A))ca));
388     static assert( __traits(compiles, cast(const(B))ca));
389     static assert( __traits(compiles, cast(const(A))cb));
390     static assert( __traits(compiles, cast(const(B))cb));
391 
392     static assert(!__traits(compiles, cast(A)ca));
393     static assert(!__traits(compiles, cast(B)ca));
394     static assert(!__traits(compiles, cast(A)cb));
395     static assert(!__traits(compiles, cast(B)cb));
396 
397     interface C {}
398     interface D : C {}
399 
400     C c;
401     D d;
402 
403     static assert( __traits(compiles, cast(C)c));
404     static assert( __traits(compiles, cast(D)c));
405     static assert( __traits(compiles, cast(C)d));
406     static assert( __traits(compiles, cast(D)d));
407 
408     E e;
409     F f;
410 
411     static assert( __traits(compiles, cast(E)e));
412     static assert(!__traits(compiles, cast(F)e));
413     static assert( __traits(compiles, cast(E)f));
414     static assert( __traits(compiles, cast(F)f));
415 }
416 
417 /***************************************************/
418 // 6278
419 
420 @safe
421 {
422 
423 class A6278 {
424     int test()
425     in { assert(0); }
426     body { return 1; }
427 }
428 class B6278 : A6278 {
429     override int test()
430     in { assert(0); }
431     body { return 1; }
432 }
433 
434 }
435 
436 /***************************************************/
437 // 7803
438 
439 @safe int f7803() {
440     scope(success) {/* ... */}
441     return 3;
442 }
443 
444 nothrow int g7803() {
445     scope(success) {/* ... */}
446     return 3;
447 }
448 
449 /***************************************************/
450 // 6405
451 
452 void foo6405(int[][] args...) @trusted { }
453 void test6405() @safe { foo6405([1,2,3], [1,2,3]); }
454 
455 /***************************************************/
456 // 12502
457 
458 void test12502() @safe
459 {
460     const char[1] arr;
461     auto ax = cast(const(char) []) arr[]; // ok
462     auto a1 = cast(const(ubyte)[]) arr[]; // ok
463     auto a2 = cast(const(char) []) arr;   // ok
464     auto a3 = cast(const(ubyte)[]) arr;   // ok <- error
465 }
466 
467 /***************************************************/
468 // https://issues.dlang.org/show_bug.cgi?id=14162
469 
470 @trusted auto trusted(alias fun)() { return fun(); }
471 
472 @safe void func1()()
473 {
474     char[3] s = "abc";
475     string t = trusted!(() => cast(string)(s[]));
476     assert(t == "abc");
477 }
478 
479 @safe void func2()()
480 {
481     char[3] s = "abc";
482     string t = trusted!(() => cast(string)(s[]));
483     assert(t == "abc");
484 }
485 
486 @safe void test14162()
487 {
488     func1();
489     func2();
490 }
491 
492 /***************************************************/
493 
494 void main()
495 {
496     test14162();
497 }
498 
499