Mercurial > projects > ddmd
annotate dmd/TypeBasic.d @ 72:2e2a5c3f943a
reduced warnings by adding override to the methods
think this also normalizes different line endings used all over the place
author | Trass3r |
---|---|
date | Sat, 28 Aug 2010 16:19:48 +0200 |
parents | fd4acc376c45 |
children | acd69f84627e |
rev | line source |
---|---|
0 | 1 module dmd.TypeBasic; |
2 | |
3 import dmd.Type; | |
4 import dmd.Id; | |
5 import dmd.MOD; | |
6 import dmd.TOK; | |
7 import dmd.Token; | |
8 import dmd.TFLAGS; | |
9 import dmd.TY; | |
10 import dmd.Loc; | |
11 import dmd.Scope; | |
12 import dmd.Expression; | |
13 import dmd.IntegerExp; | |
14 import dmd.Identifier; | |
15 import dmd.OutBuffer; | |
16 import dmd.HdrGenState; | |
17 import dmd.CppMangleState; | |
18 import dmd.MATCH; | |
19 import dmd.RealExp; | |
20 import dmd.ComplexExp; | |
21 import dmd.Util; | |
22 import dmd.Port; | |
23 import dmd.Complex; | |
24 | |
25 class TypeBasic : Type | |
26 { | |
27 string dstring; | |
28 uint flags; | |
29 | |
30 this(TY ty) | |
31 { | |
32 super(ty); | |
33 | |
34 enum TFLAGSintegral = 1; | |
35 enum TFLAGSfloating = 2; | |
36 enum TFLAGSunsigned = 4; | |
37 enum TFLAGSreal = 8; | |
38 enum TFLAGSimaginary = 0x10; | |
39 enum TFLAGScomplex = 0x20; | |
40 | |
41 string d; | |
42 | |
43 uint flags = 0; | |
44 switch (ty) | |
45 { | |
46 case TY.Tvoid: d = Token.toChars(TOK.TOKvoid); | |
47 break; | |
48 | |
49 case TY.Tint8: d = Token.toChars(TOK.TOKint8); | |
50 flags |= TFLAGSintegral; | |
51 break; | |
52 | |
53 case TY.Tuns8: d = Token.toChars(TOK.TOKuns8); | |
54 flags |= TFLAGSintegral | TFLAGSunsigned; | |
55 break; | |
56 | |
57 case TY.Tint16: d = Token.toChars(TOK.TOKint16); | |
58 flags |= TFLAGSintegral; | |
59 break; | |
60 | |
61 case TY.Tuns16: d = Token.toChars(TOK.TOKuns16); | |
62 flags |= TFLAGSintegral | TFLAGSunsigned; | |
63 break; | |
64 | |
65 case TY.Tint32: d = Token.toChars(TOK.TOKint32); | |
66 flags |= TFLAGSintegral; | |
67 break; | |
68 | |
69 case TY.Tuns32: d = Token.toChars(TOK.TOKuns32); | |
70 flags |= TFLAGSintegral | TFLAGSunsigned; | |
71 break; | |
72 | |
73 case TY.Tfloat32: d = Token.toChars(TOK.TOKfloat32); | |
74 flags |= TFLAGSfloating | TFLAGSreal; | |
75 break; | |
76 | |
77 case TY.Tint64: d = Token.toChars(TOK.TOKint64); | |
78 flags |= TFLAGSintegral; | |
79 break; | |
80 | |
81 case TY.Tuns64: d = Token.toChars(TOK.TOKuns64); | |
82 flags |= TFLAGSintegral | TFLAGSunsigned; | |
83 break; | |
84 | |
85 case TY.Tfloat64: d = Token.toChars(TOK.TOKfloat64); | |
86 flags |= TFLAGSfloating | TFLAGSreal; | |
87 break; | |
88 | |
89 case TY.Tfloat80: d = Token.toChars(TOK.TOKfloat80); | |
90 flags |= TFLAGSfloating | TFLAGSreal; | |
91 break; | |
92 | |
93 case TY.Timaginary32: d = Token.toChars(TOK.TOKimaginary32); | |
94 flags |= TFLAGSfloating | TFLAGSimaginary; | |
95 break; | |
96 | |
97 case TY.Timaginary64: d = Token.toChars(TOK.TOKimaginary64); | |
98 flags |= TFLAGSfloating | TFLAGSimaginary; | |
99 break; | |
100 | |
101 case TY.Timaginary80: d = Token.toChars(TOK.TOKimaginary80); | |
102 flags |= TFLAGSfloating | TFLAGSimaginary; | |
103 break; | |
104 | |
105 case TY.Tcomplex32: d = Token.toChars(TOK.TOKcomplex32); | |
106 flags |= TFLAGSfloating | TFLAGScomplex; | |
107 break; | |
108 | |
109 case TY.Tcomplex64: d = Token.toChars(TOK.TOKcomplex64); | |
110 flags |= TFLAGSfloating | TFLAGScomplex; | |
111 break; | |
112 | |
113 case TY.Tcomplex80: d = Token.toChars(TOK.TOKcomplex80); | |
114 flags |= TFLAGSfloating | TFLAGScomplex; | |
115 break; | |
116 | |
117 case TY.Tbool: d = "bool"; | |
118 flags |= TFLAGSintegral | TFLAGSunsigned; | |
119 break; | |
120 | |
121 case TY.Tascii: d = Token.toChars(TOK.TOKchar); | |
122 flags |= TFLAGSintegral | TFLAGSunsigned; | |
123 break; | |
124 | |
125 case TY.Twchar: d = Token.toChars(TOK.TOKwchar); | |
126 flags |= TFLAGSintegral | TFLAGSunsigned; | |
127 break; | |
128 | |
129 case TY.Tdchar: d = Token.toChars(TOK.TOKdchar); | |
130 flags |= TFLAGSintegral | TFLAGSunsigned; | |
131 break; | |
132 } | |
133 | |
134 this.dstring = d; | |
135 this.flags = flags; | |
136 merge(); | |
137 } | |
138 | |
139 version (DumbClone) { | |
140 } else { | |
141 Type clone() | |
142 { | |
143 assert(false); | |
144 } | |
145 } | |
72 | 146 override Type syntaxCopy() |
0 | 147 { |
148 // No semantic analysis done on basic types, no need to copy | |
149 return this; | |
150 } | |
151 | |
72 | 152 override ulong size(Loc loc) |
0 | 153 { |
154 uint size; | |
155 | |
156 //printf("TypeBasic.size()\n"); | |
157 switch (ty) | |
158 { | |
159 case TY.Tint8: | |
160 case TY.Tuns8: size = 1; break; | |
161 case TY.Tint16: | |
162 case TY.Tuns16: size = 2; break; | |
163 case TY.Tint32: | |
164 case TY.Tuns32: | |
165 case TY.Tfloat32: | |
166 case TY.Timaginary32: | |
167 size = 4; break; | |
168 case TY.Tint64: | |
169 case TY.Tuns64: | |
170 case TY.Tfloat64: | |
171 case TY.Timaginary64: | |
172 size = 8; break; | |
173 case TY.Tfloat80: | |
174 case TY.Timaginary80: | |
175 size = REALSIZE; break; | |
176 case TY.Tcomplex32: | |
177 size = 8; break; | |
178 case TY.Tcomplex64: | |
179 size = 16; break; | |
180 case TY.Tcomplex80: | |
181 size = REALSIZE * 2; break; | |
182 | |
183 case TY.Tvoid: | |
184 //size = Type.size(); // error message | |
185 size = 1; | |
186 break; | |
187 | |
188 case TY.Tbool: size = 1; break; | |
189 case TY.Tascii: size = 1; break; | |
190 case TY.Twchar: size = 2; break; | |
191 case TY.Tdchar: size = 4; break; | |
192 | |
193 default: | |
194 assert(0); | |
195 break; | |
196 } | |
197 | |
198 //printf("TypeBasic.size() = %d\n", size); | |
199 return size; | |
200 } | |
201 | |
72 | 202 override uint alignsize() |
0 | 203 { |
204 uint sz; | |
205 | |
206 switch (ty) | |
207 { | |
208 case TY.Tfloat80: | |
209 case TY.Timaginary80: | |
210 case TY.Tcomplex80: | |
211 sz = REALALIGNSIZE; | |
212 break; | |
213 | |
22
fd4acc376c45
Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
214 version (POSIX) { ///TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS |
0 | 215 case TY.Tint64: |
216 case TY.Tuns64: | |
217 case TY.Tfloat64: | |
218 case TY.Timaginary64: | |
219 case TY.Tcomplex32: | |
220 case TY.Tcomplex64: | |
221 sz = 4; | |
222 break; | |
223 } | |
224 | |
225 default: | |
226 sz = cast(uint)size(Loc(0)); /// | |
227 break; | |
228 } | |
229 | |
230 return sz; | |
231 } | |
232 | |
72 | 233 override Expression getProperty(Loc loc, Identifier ident) |
0 | 234 { |
235 Expression e; | |
236 long ivalue; | |
237 real fvalue; | |
238 | |
239 //printf("TypeBasic.getProperty('%s')\n", ident.toChars()); | |
240 if (ident is Id.max) | |
241 { | |
242 switch (ty) | |
243 { | |
244 case TY.Tint8: ivalue = byte.max; goto Livalue; | |
245 case TY.Tuns8: ivalue = ubyte.max; goto Livalue; | |
246 case TY.Tint16: ivalue = short.max; goto Livalue; | |
247 case TY.Tuns16: ivalue = ushort.max; goto Livalue; | |
248 case TY.Tint32: ivalue = int.max; goto Livalue; | |
249 case TY.Tuns32: ivalue = uint.max; goto Livalue; | |
250 case TY.Tint64: ivalue = long.max; goto Livalue; | |
251 case TY.Tuns64: ivalue = ulong.max; goto Livalue; | |
252 case TY.Tbool: ivalue = bool.max; goto Livalue; | |
253 case TY.Tchar: ivalue = char.max; goto Livalue; | |
254 case TY.Twchar: ivalue = wchar.max; goto Livalue; | |
255 case TY.Tdchar: ivalue = 0x10FFFF; goto Livalue; | |
256 case TY.Tcomplex32: | |
257 case TY.Timaginary32: | |
258 case TY.Tfloat32: fvalue = float.max; goto Lfvalue; | |
259 case TY.Tcomplex64: | |
260 case TY.Timaginary64: | |
261 case TY.Tfloat64: fvalue = double.max;goto Lfvalue; | |
262 case TY.Tcomplex80: | |
263 case TY.Timaginary80: | |
264 case TY.Tfloat80: fvalue = real.max; goto Lfvalue; | |
265 } | |
266 } | |
267 else if (ident is Id.min) | |
268 { | |
269 switch (ty) | |
270 { | |
271 case TY.Tint8: ivalue = byte.min; goto Livalue; | |
272 case TY.Tuns8: ivalue = ubyte.min; goto Livalue; | |
273 case TY.Tint16: ivalue = short.min; goto Livalue; | |
274 case TY.Tuns16: ivalue = ushort.min; goto Livalue; | |
275 case TY.Tint32: ivalue = int.min; goto Livalue; | |
276 case TY.Tuns32: ivalue = uint.min; goto Livalue; | |
277 case TY.Tint64: ivalue = long.min; goto Livalue; | |
278 case TY.Tuns64: ivalue = ulong.min; goto Livalue; | |
279 case TY.Tbool: ivalue = bool.min; goto Livalue; | |
280 case TY.Tchar: ivalue = char.min; goto Livalue; | |
281 case TY.Twchar: ivalue = wchar.min; goto Livalue; | |
282 case TY.Tdchar: ivalue = dchar.min; goto Livalue; | |
283 case TY.Tcomplex32: | |
284 case TY.Timaginary32: | |
285 case TY.Tfloat32: fvalue = float.min; goto Lfvalue; | |
286 case TY.Tcomplex64: | |
287 case TY.Timaginary64: | |
288 case TY.Tfloat64: fvalue = double.min; goto Lfvalue; | |
289 case TY.Tcomplex80: | |
290 case TY.Timaginary80: | |
291 case TY.Tfloat80: fvalue = real.min; goto Lfvalue; | |
292 } | |
293 } | |
294 else if (ident is Id.nan) | |
295 { | |
296 switch (ty) | |
297 { | |
298 case TY.Tcomplex32: | |
299 case TY.Tcomplex64: | |
300 case TY.Tcomplex80: | |
301 case TY.Timaginary32: | |
302 case TY.Timaginary64: | |
303 case TY.Timaginary80: | |
304 case TY.Tfloat32: | |
305 case TY.Tfloat64: | |
306 case TY.Tfloat80: | |
307 { | |
308 fvalue = real.nan; | |
309 goto Lfvalue; | |
310 } | |
311 } | |
312 } | |
313 else if (ident is Id.infinity) | |
314 { | |
315 switch (ty) | |
316 { | |
317 case TY.Tcomplex32: | |
318 case TY.Tcomplex64: | |
319 case TY.Tcomplex80: | |
320 case TY.Timaginary32: | |
321 case TY.Timaginary64: | |
322 case TY.Timaginary80: | |
323 case TY.Tfloat32: | |
324 case TY.Tfloat64: | |
325 case TY.Tfloat80: | |
326 fvalue = real.infinity; | |
327 goto Lfvalue; | |
328 } | |
329 } | |
330 else if (ident is Id.dig) | |
331 { | |
332 switch (ty) | |
333 { | |
334 case TY.Tcomplex32: | |
335 case TY.Timaginary32: | |
336 case TY.Tfloat32: ivalue = float.dig; goto Lint; | |
337 case TY.Tcomplex64: | |
338 case TY.Timaginary64: | |
339 case TY.Tfloat64: ivalue = double.dig; goto Lint; | |
340 case TY.Tcomplex80: | |
341 case TY.Timaginary80: | |
342 case TY.Tfloat80: ivalue = real.dig; goto Lint; | |
343 } | |
344 } | |
345 else if (ident is Id.epsilon) | |
346 { | |
347 switch (ty) | |
348 { | |
349 case TY.Tcomplex32: | |
350 case TY.Timaginary32: | |
351 case TY.Tfloat32: fvalue = float.epsilon; goto Lfvalue; | |
352 case TY.Tcomplex64: | |
353 case TY.Timaginary64: | |
354 case TY.Tfloat64: fvalue = double.epsilon; goto Lfvalue; | |
355 case TY.Tcomplex80: | |
356 case TY.Timaginary80: | |
357 case TY.Tfloat80: fvalue = real.epsilon; goto Lfvalue; | |
358 } | |
359 } | |
360 else if (ident is Id.mant_dig) | |
361 { | |
362 switch (ty) | |
363 { | |
364 case TY.Tcomplex32: | |
365 case TY.Timaginary32: | |
366 case TY.Tfloat32: ivalue = float.mant_dig; goto Lint; | |
367 case TY.Tcomplex64: | |
368 case TY.Timaginary64: | |
369 case TY.Tfloat64: ivalue = double.mant_dig; goto Lint; | |
370 case TY.Tcomplex80: | |
371 case TY.Timaginary80: | |
372 case TY.Tfloat80: ivalue = real.mant_dig; goto Lint; | |
373 } | |
374 } | |
375 else if (ident is Id.max_10_exp) | |
376 { | |
377 switch (ty) | |
378 { | |
379 case TY.Tcomplex32: | |
380 case TY.Timaginary32: | |
381 case TY.Tfloat32: ivalue = float.max_10_exp; goto Lint; | |
382 case TY.Tcomplex64: | |
383 case TY.Timaginary64: | |
384 case TY.Tfloat64: ivalue = double.max_10_exp; goto Lint; | |
385 case TY.Tcomplex80: | |
386 case TY.Timaginary80: | |
387 case TY.Tfloat80: ivalue = real.max_10_exp; goto Lint; | |
388 } | |
389 } | |
390 else if (ident is Id.max_exp) | |
391 { | |
392 switch (ty) | |
393 { | |
394 case TY.Tcomplex32: | |
395 case TY.Timaginary32: | |
396 case TY.Tfloat32: ivalue = float.max_exp; goto Lint; | |
397 case TY.Tcomplex64: | |
398 case TY.Timaginary64: | |
399 case TY.Tfloat64: ivalue = double.max_exp; goto Lint; | |
400 case TY.Tcomplex80: | |
401 case TY.Timaginary80: | |
402 case TY.Tfloat80: ivalue = real.max_exp; goto Lint; | |
403 } | |
404 } | |
405 else if (ident is Id.min_10_exp) | |
406 { | |
407 switch (ty) | |
408 { | |
409 case TY.Tcomplex32: | |
410 case TY.Timaginary32: | |
411 case TY.Tfloat32: ivalue = float.min_10_exp; goto Lint; | |
412 case TY.Tcomplex64: | |
413 case TY.Timaginary64: | |
414 case TY.Tfloat64: ivalue = double.min_10_exp; goto Lint; | |
415 case TY.Tcomplex80: | |
416 case TY.Timaginary80: | |
417 case TY.Tfloat80: ivalue = real.min_10_exp; goto Lint; | |
418 } | |
419 } | |
420 else if (ident is Id.min_exp) | |
421 { | |
422 switch (ty) | |
423 { | |
424 case TY.Tcomplex32: | |
425 case TY.Timaginary32: | |
426 case TY.Tfloat32: ivalue = float.min_exp; goto Lint; | |
427 case TY.Tcomplex64: | |
428 case TY.Timaginary64: | |
429 case TY.Tfloat64: ivalue = double.min_exp; goto Lint; | |
430 case TY.Tcomplex80: | |
431 case TY.Timaginary80: | |
432 case TY.Tfloat80: ivalue = real.min_exp; goto Lint; | |
433 } | |
434 } | |
435 | |
436 Ldefault: | |
437 return Type.getProperty(loc, ident); | |
438 | |
439 Livalue: | |
440 e = new IntegerExp(loc, ivalue, this); | |
441 return e; | |
442 | |
443 Lfvalue: | |
444 if (isreal() || isimaginary()) | |
445 e = new RealExp(loc, fvalue, this); | |
446 else | |
447 { | |
448 Complex!(real) cvalue; | |
449 cvalue.re = fvalue; | |
450 cvalue.im = fvalue; | |
451 | |
452 //for (int i = 0; i < 20; i++) | |
453 // printf("%02x ", ((unsigned char *)&cvalue)[i]); | |
454 //printf("\n"); | |
455 e = new ComplexExp(loc, cvalue, this); | |
456 } | |
457 return e; | |
458 | |
459 Lint: | |
460 e = new IntegerExp(loc, ivalue, Type.tint32); | |
461 return e; | |
462 } | |
463 | |
72 | 464 override Expression dotExp(Scope sc, Expression e, Identifier ident) |
0 | 465 { |
466 version (LOGDOTEXP) { | |
467 printf("TypeBasic.dotExp(e = '%s', ident = '%s')\n", e.toChars(), ident.toChars()); | |
468 } | |
469 Type t; | |
470 | |
471 if (ident is Id.re) | |
472 { | |
473 switch (ty) | |
474 { | |
475 case TY.Tcomplex32: t = tfloat32; goto L1; | |
476 case TY.Tcomplex64: t = tfloat64; goto L1; | |
477 case TY.Tcomplex80: t = tfloat80; goto L1; | |
478 L1: | |
479 e = e.castTo(sc, t); | |
480 break; | |
481 | |
482 case TY.Tfloat32: | |
483 case TY.Tfloat64: | |
484 case TY.Tfloat80: | |
485 break; | |
486 | |
487 case TY.Timaginary32: t = tfloat32; goto L2; | |
488 case TY.Timaginary64: t = tfloat64; goto L2; | |
489 case TY.Timaginary80: t = tfloat80; goto L2; | |
490 L2: | |
491 e = new RealExp(Loc(0), 0.0, t); | |
492 break; | |
493 | |
494 default: | |
495 return Type.getProperty(e.loc, ident); | |
496 } | |
497 } | |
498 else if (ident is Id.im) | |
499 { | |
500 Type t2; | |
501 | |
502 switch (ty) | |
503 { | |
504 case TY.Tcomplex32: t = timaginary32; t2 = tfloat32; goto L3; | |
505 case TY.Tcomplex64: t = timaginary64; t2 = tfloat64; goto L3; | |
506 case TY.Tcomplex80: t = timaginary80; t2 = tfloat80; goto L3; | |
507 L3: | |
508 e = e.castTo(sc, t); | |
509 e.type = t2; | |
510 break; | |
511 | |
512 case TY.Timaginary32: t = tfloat32; goto L4; | |
513 case TY.Timaginary64: t = tfloat64; goto L4; | |
514 case TY.Timaginary80: t = tfloat80; goto L4; | |
515 L4: | |
516 e = e.copy(); | |
517 e.type = t; | |
518 break; | |
519 | |
520 case TY.Tfloat32: | |
521 case TY.Tfloat64: | |
522 case TY.Tfloat80: | |
523 e = new RealExp(Loc(0), 0.0, this); | |
524 break; | |
525 | |
526 default: | |
527 return Type.getProperty(e.loc, ident); | |
528 } | |
529 } | |
530 else | |
531 { | |
532 return Type.dotExp(sc, e, ident); | |
533 } | |
534 return e; | |
535 } | |
536 | |
72 | 537 override string toChars() |
0 | 538 { |
539 return Type.toChars(); | |
540 } | |
541 | |
72 | 542 override void toCBuffer2(OutBuffer buf, HdrGenState* hgs, MOD mod) |
0 | 543 { |
544 //printf("TypeBasic.toCBuffer2(mod = %d, this.mod = %d)\n", mod, this.mod); | |
545 if (mod != this.mod) | |
546 { | |
547 toCBuffer3(buf, hgs, mod); | |
548 return; | |
549 } | |
550 buf.writestring(dstring); | |
551 } | |
552 | |
553 version (CPP_MANGLE) { | |
554 void toCppMangle(OutBuffer buf, CppMangleState* cms) | |
555 { | |
556 assert(false); | |
557 } | |
558 } | |
72 | 559 override bool isintegral() |
0 | 560 { |
561 //printf("TypeBasic.isintegral('%s') x%x\n", toChars(), flags); | |
562 return (flags & TFLAGS.TFLAGSintegral) != 0; | |
563 } | |
564 | |
565 bool isbit() | |
566 { | |
567 assert(false); | |
568 } | |
569 | |
72 | 570 override bool isfloating() |
0 | 571 { |
572 return (flags & TFLAGS.TFLAGSfloating) != 0; | |
573 } | |
574 | |
72 | 575 override bool isreal() |
0 | 576 { |
577 return (flags & TFLAGS.TFLAGSreal) != 0; | |
578 } | |
579 | |
72 | 580 override bool isimaginary() |
0 | 581 { |
582 return (flags & TFLAGS.TFLAGSimaginary) != 0; | |
583 } | |
584 | |
72 | 585 override bool iscomplex() |
0 | 586 { |
587 return (flags & TFLAGS.TFLAGScomplex) != 0; | |
588 } | |
589 | |
72 | 590 override bool isscalar() |
0 | 591 { |
592 return (flags & (TFLAGS.TFLAGSintegral | TFLAGS.TFLAGSfloating)) != 0; | |
593 } | |
594 | |
72 | 595 override bool isunsigned() |
0 | 596 { |
597 return (flags & TFLAGS.TFLAGSunsigned) != 0; | |
598 } | |
599 | |
72 | 600 override MATCH implicitConvTo(Type to) |
0 | 601 { |
602 //printf("TypeBasic.implicitConvTo(%s) from %s\n", to.toChars(), toChars()); | |
603 if (this is to) | |
604 return MATCH.MATCHexact; | |
605 | |
606 version (DMDV2) { | |
607 if (ty is to.ty) | |
608 { | |
609 return (mod == to.mod) ? MATCH.MATCHexact : MATCH.MATCHconst; | |
610 } | |
611 } | |
612 | |
613 if (ty == TY.Tvoid || to.ty == TY.Tvoid) | |
614 return MATCH.MATCHnomatch; | |
615 if (to.ty == TY.Tbool) | |
616 return MATCH.MATCHnomatch; | |
617 if (!to.isTypeBasic()) | |
618 return MATCH.MATCHnomatch; | |
619 | |
620 TypeBasic tob = cast(TypeBasic)to; | |
621 if (flags & TFLAGS.TFLAGSintegral) | |
622 { | |
623 // Disallow implicit conversion of integers to imaginary or complex | |
624 if (tob.flags & (TFLAGS.TFLAGSimaginary | TFLAGS.TFLAGScomplex)) | |
625 return MATCH.MATCHnomatch; | |
626 | |
627 version (DMDV2) { | |
628 // If converting from integral to integral | |
629 if (1 && tob.flags & TFLAGS.TFLAGSintegral) | |
630 { ulong sz = size(Loc(0)); | |
631 ulong tosz = tob.size(Loc(0)); | |
632 | |
633 /* Can't convert to smaller size | |
634 */ | |
635 if (sz > tosz) | |
636 return MATCH.MATCHnomatch; | |
637 | |
638 /* Can't change sign if same size | |
639 */ | |
640 /*if (sz == tosz && (flags ^ tob.flags) & TFLAGSunsigned) | |
641 return MATCH.MATCHnomatch;*/ | |
642 } | |
643 } | |
644 } | |
645 else if (flags & TFLAGS.TFLAGSfloating) | |
646 { | |
647 // Disallow implicit conversion of floating point to integer | |
648 if (tob.flags & TFLAGS.TFLAGSintegral) | |
649 return MATCH.MATCHnomatch; | |
650 | |
651 assert(tob.flags & TFLAGS.TFLAGSfloating); | |
652 | |
653 // Disallow implicit conversion from complex to non-complex | |
654 if (flags & TFLAGS.TFLAGScomplex && !(tob.flags & TFLAGS.TFLAGScomplex)) | |
655 return MATCH.MATCHnomatch; | |
656 | |
657 // Disallow implicit conversion of real or imaginary to complex | |
658 if (flags & (TFLAGS.TFLAGSreal | TFLAGS.TFLAGSimaginary) && | |
659 tob.flags & TFLAGS.TFLAGScomplex) | |
660 return MATCH.MATCHnomatch; | |
661 | |
662 // Disallow implicit conversion to-from real and imaginary | |
663 if ((flags & (TFLAGS.TFLAGSreal | TFLAGS.TFLAGSimaginary)) != | |
664 (tob.flags & (TFLAGS.TFLAGSreal | TFLAGS.TFLAGSimaginary))) | |
665 return MATCH.MATCHnomatch; | |
666 } | |
667 return MATCH.MATCHconvert; | |
668 } | |
669 | |
72 | 670 override Expression defaultInit(Loc loc) |
0 | 671 { |
672 long value = 0; | |
673 | |
674 version (SNAN_DEFAULT_INIT) { | |
675 /* | |
676 * Use a payload which is different from the machine NaN, | |
677 * so that uninitialised variables can be | |
678 * detected even if exceptions are disabled. | |
679 */ | |
680 ushort[8] snan = [ 0, 0, 0, 0xA000, 0x7FFF, 0, 0, 0 ]; | |
681 /* | |
682 * Although long doubles are 10 bytes long, some | |
683 * C ABIs pad them out to 12 or even 16 bytes, so | |
684 * leave enough space in the snan array. | |
685 */ | |
686 assert(REALSIZE <= snan.sizeof); | |
687 real fvalue = *cast(real*)snan.ptr; | |
688 } | |
689 | |
690 version (LOGDEFAULTINIT) { | |
691 printf("TypeBasic.defaultInit() '%s'\n", toChars()); | |
692 } | |
693 switch (ty) | |
694 { | |
695 case TY.Tchar: | |
696 value = 0xFF; | |
697 break; | |
698 | |
699 case TY.Twchar: | |
700 case TY.Tdchar: | |
701 value = 0xFFFF; | |
702 break; | |
703 | |
704 case TY.Timaginary32: | |
705 case TY.Timaginary64: | |
706 case TY.Timaginary80: | |
707 case TY.Tfloat32: | |
708 case TY.Tfloat64: | |
709 case TY.Tfloat80: | |
710 version (SNAN_DEFAULT_INIT) { | |
711 return new RealExp(loc, fvalue, this); | |
712 } else { | |
713 return getProperty(loc, Id.nan); | |
714 } | |
715 | |
716 case TY.Tcomplex32: | |
717 case TY.Tcomplex64: | |
718 case TY.Tcomplex80: | |
719 version (SNAN_DEFAULT_INIT) { | |
720 { | |
721 // Can't use fvalue + I*fvalue (the im part becomes a quiet NaN). | |
722 Complex!(real) cvalue; | |
723 cvalue.re = fvalue; | |
724 cvalue.im = fvalue; | |
725 | |
726 return new ComplexExp(loc, cvalue, this); | |
727 } | |
728 } else { | |
729 return getProperty(loc, Id.nan); | |
730 } | |
731 | |
732 case TY.Tvoid: | |
733 error(loc, "void does not have a default initializer"); | |
734 | |
735 default: | |
736 break; /// | |
737 } | |
738 return new IntegerExp(loc, value, this); | |
739 } | |
740 | |
72 | 741 override bool isZeroInit(Loc loc) |
0 | 742 { |
743 switch (ty) | |
744 { | |
745 case TY.Tchar: | |
746 case TY.Twchar: | |
747 case TY.Tdchar: | |
748 case TY.Timaginary32: | |
749 case TY.Timaginary64: | |
750 case TY.Timaginary80: | |
751 case TY.Tfloat32: | |
752 case TY.Tfloat64: | |
753 case TY.Tfloat80: | |
754 case TY.Tcomplex32: | |
755 case TY.Tcomplex64: | |
756 case TY.Tcomplex80: | |
757 return false; // no | |
758 default: | |
759 break; | |
760 } | |
761 | |
762 return true; // yes | |
763 } | |
764 | |
72 | 765 override bool builtinTypeInfo() |
0 | 766 { |
767 version (DMDV2) { | |
768 return mod ? false : true; | |
769 } else { | |
770 return true; | |
771 } | |
772 } | |
773 | |
774 // For eliminating dynamic_cast | |
72 | 775 override TypeBasic isTypeBasic() |
0 | 776 { |
777 return this; | |
778 } | |
22
fd4acc376c45
Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents:
0
diff
changeset
|
779 } |