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