1 /**
2  * Provides an implicit conversion table for basic types.
3  *
4  * Used to determine integer promotions and common types.
5  *
6  * Specification: $(LINK2 https://dlang.org/spec/type.html#integer-promotions, Integer Promotions),
7  *   $(LINK2 https://dlang.org/spec/type.html#usual-arithmetic-conversions, Usual Arithmetic Conversions).
8  *
9  * Copyright:   Copyright (C) 1999-2023 by The D Language Foundation, All Rights Reserved
10  * Authors:     $(LINK2 https://www.digitalmars.com, Walter Bright)
11  * License:     $(LINK2 https://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
12  * Source:      $(LINK2 https://github.com/dlang/dmd/blob/master/src/dmd/impcnvtab.d, _impcnvtab.d)
13  * Documentation:  https://dlang.org/phobos/dmd_impcnvtab.html
14  * Coverage:    https://codecov.io/gh/dlang/dmd/src/master/src/dmd/impcnvtab.d
15  */
16 
17 module dmd.impcnvtab;
18 
19 import dmd.astenums;
20 import dmd.mtype;
21 
22 pure @nogc nothrow @safe:
23 
24 /*************************************************
25  * If ty1 and ty2 are basic types, return the TY that both can
26  * be implicitly converted to.
27  * Params:
28  *      ty1 = first operand type
29  *      ty2 = second operand type
30  * Returns:
31  *      ty = common type, else Terror
32  */
33 TY implicitConvCommonTy(TY ty1, TY ty2)
34 {
35     return impCnvTab.impcnvResultTab[ty1][ty2];
36 }
37 
38 /*************************************************
39  * If ty1 and ty2 are basic types, return the TY that ty1 can
40  * be implicitly converted to to bring them to a common ty.
41  * It's symmetric, i.e. the operands can be swapped.
42  * Params:
43  *      ty1 = first operand type
44  *      ty2 = second operand type
45  * Returns:
46  *      ty = what ty1 should be converted to, else Terror
47  */
48 TY implicitConvTy1(TY ty1, TY ty2)
49 {
50     return impCnvTab.impcnvType1Tab[ty1][ty2];
51 }
52 
53 /******************************************************************************/
54 
55 private:
56 
57 struct ImpCnvTab
58 {
59     TY[TMAX][TMAX] impcnvResultTab;
60     TY[TMAX][TMAX] impcnvType1Tab;
61 }
62 
63 enum ImpCnvTab impCnvTab = generateImpCnvTab();
64 
65 ImpCnvTab generateImpCnvTab()
66 {
67     TY[TMAX] typeTYs =
68     [
69         Tarray,
70         Tsarray,
71         Taarray,
72         Tpointer,
73         Treference,
74         Tfunction,
75         Tident,
76         Tclass,
77         Tstruct,
78         Tenum,
79         Tdelegate,
80         Tnone,
81         Tvoid,
82         Tint8,
83         Tuns8,
84         Tint16,
85         Tuns16,
86         Tint32,
87         Tuns32,
88         Tint64,
89         Tuns64,
90         Tfloat32,
91         Tfloat64,
92         Tfloat80,
93         Timaginary32,
94         Timaginary64,
95         Timaginary80,
96         Tcomplex32,
97         Tcomplex64,
98         Tcomplex80,
99         Tbool,
100         Tchar,
101         Twchar,
102         Tdchar,
103         Terror,
104         Tinstance,
105         Ttypeof,
106         Ttuple,
107         Tslice,
108         Treturn,
109         Tnull,
110         Tvector,
111         Tint128,
112         Tuns128,
113         Ttraits,
114         Tmixin,
115         Tnoreturn,
116         Ttag,
117     ];
118     ImpCnvTab impCnvTab;
119 
120     // Set conversion tables
121     foreach (i; 0 .. cast(size_t)TMAX)
122     {
123         foreach (j; 0 .. cast(size_t)TMAX)
124         {
125             impCnvTab.impcnvResultTab[i][j] = Terror;
126             impCnvTab.impcnvType1Tab[i][j] = Terror;
127         }
128     }
129 
130     void X(TY t1, TY t2, TY nt1, TY nt2, TY rt)
131     {
132         impCnvTab.impcnvResultTab[t1][t2] = rt;
133         impCnvTab.impcnvResultTab[t2][t1] = rt;
134 
135         impCnvTab.impcnvType1Tab[t1][t2] = nt1;
136         impCnvTab.impcnvType1Tab[t2][t1] = nt2;
137     }
138 
139     /* ======================= */
140 
141     X(Tbool,Tbool,   Tbool,Tbool,    Tbool);
142     X(Tbool,Tint8,   Tint32,Tint32,  Tint32);
143     X(Tbool,Tuns8,   Tint32,Tint32,  Tint32);
144     X(Tbool,Tint16,  Tint32,Tint32,  Tint32);
145     X(Tbool,Tuns16,  Tint32,Tint32,  Tint32);
146     X(Tbool,Tint32,  Tint32,Tint32,  Tint32);
147     X(Tbool,Tuns32,  Tuns32,Tuns32,  Tuns32);
148     X(Tbool,Tint64,  Tint64,Tint64,  Tint64);
149     X(Tbool,Tuns64,  Tuns64,Tuns64,  Tuns64);
150     X(Tbool,Tint128, Tint128,Tint128, Tint128);
151     X(Tbool,Tuns128, Tuns128,Tuns128, Tuns128);
152 
153     X(Tbool,Tfloat32,     Tfloat32,Tfloat32,     Tfloat32);
154     X(Tbool,Tfloat64,     Tfloat64,Tfloat64,     Tfloat64);
155     X(Tbool,Tfloat80,     Tfloat80,Tfloat80,     Tfloat80);
156     X(Tbool,Timaginary32, Tfloat32,Timaginary32, Tfloat32);
157     X(Tbool,Timaginary64, Tfloat64,Timaginary64, Tfloat64);
158     X(Tbool,Timaginary80, Tfloat80,Timaginary80, Tfloat80);
159     X(Tbool,Tcomplex32,   Tfloat32,Tcomplex32,   Tcomplex32);
160     X(Tbool,Tcomplex64,   Tfloat64,Tcomplex64,   Tcomplex64);
161     X(Tbool,Tcomplex80,   Tfloat80,Tcomplex80,   Tcomplex80);
162 
163     /* ======================= */
164 
165     X(Tint8,Tint8,   Tint32,Tint32,  Tint32);
166     X(Tint8,Tuns8,   Tint32,Tint32,  Tint32);
167     X(Tint8,Tint16,  Tint32,Tint32,  Tint32);
168     X(Tint8,Tuns16,  Tint32,Tint32,  Tint32);
169     X(Tint8,Tint32,  Tint32,Tint32,  Tint32);
170     X(Tint8,Tuns32,  Tuns32,Tuns32,  Tuns32);
171     X(Tint8,Tint64,  Tint64,Tint64,  Tint64);
172     X(Tint8,Tuns64,  Tuns64,Tuns64,  Tuns64);
173     X(Tint8,Tint128, Tint128,Tint128, Tint128);
174     X(Tint8,Tuns128, Tuns128,Tuns128, Tuns128);
175 
176     X(Tint8,Tfloat32,     Tfloat32,Tfloat32,     Tfloat32);
177     X(Tint8,Tfloat64,     Tfloat64,Tfloat64,     Tfloat64);
178     X(Tint8,Tfloat80,     Tfloat80,Tfloat80,     Tfloat80);
179     X(Tint8,Timaginary32, Tfloat32,Timaginary32, Tfloat32);
180     X(Tint8,Timaginary64, Tfloat64,Timaginary64, Tfloat64);
181     X(Tint8,Timaginary80, Tfloat80,Timaginary80, Tfloat80);
182     X(Tint8,Tcomplex32,   Tfloat32,Tcomplex32,   Tcomplex32);
183     X(Tint8,Tcomplex64,   Tfloat64,Tcomplex64,   Tcomplex64);
184     X(Tint8,Tcomplex80,   Tfloat80,Tcomplex80,   Tcomplex80);
185 
186     /* ======================= */
187 
188     X(Tuns8,Tuns8,   Tint32,Tint32,  Tint32);
189     X(Tuns8,Tint16,  Tint32,Tint32,  Tint32);
190     X(Tuns8,Tuns16,  Tint32,Tint32,  Tint32);
191     X(Tuns8,Tint32,  Tint32,Tint32,  Tint32);
192     X(Tuns8,Tuns32,  Tuns32,Tuns32,  Tuns32);
193     X(Tuns8,Tint64,  Tint64,Tint64,  Tint64);
194     X(Tuns8,Tuns64,  Tuns64,Tuns64,  Tuns64);
195     X(Tuns8,Tint128,  Tint128,Tint128,  Tint128);
196     X(Tuns8,Tuns128,  Tuns128,Tuns128,  Tuns128);
197 
198     X(Tuns8,Tfloat32,     Tfloat32,Tfloat32,     Tfloat32);
199     X(Tuns8,Tfloat64,     Tfloat64,Tfloat64,     Tfloat64);
200     X(Tuns8,Tfloat80,     Tfloat80,Tfloat80,     Tfloat80);
201     X(Tuns8,Timaginary32, Tfloat32,Timaginary32, Tfloat32);
202     X(Tuns8,Timaginary64, Tfloat64,Timaginary64, Tfloat64);
203     X(Tuns8,Timaginary80, Tfloat80,Timaginary80, Tfloat80);
204     X(Tuns8,Tcomplex32,   Tfloat32,Tcomplex32,   Tcomplex32);
205     X(Tuns8,Tcomplex64,   Tfloat64,Tcomplex64,   Tcomplex64);
206     X(Tuns8,Tcomplex80,   Tfloat80,Tcomplex80,   Tcomplex80);
207 
208     /* ======================= */
209 
210     X(Tint16,Tint16,  Tint32,Tint32,  Tint32);
211     X(Tint16,Tuns16,  Tint32,Tint32,  Tint32);
212     X(Tint16,Tint32,  Tint32,Tint32,  Tint32);
213     X(Tint16,Tuns32,  Tuns32,Tuns32,  Tuns32);
214     X(Tint16,Tint64,  Tint64,Tint64,  Tint64);
215     X(Tint16,Tuns64,  Tuns64,Tuns64,  Tuns64);
216     X(Tint16,Tint128,  Tint128,Tint128,  Tint128);
217     X(Tint16,Tuns128,  Tuns128,Tuns128,  Tuns128);
218 
219     X(Tint16,Tfloat32,     Tfloat32,Tfloat32,     Tfloat32);
220     X(Tint16,Tfloat64,     Tfloat64,Tfloat64,     Tfloat64);
221     X(Tint16,Tfloat80,     Tfloat80,Tfloat80,     Tfloat80);
222     X(Tint16,Timaginary32, Tfloat32,Timaginary32, Tfloat32);
223     X(Tint16,Timaginary64, Tfloat64,Timaginary64, Tfloat64);
224     X(Tint16,Timaginary80, Tfloat80,Timaginary80, Tfloat80);
225     X(Tint16,Tcomplex32,   Tfloat32,Tcomplex32,   Tcomplex32);
226     X(Tint16,Tcomplex64,   Tfloat64,Tcomplex64,   Tcomplex64);
227     X(Tint16,Tcomplex80,   Tfloat80,Tcomplex80,   Tcomplex80);
228 
229     /* ======================= */
230 
231     X(Tuns16,Tuns16,  Tint32,Tint32,  Tint32);
232     X(Tuns16,Tint32,  Tint32,Tint32,  Tint32);
233     X(Tuns16,Tuns32,  Tuns32,Tuns32,  Tuns32);
234     X(Tuns16,Tint64,  Tint64,Tint64,  Tint64);
235     X(Tuns16,Tuns64,  Tuns64,Tuns64,  Tuns64);
236     X(Tuns16,Tint128, Tint128,Tint128,  Tint128);
237     X(Tuns16,Tuns128, Tuns128,Tuns128,  Tuns128);
238 
239     X(Tuns16,Tfloat32,     Tfloat32,Tfloat32,     Tfloat32);
240     X(Tuns16,Tfloat64,     Tfloat64,Tfloat64,     Tfloat64);
241     X(Tuns16,Tfloat80,     Tfloat80,Tfloat80,     Tfloat80);
242     X(Tuns16,Timaginary32, Tfloat32,Timaginary32, Tfloat32);
243     X(Tuns16,Timaginary64, Tfloat64,Timaginary64, Tfloat64);
244     X(Tuns16,Timaginary80, Tfloat80,Timaginary80, Tfloat80);
245     X(Tuns16,Tcomplex32,   Tfloat32,Tcomplex32,   Tcomplex32);
246     X(Tuns16,Tcomplex64,   Tfloat64,Tcomplex64,   Tcomplex64);
247     X(Tuns16,Tcomplex80,   Tfloat80,Tcomplex80,   Tcomplex80);
248 
249     /* ======================= */
250 
251     X(Tint32,Tint32,  Tint32,Tint32,  Tint32);
252     X(Tint32,Tuns32,  Tuns32,Tuns32,  Tuns32);
253     X(Tint32,Tint64,  Tint64,Tint64,  Tint64);
254     X(Tint32,Tuns64,  Tuns64,Tuns64,  Tuns64);
255     X(Tint32,Tint128, Tint128,Tint128,  Tint128);
256     X(Tint32,Tuns128, Tuns128,Tuns128,  Tuns128);
257 
258     X(Tint32,Tfloat32,     Tfloat32,Tfloat32,     Tfloat32);
259     X(Tint32,Tfloat64,     Tfloat64,Tfloat64,     Tfloat64);
260     X(Tint32,Tfloat80,     Tfloat80,Tfloat80,     Tfloat80);
261     X(Tint32,Timaginary32, Tfloat32,Timaginary32, Tfloat32);
262     X(Tint32,Timaginary64, Tfloat64,Timaginary64, Tfloat64);
263     X(Tint32,Timaginary80, Tfloat80,Timaginary80, Tfloat80);
264     X(Tint32,Tcomplex32,   Tfloat32,Tcomplex32,   Tcomplex32);
265     X(Tint32,Tcomplex64,   Tfloat64,Tcomplex64,   Tcomplex64);
266     X(Tint32,Tcomplex80,   Tfloat80,Tcomplex80,   Tcomplex80);
267 
268     /* ======================= */
269 
270     X(Tuns32,Tuns32,  Tuns32,Tuns32,  Tuns32);
271     X(Tuns32,Tint64,  Tint64,Tint64,  Tint64);
272     X(Tuns32,Tuns64,  Tuns64,Tuns64,  Tuns64);
273     X(Tuns32,Tint128,  Tint128,Tint128,  Tint128);
274     X(Tuns32,Tuns128,  Tuns128,Tuns128,  Tuns128);
275 
276     X(Tuns32,Tfloat32,     Tfloat32,Tfloat32,     Tfloat32);
277     X(Tuns32,Tfloat64,     Tfloat64,Tfloat64,     Tfloat64);
278     X(Tuns32,Tfloat80,     Tfloat80,Tfloat80,     Tfloat80);
279     X(Tuns32,Timaginary32, Tfloat32,Timaginary32, Tfloat32);
280     X(Tuns32,Timaginary64, Tfloat64,Timaginary64, Tfloat64);
281     X(Tuns32,Timaginary80, Tfloat80,Timaginary80, Tfloat80);
282     X(Tuns32,Tcomplex32,   Tfloat32,Tcomplex32,   Tcomplex32);
283     X(Tuns32,Tcomplex64,   Tfloat64,Tcomplex64,   Tcomplex64);
284     X(Tuns32,Tcomplex80,   Tfloat80,Tcomplex80,   Tcomplex80);
285 
286     /* ======================= */
287 
288     X(Tint64,Tint64,  Tint64,Tint64,  Tint64);
289     X(Tint64,Tuns64,  Tuns64,Tuns64,  Tuns64);
290     X(Tint64,Tint128,  Tint128,Tint128,  Tint128);
291     X(Tint64,Tuns128,  Tuns128,Tuns128,  Tuns128);
292 
293     X(Tint64,Tfloat32,     Tfloat32,Tfloat32,     Tfloat32);
294     X(Tint64,Tfloat64,     Tfloat64,Tfloat64,     Tfloat64);
295     X(Tint64,Tfloat80,     Tfloat80,Tfloat80,     Tfloat80);
296     X(Tint64,Timaginary32, Tfloat32,Timaginary32, Tfloat32);
297     X(Tint64,Timaginary64, Tfloat64,Timaginary64, Tfloat64);
298     X(Tint64,Timaginary80, Tfloat80,Timaginary80, Tfloat80);
299     X(Tint64,Tcomplex32,   Tfloat32,Tcomplex32,   Tcomplex32);
300     X(Tint64,Tcomplex64,   Tfloat64,Tcomplex64,   Tcomplex64);
301     X(Tint64,Tcomplex80,   Tfloat80,Tcomplex80,   Tcomplex80);
302 
303     /* ======================= */
304 
305     X(Tuns64,Tuns64,  Tuns64,Tuns64,  Tuns64);
306     X(Tuns64,Tint128,  Tint128,Tint128,  Tint128);
307     X(Tuns64,Tuns128,  Tuns128,Tuns128,  Tuns128);
308 
309     X(Tuns64,Tfloat32,     Tfloat32,Tfloat32,     Tfloat32);
310     X(Tuns64,Tfloat64,     Tfloat64,Tfloat64,     Tfloat64);
311     X(Tuns64,Tfloat80,     Tfloat80,Tfloat80,     Tfloat80);
312     X(Tuns64,Timaginary32, Tfloat32,Timaginary32, Tfloat32);
313     X(Tuns64,Timaginary64, Tfloat64,Timaginary64, Tfloat64);
314     X(Tuns64,Timaginary80, Tfloat80,Timaginary80, Tfloat80);
315     X(Tuns64,Tcomplex32,   Tfloat32,Tcomplex32,   Tcomplex32);
316     X(Tuns64,Tcomplex64,   Tfloat64,Tcomplex64,   Tcomplex64);
317     X(Tuns64,Tcomplex80,   Tfloat80,Tcomplex80,   Tcomplex80);
318 
319     /* ======================= */
320 
321     X(Tint128,Tint128,  Tint128,Tint128,  Tint128);
322     X(Tint128,Tuns128,  Tuns128,Tuns128,  Tuns128);
323 
324     X(Tint128,Tfloat32,     Tfloat32,Tfloat32,     Tfloat32);
325     X(Tint128,Tfloat64,     Tfloat64,Tfloat64,     Tfloat64);
326     X(Tint128,Tfloat80,     Tfloat80,Tfloat80,     Tfloat80);
327     X(Tint128,Timaginary32, Tfloat32,Timaginary32, Tfloat32);
328     X(Tint128,Timaginary64, Tfloat64,Timaginary64, Tfloat64);
329     X(Tint128,Timaginary80, Tfloat80,Timaginary80, Tfloat80);
330     X(Tint128,Tcomplex32,   Tfloat32,Tcomplex32,   Tcomplex32);
331     X(Tint128,Tcomplex64,   Tfloat64,Tcomplex64,   Tcomplex64);
332     X(Tint128,Tcomplex80,   Tfloat80,Tcomplex80,   Tcomplex80);
333 
334     /* ======================= */
335 
336     X(Tuns128,Tuns128,  Tuns128,Tuns128,  Tuns128);
337 
338     X(Tuns128,Tfloat32,     Tfloat32,Tfloat32,     Tfloat32);
339     X(Tuns128,Tfloat64,     Tfloat64,Tfloat64,     Tfloat64);
340     X(Tuns128,Tfloat80,     Tfloat80,Tfloat80,     Tfloat80);
341     X(Tuns128,Timaginary32, Tfloat32,Timaginary32, Tfloat32);
342     X(Tuns128,Timaginary64, Tfloat64,Timaginary64, Tfloat64);
343     X(Tuns128,Timaginary80, Tfloat80,Timaginary80, Tfloat80);
344     X(Tuns128,Tcomplex32,   Tfloat32,Tcomplex32,   Tcomplex32);
345     X(Tuns128,Tcomplex64,   Tfloat64,Tcomplex64,   Tcomplex64);
346     X(Tuns128,Tcomplex80,   Tfloat80,Tcomplex80,   Tcomplex80);
347 
348     /* ======================= */
349 
350     X(Tfloat32,Tfloat32,  Tfloat32,Tfloat32, Tfloat32);
351     X(Tfloat32,Tfloat64,  Tfloat64,Tfloat64, Tfloat64);
352     X(Tfloat32,Tfloat80,  Tfloat80,Tfloat80, Tfloat80);
353 
354     X(Tfloat32,Timaginary32,  Tfloat32,Timaginary32, Tfloat32);
355     X(Tfloat32,Timaginary64,  Tfloat64,Timaginary64, Tfloat64);
356     X(Tfloat32,Timaginary80,  Tfloat80,Timaginary80, Tfloat80);
357 
358     X(Tfloat32,Tcomplex32,  Tfloat32,Tcomplex32, Tcomplex32);
359     X(Tfloat32,Tcomplex64,  Tfloat64,Tcomplex64, Tcomplex64);
360     X(Tfloat32,Tcomplex80,  Tfloat80,Tcomplex80, Tcomplex80);
361 
362     /* ======================= */
363 
364     X(Tfloat64,Tfloat64,  Tfloat64,Tfloat64, Tfloat64);
365     X(Tfloat64,Tfloat80,  Tfloat80,Tfloat80, Tfloat80);
366 
367     X(Tfloat64,Timaginary32,  Tfloat64,Timaginary64, Tfloat64);
368     X(Tfloat64,Timaginary64,  Tfloat64,Timaginary64, Tfloat64);
369     X(Tfloat64,Timaginary80,  Tfloat80,Timaginary80, Tfloat80);
370 
371     X(Tfloat64,Tcomplex32,  Tfloat64,Tcomplex64, Tcomplex64);
372     X(Tfloat64,Tcomplex64,  Tfloat64,Tcomplex64, Tcomplex64);
373     X(Tfloat64,Tcomplex80,  Tfloat80,Tcomplex80, Tcomplex80);
374 
375     /* ======================= */
376 
377     X(Tfloat80,Tfloat80,  Tfloat80,Tfloat80, Tfloat80);
378 
379     X(Tfloat80,Timaginary32,  Tfloat80,Timaginary80, Tfloat80);
380     X(Tfloat80,Timaginary64,  Tfloat80,Timaginary80, Tfloat80);
381     X(Tfloat80,Timaginary80,  Tfloat80,Timaginary80, Tfloat80);
382 
383     X(Tfloat80,Tcomplex32,  Tfloat80,Tcomplex80, Tcomplex80);
384     X(Tfloat80,Tcomplex64,  Tfloat80,Tcomplex80, Tcomplex80);
385     X(Tfloat80,Tcomplex80,  Tfloat80,Tcomplex80, Tcomplex80);
386 
387     /* ======================= */
388 
389     X(Timaginary32,Timaginary32,  Timaginary32,Timaginary32, Timaginary32);
390     X(Timaginary32,Timaginary64,  Timaginary64,Timaginary64, Timaginary64);
391     X(Timaginary32,Timaginary80,  Timaginary80,Timaginary80, Timaginary80);
392 
393     X(Timaginary32,Tcomplex32,  Timaginary32,Tcomplex32, Tcomplex32);
394     X(Timaginary32,Tcomplex64,  Timaginary64,Tcomplex64, Tcomplex64);
395     X(Timaginary32,Tcomplex80,  Timaginary80,Tcomplex80, Tcomplex80);
396 
397     /* ======================= */
398 
399     X(Timaginary64,Timaginary64,  Timaginary64,Timaginary64, Timaginary64);
400     X(Timaginary64,Timaginary80,  Timaginary80,Timaginary80, Timaginary80);
401 
402     X(Timaginary64,Tcomplex32,  Timaginary64,Tcomplex64, Tcomplex64);
403     X(Timaginary64,Tcomplex64,  Timaginary64,Tcomplex64, Tcomplex64);
404     X(Timaginary64,Tcomplex80,  Timaginary80,Tcomplex80, Tcomplex80);
405 
406     /* ======================= */
407 
408     X(Timaginary80,Timaginary80,  Timaginary80,Timaginary80, Timaginary80);
409 
410     X(Timaginary80,Tcomplex32,  Timaginary80,Tcomplex80, Tcomplex80);
411     X(Timaginary80,Tcomplex64,  Timaginary80,Tcomplex80, Tcomplex80);
412     X(Timaginary80,Tcomplex80,  Timaginary80,Tcomplex80, Tcomplex80);
413 
414     /* ======================= */
415 
416     X(Tcomplex32,Tcomplex32,  Tcomplex32,Tcomplex32, Tcomplex32);
417     X(Tcomplex32,Tcomplex64,  Tcomplex64,Tcomplex64, Tcomplex64);
418     X(Tcomplex32,Tcomplex80,  Tcomplex80,Tcomplex80, Tcomplex80);
419 
420     /* ======================= */
421 
422     X(Tcomplex64,Tcomplex64,  Tcomplex64,Tcomplex64, Tcomplex64);
423     X(Tcomplex64,Tcomplex80,  Tcomplex80,Tcomplex80, Tcomplex80);
424 
425     /* ======================= */
426 
427     X(Tcomplex80,Tcomplex80,  Tcomplex80,Tcomplex80, Tcomplex80);
428 
429     // "No type is implicitly convertible to noreturn, but noreturn is implicitly convertible to every other type"
430     foreach(convertToTy; typeTYs)
431         X(Tnoreturn, convertToTy, convertToTy, convertToTy, convertToTy);
432 
433     return impCnvTab;
434 }