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-2021 by The D Language Foundation, All Rights Reserved 10 * Authors: $(LINK2 http://www.digitalmars.com, Walter Bright) 11 * License: $(LINK2 http://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.mtype; 20 21 immutable ENUMTY[TMAX][TMAX] impcnvResult = impCnvTab.impcnvResultTab; 22 immutable ENUMTY[TMAX][TMAX] impcnvType1 = impCnvTab.impcnvType1Tab; 23 immutable ENUMTY[TMAX][TMAX] impcnvType2 = impCnvTab.impcnvType2Tab; 24 25 private: 26 27 struct ImpCnvTab 28 { 29 ENUMTY[TMAX][TMAX] impcnvResultTab; 30 ENUMTY[TMAX][TMAX] impcnvType1Tab; 31 ENUMTY[TMAX][TMAX] impcnvType2Tab; 32 } 33 34 enum ImpCnvTab impCnvTab = generateImpCnvTab(); 35 36 ImpCnvTab generateImpCnvTab() 37 { 38 ImpCnvTab impCnvTab; 39 40 // Set conversion tables 41 foreach (i; 0 .. cast(size_t)TMAX) 42 { 43 foreach (j; 0 .. cast(size_t)TMAX) 44 { 45 impCnvTab.impcnvResultTab[i][j] = Terror; 46 impCnvTab.impcnvType1Tab[i][j] = Terror; 47 impCnvTab.impcnvType2Tab[i][j] = Terror; 48 } 49 } 50 51 void X(ENUMTY t1, ENUMTY t2, ENUMTY nt1, ENUMTY nt2, ENUMTY rt) 52 { 53 impCnvTab.impcnvResultTab[t1][t2] = rt; 54 impCnvTab.impcnvType1Tab[t1][t2] = nt1; 55 impCnvTab.impcnvType2Tab[t1][t2] = nt2; 56 } 57 58 /* ======================= */ 59 60 X(Tbool,Tbool, Tbool,Tbool, Tbool); 61 X(Tbool,Tint8, Tint32,Tint32, Tint32); 62 X(Tbool,Tuns8, Tint32,Tint32, Tint32); 63 X(Tbool,Tint16, Tint32,Tint32, Tint32); 64 X(Tbool,Tuns16, Tint32,Tint32, Tint32); 65 X(Tbool,Tint32, Tint32,Tint32, Tint32); 66 X(Tbool,Tuns32, Tuns32,Tuns32, Tuns32); 67 X(Tbool,Tint64, Tint64,Tint64, Tint64); 68 X(Tbool,Tuns64, Tuns64,Tuns64, Tuns64); 69 X(Tbool,Tint128, Tint128,Tint128, Tint128); 70 X(Tbool,Tuns128, Tuns128,Tuns128, Tuns128); 71 72 X(Tbool,Tfloat32, Tfloat32,Tfloat32, Tfloat32); 73 X(Tbool,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 74 X(Tbool,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 75 X(Tbool,Timaginary32, Tfloat32,Timaginary32, Tfloat32); 76 X(Tbool,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 77 X(Tbool,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 78 X(Tbool,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32); 79 X(Tbool,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 80 X(Tbool,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 81 82 /* ======================= */ 83 84 X(Tint8,Tint8, Tint32,Tint32, Tint32); 85 X(Tint8,Tuns8, Tint32,Tint32, Tint32); 86 X(Tint8,Tint16, Tint32,Tint32, Tint32); 87 X(Tint8,Tuns16, Tint32,Tint32, Tint32); 88 X(Tint8,Tint32, Tint32,Tint32, Tint32); 89 X(Tint8,Tuns32, Tuns32,Tuns32, Tuns32); 90 X(Tint8,Tint64, Tint64,Tint64, Tint64); 91 X(Tint8,Tuns64, Tuns64,Tuns64, Tuns64); 92 X(Tint8,Tint128, Tint128,Tint128, Tint128); 93 X(Tint8,Tuns128, Tuns128,Tuns128, Tuns128); 94 95 X(Tint8,Tfloat32, Tfloat32,Tfloat32, Tfloat32); 96 X(Tint8,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 97 X(Tint8,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 98 X(Tint8,Timaginary32, Tfloat32,Timaginary32, Tfloat32); 99 X(Tint8,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 100 X(Tint8,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 101 X(Tint8,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32); 102 X(Tint8,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 103 X(Tint8,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 104 105 /* ======================= */ 106 107 X(Tuns8,Tuns8, Tint32,Tint32, Tint32); 108 X(Tuns8,Tint16, Tint32,Tint32, Tint32); 109 X(Tuns8,Tuns16, Tint32,Tint32, Tint32); 110 X(Tuns8,Tint32, Tint32,Tint32, Tint32); 111 X(Tuns8,Tuns32, Tuns32,Tuns32, Tuns32); 112 X(Tuns8,Tint64, Tint64,Tint64, Tint64); 113 X(Tuns8,Tuns64, Tuns64,Tuns64, Tuns64); 114 X(Tuns8,Tint128, Tint128,Tint128, Tint128); 115 X(Tuns8,Tuns128, Tuns128,Tuns128, Tuns128); 116 117 X(Tuns8,Tfloat32, Tfloat32,Tfloat32, Tfloat32); 118 X(Tuns8,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 119 X(Tuns8,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 120 X(Tuns8,Timaginary32, Tfloat32,Timaginary32, Tfloat32); 121 X(Tuns8,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 122 X(Tuns8,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 123 X(Tuns8,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32); 124 X(Tuns8,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 125 X(Tuns8,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 126 127 /* ======================= */ 128 129 X(Tint16,Tint16, Tint32,Tint32, Tint32); 130 X(Tint16,Tuns16, Tint32,Tint32, Tint32); 131 X(Tint16,Tint32, Tint32,Tint32, Tint32); 132 X(Tint16,Tuns32, Tuns32,Tuns32, Tuns32); 133 X(Tint16,Tint64, Tint64,Tint64, Tint64); 134 X(Tint16,Tuns64, Tuns64,Tuns64, Tuns64); 135 X(Tint16,Tint128, Tint128,Tint128, Tint128); 136 X(Tint16,Tuns128, Tuns128,Tuns128, Tuns128); 137 138 X(Tint16,Tfloat32, Tfloat32,Tfloat32, Tfloat32); 139 X(Tint16,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 140 X(Tint16,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 141 X(Tint16,Timaginary32, Tfloat32,Timaginary32, Tfloat32); 142 X(Tint16,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 143 X(Tint16,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 144 X(Tint16,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32); 145 X(Tint16,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 146 X(Tint16,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 147 148 /* ======================= */ 149 150 X(Tuns16,Tuns16, Tint32,Tint32, Tint32); 151 X(Tuns16,Tint32, Tint32,Tint32, Tint32); 152 X(Tuns16,Tuns32, Tuns32,Tuns32, Tuns32); 153 X(Tuns16,Tint64, Tint64,Tint64, Tint64); 154 X(Tuns16,Tuns64, Tuns64,Tuns64, Tuns64); 155 X(Tuns16,Tint128, Tint128,Tint128, Tint128); 156 X(Tuns16,Tuns128, Tuns128,Tuns128, Tuns128); 157 158 X(Tuns16,Tfloat32, Tfloat32,Tfloat32, Tfloat32); 159 X(Tuns16,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 160 X(Tuns16,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 161 X(Tuns16,Timaginary32, Tfloat32,Timaginary32, Tfloat32); 162 X(Tuns16,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 163 X(Tuns16,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 164 X(Tuns16,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32); 165 X(Tuns16,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 166 X(Tuns16,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 167 168 /* ======================= */ 169 170 X(Tint32,Tint32, Tint32,Tint32, Tint32); 171 X(Tint32,Tuns32, Tuns32,Tuns32, Tuns32); 172 X(Tint32,Tint64, Tint64,Tint64, Tint64); 173 X(Tint32,Tuns64, Tuns64,Tuns64, Tuns64); 174 X(Tint32,Tint128, Tint128,Tint128, Tint128); 175 X(Tint32,Tuns128, Tuns128,Tuns128, Tuns128); 176 177 X(Tint32,Tfloat32, Tfloat32,Tfloat32, Tfloat32); 178 X(Tint32,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 179 X(Tint32,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 180 X(Tint32,Timaginary32, Tfloat32,Timaginary32, Tfloat32); 181 X(Tint32,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 182 X(Tint32,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 183 X(Tint32,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32); 184 X(Tint32,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 185 X(Tint32,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 186 187 /* ======================= */ 188 189 X(Tuns32,Tuns32, Tuns32,Tuns32, Tuns32); 190 X(Tuns32,Tint64, Tint64,Tint64, Tint64); 191 X(Tuns32,Tuns64, Tuns64,Tuns64, Tuns64); 192 X(Tuns32,Tint128, Tint128,Tint128, Tint128); 193 X(Tuns32,Tuns128, Tuns128,Tuns128, Tuns128); 194 195 X(Tuns32,Tfloat32, Tfloat32,Tfloat32, Tfloat32); 196 X(Tuns32,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 197 X(Tuns32,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 198 X(Tuns32,Timaginary32, Tfloat32,Timaginary32, Tfloat32); 199 X(Tuns32,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 200 X(Tuns32,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 201 X(Tuns32,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32); 202 X(Tuns32,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 203 X(Tuns32,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 204 205 /* ======================= */ 206 207 X(Tint64,Tint64, Tint64,Tint64, Tint64); 208 X(Tint64,Tuns64, Tuns64,Tuns64, Tuns64); 209 X(Tint64,Tint128, Tint128,Tint128, Tint128); 210 X(Tint64,Tuns128, Tuns128,Tuns128, Tuns128); 211 212 X(Tint64,Tfloat32, Tfloat32,Tfloat32, Tfloat32); 213 X(Tint64,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 214 X(Tint64,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 215 X(Tint64,Timaginary32, Tfloat32,Timaginary32, Tfloat32); 216 X(Tint64,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 217 X(Tint64,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 218 X(Tint64,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32); 219 X(Tint64,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 220 X(Tint64,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 221 222 /* ======================= */ 223 224 X(Tuns64,Tuns64, Tuns64,Tuns64, Tuns64); 225 X(Tuns64,Tint128, Tint128,Tint128, Tint128); 226 X(Tuns64,Tuns128, Tuns128,Tuns128, Tuns128); 227 228 X(Tuns64,Tfloat32, Tfloat32,Tfloat32, Tfloat32); 229 X(Tuns64,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 230 X(Tuns64,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 231 X(Tuns64,Timaginary32, Tfloat32,Timaginary32, Tfloat32); 232 X(Tuns64,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 233 X(Tuns64,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 234 X(Tuns64,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32); 235 X(Tuns64,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 236 X(Tuns64,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 237 238 /* ======================= */ 239 240 X(Tint128,Tint128, Tint128,Tint128, Tint128); 241 X(Tint128,Tuns128, Tuns128,Tuns128, Tuns128); 242 243 X(Tint128,Tfloat32, Tfloat32,Tfloat32, Tfloat32); 244 X(Tint128,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 245 X(Tint128,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 246 X(Tint128,Timaginary32, Tfloat32,Timaginary32, Tfloat32); 247 X(Tint128,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 248 X(Tint128,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 249 X(Tint128,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32); 250 X(Tint128,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 251 X(Tint128,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 252 253 /* ======================= */ 254 255 X(Tuns128,Tuns128, Tuns128,Tuns128, Tuns128); 256 257 X(Tuns128,Tfloat32, Tfloat32,Tfloat32, Tfloat32); 258 X(Tuns128,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 259 X(Tuns128,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 260 X(Tuns128,Timaginary32, Tfloat32,Timaginary32, Tfloat32); 261 X(Tuns128,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 262 X(Tuns128,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 263 X(Tuns128,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32); 264 X(Tuns128,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 265 X(Tuns128,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 266 267 /* ======================= */ 268 269 X(Tfloat32,Tfloat32, Tfloat32,Tfloat32, Tfloat32); 270 X(Tfloat32,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 271 X(Tfloat32,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 272 273 X(Tfloat32,Timaginary32, Tfloat32,Timaginary32, Tfloat32); 274 X(Tfloat32,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 275 X(Tfloat32,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 276 277 X(Tfloat32,Tcomplex32, Tfloat32,Tcomplex32, Tcomplex32); 278 X(Tfloat32,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 279 X(Tfloat32,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 280 281 /* ======================= */ 282 283 X(Tfloat64,Tfloat64, Tfloat64,Tfloat64, Tfloat64); 284 X(Tfloat64,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 285 286 X(Tfloat64,Timaginary32, Tfloat64,Timaginary64, Tfloat64); 287 X(Tfloat64,Timaginary64, Tfloat64,Timaginary64, Tfloat64); 288 X(Tfloat64,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 289 290 X(Tfloat64,Tcomplex32, Tfloat64,Tcomplex64, Tcomplex64); 291 X(Tfloat64,Tcomplex64, Tfloat64,Tcomplex64, Tcomplex64); 292 X(Tfloat64,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 293 294 /* ======================= */ 295 296 X(Tfloat80,Tfloat80, Tfloat80,Tfloat80, Tfloat80); 297 298 X(Tfloat80,Timaginary32, Tfloat80,Timaginary80, Tfloat80); 299 X(Tfloat80,Timaginary64, Tfloat80,Timaginary80, Tfloat80); 300 X(Tfloat80,Timaginary80, Tfloat80,Timaginary80, Tfloat80); 301 302 X(Tfloat80,Tcomplex32, Tfloat80,Tcomplex80, Tcomplex80); 303 X(Tfloat80,Tcomplex64, Tfloat80,Tcomplex80, Tcomplex80); 304 X(Tfloat80,Tcomplex80, Tfloat80,Tcomplex80, Tcomplex80); 305 306 /* ======================= */ 307 308 X(Timaginary32,Timaginary32, Timaginary32,Timaginary32, Timaginary32); 309 X(Timaginary32,Timaginary64, Timaginary64,Timaginary64, Timaginary64); 310 X(Timaginary32,Timaginary80, Timaginary80,Timaginary80, Timaginary80); 311 312 X(Timaginary32,Tcomplex32, Timaginary32,Tcomplex32, Tcomplex32); 313 X(Timaginary32,Tcomplex64, Timaginary64,Tcomplex64, Tcomplex64); 314 X(Timaginary32,Tcomplex80, Timaginary80,Tcomplex80, Tcomplex80); 315 316 /* ======================= */ 317 318 X(Timaginary64,Timaginary64, Timaginary64,Timaginary64, Timaginary64); 319 X(Timaginary64,Timaginary80, Timaginary80,Timaginary80, Timaginary80); 320 321 X(Timaginary64,Tcomplex32, Timaginary64,Tcomplex64, Tcomplex64); 322 X(Timaginary64,Tcomplex64, Timaginary64,Tcomplex64, Tcomplex64); 323 X(Timaginary64,Tcomplex80, Timaginary80,Tcomplex80, Tcomplex80); 324 325 /* ======================= */ 326 327 X(Timaginary80,Timaginary80, Timaginary80,Timaginary80, Timaginary80); 328 329 X(Timaginary80,Tcomplex32, Timaginary80,Tcomplex80, Tcomplex80); 330 X(Timaginary80,Tcomplex64, Timaginary80,Tcomplex80, Tcomplex80); 331 X(Timaginary80,Tcomplex80, Timaginary80,Tcomplex80, Tcomplex80); 332 333 /* ======================= */ 334 335 X(Tcomplex32,Tcomplex32, Tcomplex32,Tcomplex32, Tcomplex32); 336 X(Tcomplex32,Tcomplex64, Tcomplex64,Tcomplex64, Tcomplex64); 337 X(Tcomplex32,Tcomplex80, Tcomplex80,Tcomplex80, Tcomplex80); 338 339 /* ======================= */ 340 341 X(Tcomplex64,Tcomplex64, Tcomplex64,Tcomplex64, Tcomplex64); 342 X(Tcomplex64,Tcomplex80, Tcomplex80,Tcomplex80, Tcomplex80); 343 344 /* ======================= */ 345 346 X(Tcomplex80,Tcomplex80, Tcomplex80,Tcomplex80, Tcomplex80); 347 348 foreach (i; 0 .. cast(size_t)TMAX) 349 { 350 foreach (j; 0 .. cast(size_t)TMAX) 351 { 352 if (impCnvTab.impcnvResultTab[i][j] == Terror) 353 { 354 impCnvTab.impcnvResultTab[i][j] = impCnvTab.impcnvResultTab[j][i]; 355 impCnvTab.impcnvType1Tab[i][j] = impCnvTab.impcnvType2Tab[j][i]; 356 impCnvTab.impcnvType2Tab[i][j] = impCnvTab.impcnvType1Tab[j][i]; 357 } 358 } 359 } 360 361 return impCnvTab; 362 }