Allow implicit conversion "foo*?" to "void*"
[delight/core.git] / dmd / impcnvgen.c
blobbdd222d5f4daa5a09b3ff8acbe50073815b5f58f
2 // Copyright (c) 1999-2006 by Digital Mars
3 // All Rights Reserved
4 // written by Walter Bright
5 // http://www.digitalmars.com
6 // License for redistribution is by either the Artistic License
7 // in artistic.txt, or the GNU General Public License in gnu.txt.
8 // See the included readme.txt for details.
10 /* NOTE: This file has been patched from the original DMD distribution to
11 work with the GDC compiler.
13 Modified by David Friedman, January 2007
16 #include <stdio.h>
17 #include <stdlib.h>
19 #define ENUM_TY_ONLY
20 #include "mtype.h"
22 enum TY impcnvResult[TMAX][TMAX];
23 enum TY impcnvType1[TMAX][TMAX];
24 enum TY impcnvType2[TMAX][TMAX];
25 int impcnvWarn[TMAX][TMAX];
27 int integral_promotion(int t)
29 switch (t)
31 case Tchar:
32 case Twchar:
33 case Tbit:
34 case Tbool:
35 case Tint8:
36 case Tuns8:
37 case Tint16:
38 case Tuns16: return Tint32;
39 case Tdchar: return Tuns32;
40 default: return t;
44 void init()
45 { int i, j;
47 // Set conversion tables
48 for (i = 0; i < TMAX; i++)
49 for (j = 0; j < TMAX; j++)
50 { impcnvResult[i][j] = Terror;
51 impcnvType1[i][j] = Terror;
52 impcnvType2[i][j] = Terror;
53 impcnvWarn[i][j] = 0;
56 #define X(t1,t2, nt1,nt2, rt) \
57 impcnvResult[t1][t2] = rt; \
58 impcnvType1[t1][t2] = nt1; \
59 impcnvType2[t1][t2] = nt2;
61 /* ======================= */
63 X(Tbit,Tbit, Tint32,Tint32, Tint32)
64 X(Tbit,Tint8, Tint32,Tint32, Tint32)
65 X(Tbit,Tuns8, Tint32,Tint32, Tint32)
66 X(Tbit,Tint16, Tint32,Tint32, Tint32)
67 X(Tbit,Tuns16, Tint32,Tint32, Tint32)
68 X(Tbit,Tint32, Tint32,Tint32, Tint32)
69 X(Tbit,Tuns32, Tuns32,Tuns32, Tuns32)
70 X(Tbit,Tint64, Tint64,Tint64, Tint64)
71 X(Tbit,Tuns64, Tuns64,Tuns64, Tuns64)
73 X(Tbit,Tfloat32, Tfloat32,Tfloat32, Tfloat32)
74 X(Tbit,Tfloat64, Tfloat64,Tfloat64, Tfloat64)
75 X(Tbit,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
76 X(Tbit,Timaginary32, Tfloat32,Timaginary32, Tfloat32)
77 X(Tbit,Timaginary64, Tfloat64,Timaginary64, Tfloat64)
78 X(Tbit,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
79 X(Tbit,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32)
80 X(Tbit,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64)
81 X(Tbit,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
83 /* ======================= */
85 X(Tbool,Tbool, Tbool,Tbool, Tbool)
86 X(Tbool,Tint8, Tint32,Tint32, Tint32)
87 X(Tbool,Tuns8, Tint32,Tint32, Tint32)
88 X(Tbool,Tint16, Tint32,Tint32, Tint32)
89 X(Tbool,Tuns16, Tint32,Tint32, Tint32)
90 X(Tbool,Tint32, Tint32,Tint32, Tint32)
91 X(Tbool,Tuns32, Tuns32,Tuns32, Tuns32)
92 X(Tbool,Tint64, Tint64,Tint64, Tint64)
93 X(Tbool,Tuns64, Tuns64,Tuns64, Tuns64)
95 X(Tbool,Tfloat32, Tfloat32,Tfloat32, Tfloat32)
96 X(Tbool,Tfloat64, Tfloat64,Tfloat64, Tfloat64)
97 X(Tbool,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
98 X(Tbool,Timaginary32, Tfloat32,Timaginary32, Tfloat32)
99 X(Tbool,Timaginary64, Tfloat64,Timaginary64, Tfloat64)
100 X(Tbool,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
101 X(Tbool,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32)
102 X(Tbool,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64)
103 X(Tbool,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
105 /* ======================= */
107 X(Tint8,Tint8, Tint32,Tint32, Tint32)
108 X(Tint8,Tuns8, Tint32,Tint32, Tint32)
109 X(Tint8,Tint16, Tint32,Tint32, Tint32)
110 X(Tint8,Tuns16, Tint32,Tint32, Tint32)
111 X(Tint8,Tint32, Tint32,Tint32, Tint32)
112 X(Tint8,Tuns32, Tuns32,Tuns32, Tuns32)
113 X(Tint8,Tint64, Tint64,Tint64, Tint64)
114 X(Tint8,Tuns64, Tuns64,Tuns64, Tuns64)
116 X(Tint8,Tfloat32, Tfloat32,Tfloat32, Tfloat32)
117 X(Tint8,Tfloat64, Tfloat64,Tfloat64, Tfloat64)
118 X(Tint8,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
119 X(Tint8,Timaginary32, Tfloat32,Timaginary32, Tfloat32)
120 X(Tint8,Timaginary64, Tfloat64,Timaginary64, Tfloat64)
121 X(Tint8,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
122 X(Tint8,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32)
123 X(Tint8,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64)
124 X(Tint8,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
126 /* ======================= */
128 X(Tuns8,Tuns8, Tint32,Tint32, Tint32)
129 X(Tuns8,Tint16, Tint32,Tint32, Tint32)
130 X(Tuns8,Tuns16, Tint32,Tint32, Tint32)
131 X(Tuns8,Tint32, Tint32,Tint32, Tint32)
132 X(Tuns8,Tuns32, Tuns32,Tuns32, Tuns32)
133 X(Tuns8,Tint64, Tint64,Tint64, Tint64)
134 X(Tuns8,Tuns64, Tuns64,Tuns64, Tuns64)
136 X(Tuns8,Tfloat32, Tfloat32,Tfloat32, Tfloat32)
137 X(Tuns8,Tfloat64, Tfloat64,Tfloat64, Tfloat64)
138 X(Tuns8,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
139 X(Tuns8,Timaginary32, Tfloat32,Timaginary32, Tfloat32)
140 X(Tuns8,Timaginary64, Tfloat64,Timaginary64, Tfloat64)
141 X(Tuns8,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
142 X(Tuns8,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32)
143 X(Tuns8,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64)
144 X(Tuns8,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
146 /* ======================= */
148 X(Tint16,Tint16, Tint32,Tint32, Tint32)
149 X(Tint16,Tuns16, Tint32,Tint32, Tint32)
150 X(Tint16,Tint32, Tint32,Tint32, Tint32)
151 X(Tint16,Tuns32, Tuns32,Tuns32, Tuns32)
152 X(Tint16,Tint64, Tint64,Tint64, Tint64)
153 X(Tint16,Tuns64, Tuns64,Tuns64, Tuns64)
155 X(Tint16,Tfloat32, Tfloat32,Tfloat32, Tfloat32)
156 X(Tint16,Tfloat64, Tfloat64,Tfloat64, Tfloat64)
157 X(Tint16,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
158 X(Tint16,Timaginary32, Tfloat32,Timaginary32, Tfloat32)
159 X(Tint16,Timaginary64, Tfloat64,Timaginary64, Tfloat64)
160 X(Tint16,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
161 X(Tint16,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32)
162 X(Tint16,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64)
163 X(Tint16,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
165 /* ======================= */
167 X(Tuns16,Tuns16, Tint32,Tint32, Tint32)
168 X(Tuns16,Tint32, Tint32,Tint32, Tint32)
169 X(Tuns16,Tuns32, Tuns32,Tuns32, Tuns32)
170 X(Tuns16,Tint64, Tint64,Tint64, Tint64)
171 X(Tuns16,Tuns64, Tuns64,Tuns64, Tuns64)
173 X(Tuns16,Tfloat32, Tfloat32,Tfloat32, Tfloat32)
174 X(Tuns16,Tfloat64, Tfloat64,Tfloat64, Tfloat64)
175 X(Tuns16,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
176 X(Tuns16,Timaginary32, Tfloat32,Timaginary32, Tfloat32)
177 X(Tuns16,Timaginary64, Tfloat64,Timaginary64, Tfloat64)
178 X(Tuns16,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
179 X(Tuns16,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32)
180 X(Tuns16,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64)
181 X(Tuns16,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
183 /* ======================= */
185 X(Tint32,Tint32, Tint32,Tint32, Tint32)
186 X(Tint32,Tuns32, Tuns32,Tuns32, Tuns32)
187 X(Tint32,Tint64, Tint64,Tint64, Tint64)
188 X(Tint32,Tuns64, Tuns64,Tuns64, Tuns64)
190 X(Tint32,Tfloat32, Tfloat32,Tfloat32, Tfloat32)
191 X(Tint32,Tfloat64, Tfloat64,Tfloat64, Tfloat64)
192 X(Tint32,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
193 X(Tint32,Timaginary32, Tfloat32,Timaginary32, Tfloat32)
194 X(Tint32,Timaginary64, Tfloat64,Timaginary64, Tfloat64)
195 X(Tint32,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
196 X(Tint32,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32)
197 X(Tint32,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64)
198 X(Tint32,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
200 /* ======================= */
202 X(Tuns32,Tuns32, Tuns32,Tuns32, Tuns32)
203 X(Tuns32,Tint64, Tint64,Tint64, Tint64)
204 X(Tuns32,Tuns64, Tuns64,Tuns64, Tuns64)
206 X(Tuns32,Tfloat32, Tfloat32,Tfloat32, Tfloat32)
207 X(Tuns32,Tfloat64, Tfloat64,Tfloat64, Tfloat64)
208 X(Tuns32,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
209 X(Tuns32,Timaginary32, Tfloat32,Timaginary32, Tfloat32)
210 X(Tuns32,Timaginary64, Tfloat64,Timaginary64, Tfloat64)
211 X(Tuns32,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
212 X(Tuns32,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32)
213 X(Tuns32,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64)
214 X(Tuns32,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
216 /* ======================= */
218 X(Tint64,Tint64, Tint64,Tint64, Tint64)
219 X(Tint64,Tuns64, Tuns64,Tuns64, Tuns64)
221 X(Tint64,Tfloat32, Tfloat32,Tfloat32, Tfloat32)
222 X(Tint64,Tfloat64, Tfloat64,Tfloat64, Tfloat64)
223 X(Tint64,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
224 X(Tint64,Timaginary32, Tfloat32,Timaginary32, Tfloat32)
225 X(Tint64,Timaginary64, Tfloat64,Timaginary64, Tfloat64)
226 X(Tint64,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
227 X(Tint64,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32)
228 X(Tint64,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64)
229 X(Tint64,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
231 /* ======================= */
233 X(Tuns64,Tuns64, Tuns64,Tuns64, Tuns64)
235 X(Tuns64,Tfloat32, Tfloat32,Tfloat32, Tfloat32)
236 X(Tuns64,Tfloat64, Tfloat64,Tfloat64, Tfloat64)
237 X(Tuns64,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
238 X(Tuns64,Timaginary32, Tfloat32,Timaginary32, Tfloat32)
239 X(Tuns64,Timaginary64, Tfloat64,Timaginary64, Tfloat64)
240 X(Tuns64,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
241 X(Tuns64,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32)
242 X(Tuns64,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64)
243 X(Tuns64,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
245 /* ======================= */
247 X(Tfloat32,Tfloat32, Tfloat32,Tfloat32, Tfloat32)
248 X(Tfloat32,Tfloat64, Tfloat64,Tfloat64, Tfloat64)
249 X(Tfloat32,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
251 X(Tfloat32,Timaginary32, Tfloat32,Timaginary32, Tfloat32)
252 X(Tfloat32,Timaginary64, Tfloat64,Timaginary64, Tfloat64)
253 X(Tfloat32,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
255 X(Tfloat32,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32)
256 X(Tfloat32,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64)
257 X(Tfloat32,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
259 /* ======================= */
261 X(Tfloat64,Tfloat64, Tfloat64,Tfloat64, Tfloat64)
262 X(Tfloat64,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
264 X(Tfloat64,Timaginary32, Tfloat64,Timaginary64, Tfloat64)
265 X(Tfloat64,Timaginary64, Tfloat64,Timaginary64, Tfloat64)
266 X(Tfloat64,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
268 X(Tfloat64,Tcomplex32, Tfloat64,Tcomplex64, Tcomplex64)
269 X(Tfloat64,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64)
270 X(Tfloat64,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
272 /* ======================= */
274 X(Tfloat80,Tfloat80, Tfloat80,Tfloat80, Tfloat80)
276 X(Tfloat80,Timaginary32, Tfloat80,Timaginary80, Tfloat80)
277 X(Tfloat80,Timaginary64, Tfloat80,Timaginary80, Tfloat80)
278 X(Tfloat80,Timaginary80, Tfloat80,Timaginary80, Tfloat80)
280 X(Tfloat80,Tcomplex32, Tfloat80,Tcomplex80, Tcomplex80)
281 X(Tfloat80,Tcomplex64, Tfloat80,Tcomplex80, Tcomplex80)
282 X(Tfloat80,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80)
284 /* ======================= */
286 X(Timaginary32,Timaginary32, Timaginary32,Timaginary32, Timaginary32)
287 X(Timaginary32,Timaginary64, Timaginary64,Timaginary64, Timaginary64)
288 X(Timaginary32,Timaginary80, Timaginary80,Timaginary80, Timaginary80)
290 X(Timaginary32,Tcomplex32, Timaginary32,Tcomplex32, Tcomplex32)
291 X(Timaginary32,Tcomplex64, Timaginary64,Tcomplex64, Tcomplex64)
292 X(Timaginary32,Tcomplex80, Timaginary80,Tcomplex80, Tcomplex80)
294 /* ======================= */
296 X(Timaginary64,Timaginary64, Timaginary64,Timaginary64, Timaginary64)
297 X(Timaginary64,Timaginary80, Timaginary80,Timaginary80, Timaginary80)
299 X(Timaginary64,Tcomplex32, Timaginary64,Tcomplex64, Tcomplex64)
300 X(Timaginary64,Tcomplex64, Timaginary64,Tcomplex64, Tcomplex64)
301 X(Timaginary64,Tcomplex80, Timaginary80,Tcomplex80, Tcomplex80)
303 /* ======================= */
305 X(Timaginary80,Timaginary80, Timaginary80,Timaginary80, Timaginary80)
307 X(Timaginary80,Tcomplex32, Timaginary80,Tcomplex80, Tcomplex80)
308 X(Timaginary80,Tcomplex64, Timaginary80,Tcomplex80, Tcomplex80)
309 X(Timaginary80,Tcomplex80, Timaginary80,Tcomplex80, Tcomplex80)
311 /* ======================= */
313 X(Tcomplex32,Tcomplex32, Tcomplex32,Tcomplex32, Tcomplex32)
314 X(Tcomplex32,Tcomplex64, Tcomplex64,Tcomplex64, Tcomplex64)
315 X(Tcomplex32,Tcomplex80, Tcomplex80,Tcomplex80, Tcomplex80)
317 /* ======================= */
319 X(Tcomplex64,Tcomplex64, Tcomplex64,Tcomplex64, Tcomplex64)
320 X(Tcomplex64,Tcomplex80, Tcomplex80,Tcomplex80, Tcomplex80)
322 /* ======================= */
324 X(Tcomplex80,Tcomplex80, Tcomplex80,Tcomplex80, Tcomplex80)
326 #undef X
328 #define Y(t1,t2) impcnvWarn[t1][t2] = 1;
329 Y(Tint8, Tbit)
330 Y(Tuns8, Tbit)
331 Y(Tint16, Tbit)
332 Y(Tuns16, Tbit)
333 Y(Tint32, Tbit)
334 Y(Tuns32, Tbit)
335 Y(Tint64, Tbit)
336 Y(Tuns64, Tbit)
338 Y(Tuns8, Tint8)
339 Y(Tint16, Tint8)
340 Y(Tuns16, Tint8)
341 Y(Tint32, Tint8)
342 Y(Tuns32, Tint8)
343 Y(Tint64, Tint8)
344 Y(Tuns64, Tint8)
346 Y(Tint8, Tuns8)
347 Y(Tint16, Tuns8)
348 Y(Tuns16, Tuns8)
349 Y(Tint32, Tuns8)
350 Y(Tuns32, Tuns8)
351 Y(Tint64, Tuns8)
352 Y(Tuns64, Tuns8)
354 Y(Tuns16, Tint16)
355 Y(Tint32, Tint16)
356 Y(Tuns32, Tint16)
357 Y(Tint64, Tint16)
358 Y(Tuns64, Tint16)
360 Y(Tint16, Tuns16)
361 Y(Tint32, Tuns16)
362 Y(Tuns32, Tuns16)
363 Y(Tint64, Tuns16)
364 Y(Tuns64, Tuns16)
366 // Y(Tuns32, Tint32)
367 Y(Tint64, Tint32)
368 Y(Tuns64, Tint32)
370 // Y(Tint32, Tuns32)
371 Y(Tint64, Tuns32)
372 Y(Tuns64, Tuns32)
374 Y(Tint64, Tuns64)
375 Y(Tuns64, Tint64)
377 for (i = 0; i < TMAX; i++)
378 for (j = 0; j < TMAX; j++)
380 if (impcnvResult[i][j] == Terror)
382 impcnvResult[i][j] = impcnvResult[j][i];
383 impcnvType1[i][j] = impcnvType2[j][i];
384 impcnvType2[i][j] = impcnvType1[j][i];
389 int main()
390 { FILE *fp;
391 int i;
392 int j;
394 init();
396 fp = fopen("impcnvtab.c","w");
398 fprintf(fp,"// This file is generated by impcnvgen.c\n");
399 fprintf(fp,"#include \"mtype.h\"\n");
401 fprintf(fp,"unsigned char Type::impcnvResult[TMAX][TMAX] =\n{\n");
402 for (i = 0; i < TMAX; i++)
404 for (j = 0; j < TMAX; j++)
406 fprintf(fp, "%d,",impcnvResult[i][j]);
408 fprintf(fp, "\n");
410 fprintf(fp,"};\n");
412 fprintf(fp,"unsigned char Type::impcnvType1[TMAX][TMAX] =\n{\n");
413 for (i = 0; i < TMAX; i++)
415 for (j = 0; j < TMAX; j++)
417 fprintf(fp, "%d,",impcnvType1[i][j]);
419 fprintf(fp, "\n");
421 fprintf(fp,"};\n");
423 fprintf(fp,"unsigned char Type::impcnvType2[TMAX][TMAX] =\n{\n");
424 for (i = 0; i < TMAX; i++)
426 for (j = 0; j < TMAX; j++)
428 fprintf(fp, "%d,",impcnvType2[i][j]);
430 fprintf(fp, "\n");
432 fprintf(fp,"};\n");
434 fprintf(fp,"unsigned char Type::impcnvWarn[TMAX][TMAX] =\n{\n");
435 for (i = 0; i < TMAX; i++)
437 for (j = 0; j < TMAX; j++)
439 fprintf(fp, "%d,",impcnvWarn[i][j]);
441 fprintf(fp, "\n");
443 fprintf(fp,"};\n");
445 fclose(fp);
446 return EXIT_SUCCESS;