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