source: src/ResolvExpr/CommonType.cc@ f5212ca

Last change on this file since f5212ca was 06601401, checked in by JiadaL <j82liang@…>, 19 months ago

Change the common type interpretation of EnumPos

  • Property mode set to 100644
File size: 51.8 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// CommonType.cc --
8//
9// Author : Richard C. Bilson
10// Created On : Sun May 17 06:59:27 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Thu Feb 14 17:10:10 2019
13// Update Count : 24
14//
15
16#include "CommonType.hpp"
17
18#include <cassert> // for strict_dynamic_cast
19#include <map> // for _Rb_tree_const_iterator
20#include <utility> // for pair
21
22#include "AST/Decl.hpp"
23#include "AST/Pass.hpp"
24#include "AST/Type.hpp"
25#include "Unify.h" // for unifyExact, WidenMode
26#include "typeops.h" // for isFtype
27#include "Tuples/Tuples.h"
28
29// #define DEBUG
30#ifdef DEBUG
31#define PRINT(x) x
32#else
33#define PRINT(x)
34#endif
35
36namespace ResolvExpr {
37
38 // GENERATED START, DO NOT EDIT
39 // GENERATED BY BasicTypes-gen.cc
40 #define BT ast::BasicType::
41 static const BT Kind commonTypes[BT NUMBER_OF_BASIC_TYPES][BT NUMBER_OF_BASIC_TYPES] = { // nearest common ancestor
42 /* B C SC UC SI SUI
43 I UI LI LUI LLI LLUI
44 IB UIB _FH _FH _F _FC
45 F FC _FX _FXC FD _FDC
46 D DC F80X _FDXC F80 _FB
47 _FLDC FB LD LDC _FBX _FLDXC
48 */
49 {
50 /* B */ BT Bool, BT Char, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt,
51 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt,
52 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
53 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
54 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
55 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
56 },
57 {
58 /* C */ BT Char, BT Char, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt,
59 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt,
60 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
61 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
62 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
63 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
64 },
65 {
66 /* SC */ BT SignedChar, BT SignedChar, BT SignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt,
67 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt,
68 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
69 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
70 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
71 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
72 },
73 {
74 /* UC */ BT UnsignedChar, BT UnsignedChar, BT UnsignedChar, BT UnsignedChar, BT ShortSignedInt, BT ShortUnsignedInt,
75 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt,
76 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
77 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
78 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
79 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
80 },
81 {
82 /* SI */ BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortSignedInt, BT ShortUnsignedInt,
83 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt,
84 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
85 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
86 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
87 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
88 },
89 {
90 /* SUI */ BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt, BT ShortUnsignedInt,
91 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt,
92 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
93 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
94 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
95 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
96 },
97 {
98 /* I */ BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt, BT SignedInt,
99 BT SignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt,
100 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
101 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
102 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
103 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
104 },
105 {
106 /* UI */ BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt, BT UnsignedInt,
107 BT UnsignedInt, BT UnsignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt,
108 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
109 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
110 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
111 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
112 },
113 {
114 /* LI */ BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongSignedInt,
115 BT LongSignedInt, BT LongSignedInt, BT LongSignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt,
116 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
117 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
118 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
119 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
120 },
121 {
122 /* LUI */ BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt,
123 BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongUnsignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt,
124 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
125 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
126 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
127 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
128 },
129 {
130 /* LLI */ BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt,
131 BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongSignedInt, BT LongLongUnsignedInt,
132 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
133 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
134 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
135 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
136 },
137 {
138 /* LLUI */ BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt,
139 BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt, BT LongLongUnsignedInt,
140 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
141 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
142 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
143 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
144 },
145 {
146 /* IB */ BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128,
147 BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128, BT SignedInt128,
148 BT SignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
149 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
150 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
151 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
152 },
153 {
154 /* UIB */ BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128,
155 BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128, BT UnsignedInt128,
156 BT UnsignedInt128, BT UnsignedInt128, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
157 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
158 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
159 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
160 },
161 {
162 /* _FH */ BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16,
163 BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16,
164 BT uFloat16, BT uFloat16, BT uFloat16, BT uFloat16Complex, BT uFloat32, BT uFloat32Complex,
165 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
166 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
167 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
168 },
169 {
170 /* _FH */ BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex,
171 BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex,
172 BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat16Complex, BT uFloat32Complex, BT uFloat32Complex,
173 BT FloatComplex, BT FloatComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat64Complex, BT uFloat64Complex,
174 BT DoubleComplex, BT DoubleComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat128Complex,
175 BT uFloat128Complex, BT uFloat128Complex, BT LongDoubleComplex, BT LongDoubleComplex, BT uFloat128xComplex, BT uFloat128xComplex,
176 },
177 {
178 /* _F */ BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32,
179 BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32,
180 BT uFloat32, BT uFloat32, BT uFloat32, BT uFloat32Complex, BT uFloat32, BT uFloat32Complex,
181 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
182 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
183 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
184 },
185 {
186 /* _FC */ BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex,
187 BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex,
188 BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex, BT uFloat32Complex,
189 BT FloatComplex, BT FloatComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat64Complex, BT uFloat64Complex,
190 BT DoubleComplex, BT DoubleComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat128Complex,
191 BT uFloat128Complex, BT uFloat128Complex, BT LongDoubleComplex, BT LongDoubleComplex, BT uFloat128xComplex, BT uFloat128xComplex,
192 },
193 {
194 /* F */ BT Float, BT Float, BT Float, BT Float, BT Float, BT Float,
195 BT Float, BT Float, BT Float, BT Float, BT Float, BT Float,
196 BT Float, BT Float, BT Float, BT FloatComplex, BT Float, BT FloatComplex,
197 BT Float, BT FloatComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
198 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
199 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
200 },
201 {
202 /* FC */ BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex,
203 BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex,
204 BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex, BT FloatComplex,
205 BT FloatComplex, BT FloatComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat64Complex, BT uFloat64Complex,
206 BT DoubleComplex, BT DoubleComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat128Complex,
207 BT uFloat128Complex, BT uFloat128Complex, BT LongDoubleComplex, BT LongDoubleComplex, BT uFloat128xComplex, BT uFloat128xComplex,
208 },
209 {
210 /* _FX */ BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x,
211 BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32x,
212 BT uFloat32x, BT uFloat32x, BT uFloat32x, BT uFloat32xComplex, BT uFloat32x, BT uFloat32xComplex,
213 BT uFloat32x, BT uFloat32xComplex, BT uFloat32x, BT uFloat32xComplex, BT uFloat64, BT uFloat64Complex,
214 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
215 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
216 },
217 {
218 /* _FXC */ BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex,
219 BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex,
220 BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex,
221 BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat32xComplex, BT uFloat64Complex, BT uFloat64Complex,
222 BT DoubleComplex, BT DoubleComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat128Complex,
223 BT uFloat128Complex, BT uFloat128Complex, BT LongDoubleComplex, BT LongDoubleComplex, BT uFloat128xComplex, BT uFloat128xComplex,
224 },
225 {
226 /* FD */ BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64,
227 BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64,
228 BT uFloat64, BT uFloat64, BT uFloat64, BT uFloat64Complex, BT uFloat64, BT uFloat64Complex,
229 BT uFloat64, BT uFloat64Complex, BT uFloat64, BT uFloat64Complex, BT uFloat64, BT uFloat64Complex,
230 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
231 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
232 },
233 {
234 /* _FDC */ BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex,
235 BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex,
236 BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex,
237 BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex, BT uFloat64Complex,
238 BT DoubleComplex, BT DoubleComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat128Complex,
239 BT uFloat128Complex, BT uFloat128Complex, BT LongDoubleComplex, BT LongDoubleComplex, BT uFloat128xComplex, BT uFloat128xComplex,
240 },
241 {
242 /* D */ BT Double, BT Double, BT Double, BT Double, BT Double, BT Double,
243 BT Double, BT Double, BT Double, BT Double, BT Double, BT Double,
244 BT Double, BT Double, BT Double, BT DoubleComplex, BT Double, BT DoubleComplex,
245 BT Double, BT DoubleComplex, BT Double, BT DoubleComplex, BT Double, BT DoubleComplex,
246 BT Double, BT DoubleComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
247 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
248 },
249 {
250 /* DC */ BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex,
251 BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex,
252 BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex,
253 BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex, BT DoubleComplex,
254 BT DoubleComplex, BT DoubleComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat128Complex,
255 BT uFloat128Complex, BT uFloat128Complex, BT LongDoubleComplex, BT LongDoubleComplex, BT uFloat128xComplex, BT uFloat128xComplex,
256 },
257 {
258 /* F80X */ BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x,
259 BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64x,
260 BT uFloat64x, BT uFloat64x, BT uFloat64x, BT uFloat64xComplex, BT uFloat64x, BT uFloat64xComplex,
261 BT uFloat64x, BT uFloat64xComplex, BT uFloat64x, BT uFloat64xComplex, BT uFloat64x, BT uFloat64xComplex,
262 BT uFloat64x, BT uFloat64xComplex, BT uFloat64x, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
263 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
264 },
265 {
266 /* _FDXC */ BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex,
267 BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex,
268 BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex,
269 BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex,
270 BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat64xComplex, BT uFloat128Complex,
271 BT uFloat128Complex, BT uFloat128Complex, BT LongDoubleComplex, BT LongDoubleComplex, BT uFloat128xComplex, BT uFloat128xComplex,
272 },
273 {
274 /* F80 */ BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80,
275 BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uuFloat80,
276 BT uuFloat80, BT uuFloat80, BT uuFloat80, BT uFloat64xComplex, BT uuFloat80, BT uFloat64xComplex,
277 BT uuFloat80, BT uFloat64xComplex, BT uuFloat80, BT uFloat64xComplex, BT uuFloat80, BT uFloat64xComplex,
278 BT uuFloat80, BT uFloat64xComplex, BT uuFloat80, BT uFloat64xComplex, BT uuFloat80, BT uFloat128,
279 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
280 },
281 {
282 /* _FB */ BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128,
283 BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128,
284 BT uFloat128, BT uFloat128, BT uFloat128, BT uFloat128Complex, BT uFloat128, BT uFloat128Complex,
285 BT uFloat128, BT uFloat128Complex, BT uFloat128, BT uFloat128Complex, BT uFloat128, BT uFloat128Complex,
286 BT uFloat128, BT uFloat128Complex, BT uFloat128, BT uFloat128Complex, BT uFloat128, BT uFloat128,
287 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
288 },
289 {
290 /* _FLDC */ BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex,
291 BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex,
292 BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex,
293 BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex,
294 BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex, BT uFloat128Complex,
295 BT uFloat128Complex, BT uFloat128Complex, BT LongDoubleComplex, BT LongDoubleComplex, BT uFloat128xComplex, BT uFloat128xComplex,
296 },
297 {
298 /* FB */ BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128,
299 BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uuFloat128,
300 BT uuFloat128, BT uuFloat128, BT uuFloat128, BT uFloat128Complex, BT uuFloat128, BT uFloat128Complex,
301 BT uuFloat128, BT uFloat128Complex, BT uuFloat128, BT uFloat128Complex, BT uuFloat128, BT uFloat128Complex,
302 BT uuFloat128, BT uFloat128Complex, BT uuFloat128, BT uFloat128Complex, BT uuFloat128, BT uuFloat128,
303 BT uFloat128Complex, BT uuFloat128, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
304 },
305 {
306 /* LD */ BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble,
307 BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble, BT LongDouble,
308 BT LongDouble, BT LongDouble, BT LongDouble, BT LongDoubleComplex, BT LongDouble, BT LongDoubleComplex,
309 BT LongDouble, BT LongDoubleComplex, BT LongDouble, BT LongDoubleComplex, BT LongDouble, BT LongDoubleComplex,
310 BT LongDouble, BT LongDoubleComplex, BT LongDouble, BT LongDoubleComplex, BT LongDouble, BT LongDouble,
311 BT LongDoubleComplex, BT LongDouble, BT LongDouble, BT LongDoubleComplex, BT uFloat128x, BT uFloat128xComplex,
312 },
313 {
314 /* LDC */ BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex,
315 BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex,
316 BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex,
317 BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex,
318 BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex,
319 BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT LongDoubleComplex, BT uFloat128xComplex, BT uFloat128xComplex,
320 },
321 {
322 /* _FBX */ BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x,
323 BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128x,
324 BT uFloat128x, BT uFloat128x, BT uFloat128x, BT uFloat128xComplex, BT uFloat128x, BT uFloat128xComplex,
325 BT uFloat128x, BT uFloat128xComplex, BT uFloat128x, BT uFloat128xComplex, BT uFloat128x, BT uFloat128xComplex,
326 BT uFloat128x, BT uFloat128xComplex, BT uFloat128x, BT uFloat128xComplex, BT uFloat128x, BT uFloat128x,
327 BT uFloat128xComplex, BT uFloat128x, BT uFloat128x, BT uFloat128xComplex, BT uFloat128x, BT uFloat128xComplex,
328 },
329 {
330 /* _FLDXC */ BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex,
331 BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex,
332 BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex,
333 BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex,
334 BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex,
335 BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex, BT uFloat128xComplex,
336 },
337 }; // commonTypes
338 #undef BT
339 // GENERATED END
340 static_assert(
341 sizeof(commonTypes)/sizeof(commonTypes[0][0]) == ast::BasicType::NUMBER_OF_BASIC_TYPES * ast::BasicType::NUMBER_OF_BASIC_TYPES,
342 "Each basic type kind should have a corresponding row in the combined type matrix"
343 );
344
345class CommonType final : public ast::WithShortCircuiting {
346 const ast::Type * type2;
347 WidenMode widen;
348 ast::TypeEnvironment & tenv;
349 const ast::OpenVarSet & open;
350 ast::AssertionSet & need;
351 ast::AssertionSet & have;
352public:
353 static size_t traceId;
354 ast::ptr< ast::Type > result;
355
356 CommonType(
357 const ast::Type * t2, WidenMode w,
358 ast::TypeEnvironment & env, const ast::OpenVarSet & o,
359 ast::AssertionSet & need, ast::AssertionSet & have )
360 : type2( t2 ), widen( w ), tenv( env ), open( o ), need (need), have (have) ,result() {}
361
362 void previsit( const ast::Node * ) { visit_children = false; }
363
364 void postvisit( const ast::VoidType * ) {}
365
366 void postvisit( const ast::BasicType * basic ) {
367 if ( auto basic2 = dynamic_cast< const ast::BasicType * >( type2 ) ) {
368 ast::BasicType::Kind kind;
369 if (basic->kind != basic2->kind && !widen.first && !widen.second) return;
370 else if (!widen.first) kind = basic->kind; // widen.second
371 else if (!widen.second) kind = basic2->kind;
372 else kind = commonTypes[ basic->kind ][ basic2->kind ];
373 // xxx - what does qualifiers even do here??
374 if ( (basic->qualifiers >= basic2->qualifiers || widen.first)
375 && (basic->qualifiers <= basic2->qualifiers || widen.second) ) {
376 result = new ast::BasicType{ kind, basic->qualifiers | basic2->qualifiers };
377 }
378 } else if (
379 dynamic_cast< const ast::ZeroType * >( type2 )
380 || dynamic_cast< const ast::OneType * >( type2 )
381 ) {
382 if (widen.second) {
383 result = new ast::BasicType{ basic->kind, basic->qualifiers | type2->qualifiers };
384 }
385 } else if ( const ast::EnumInstType * enumInst = dynamic_cast< const ast::EnumInstType * >( type2 ) ) {
386 const ast::EnumDecl* enumDecl = enumInst->base;
387 if ( enumDecl->base ) {
388 result = enumDecl->base.get();
389 } else {
390 ast::BasicType::Kind kind = commonTypes[ basic->kind ][ ast::BasicType::SignedInt ];
391 if (
392 ( ( kind == basic->kind && basic->qualifiers >= type2->qualifiers )
393 || widen.first )
394 && ( ( kind != basic->kind && basic->qualifiers <= type2->qualifiers )
395 || widen.second )
396 ) {
397 result = new ast::BasicType{ kind, basic->qualifiers | type2->qualifiers };
398 }
399 }
400 } else if ( dynamic_cast< const ast::EnumPosType * >( type2 ) ) {
401 ast::BasicType::Kind kind = commonTypes[ basic->kind ][ ast::BasicType::SignedInt ];
402 if (
403 ( ( kind == basic->kind && basic->qualifiers >= type2->qualifiers )
404 || widen.first )
405 && ( ( kind != basic->kind && basic->qualifiers <= type2->qualifiers )
406 || widen.second )
407 ) {
408 result = new ast::BasicType{ kind, basic->qualifiers | type2->qualifiers };
409 }
410 }
411 }
412
413private:
414 template< typename Pointer >
415 void getCommonWithVoidPointer( const Pointer * voidPtr, const Pointer * oPtr ) {
416 const ast::Type * base = oPtr->base;
417 if ( auto var = dynamic_cast< const ast::TypeInstType * >( base ) ) {
418 auto entry = open.find( *var );
419 if ( entry != open.end() ) {
420 ast::AssertionSet need, have;
421 if ( ! tenv.bindVar(
422 var, voidPtr->base, entry->second, need, have, open, widen )
423 ) return;
424 }
425 }
426 result = voidPtr;
427 add_qualifiers( result, oPtr->qualifiers );
428 }
429
430 // For a typed enum, we want to unify type1 with the base type of the enum
431 bool tryResolveWithTypedEnum( const ast::Type * type1 ) {
432 if (auto enumInst = dynamic_cast<const ast::EnumInstType *> (type2) ) {
433 ast::OpenVarSet newOpen{ open };
434 if (enumInst->base->base
435 && unifyExact(type1, enumInst->base->base, tenv, need, have, newOpen, widen)) {
436 result = type1;
437 return true;
438 }
439 }
440 return false;
441 }
442
443public:
444 void postvisit( const ast::PointerType * pointer ) {
445 if ( auto pointer2 = dynamic_cast< const ast::PointerType * >( type2 ) ) {
446 if (
447 widen.first
448 && pointer2->base.as< ast::VoidType >()
449 && ! ast::isFtype( pointer->base )
450 ) {
451 getCommonWithVoidPointer( pointer2, pointer );
452 } else if (
453 widen.second
454 && pointer->base.as< ast::VoidType >()
455 && ! ast::isFtype( pointer2->base )
456 ) {
457 getCommonWithVoidPointer( pointer, pointer2 );
458 } else if (
459 ( pointer->base->qualifiers >= pointer2->base->qualifiers || widen.first )
460 && ( pointer->base->qualifiers <= pointer2->base->qualifiers || widen.second )
461 ) {
462 ast::CV::Qualifiers q1 = pointer->base->qualifiers;
463 ast::CV::Qualifiers q2 = pointer2->base->qualifiers;
464
465 // force t{1,2} to be cloned if their qualifiers must be stripped, so that
466 // pointer{,2}->base are unchanged
467 ast::ptr< ast::Type > t1{ pointer->base }, t2{ pointer2->base };
468 reset_qualifiers( t1 );
469 reset_qualifiers( t2 );
470
471 ast::OpenVarSet newOpen{ open };
472 if ( unifyExact( t1, t2, tenv, have, need, newOpen, noWiden() ) ) {
473 result = pointer;
474 if ( q1.val != q2.val ) {
475 // reset result->base->qualifiers to be union of two base qualifiers
476 strict_dynamic_cast< ast::PointerType * >(
477 result.get_and_mutate()
478 )->base.get_and_mutate()->qualifiers = q1 | q2;
479 }
480 } else if ( isFtype (t1) && isFtype (t2) ) {
481 auto f1 = t1.as<ast::FunctionType>();
482 if (!f1) return;
483 auto f2 = t2.strict_as<ast::FunctionType>();
484
485 assertf(f1->returns.size() <= 1, "Function return should not be a list");
486 assertf(f2->returns.size() <= 1, "Function return should not be a list");
487
488 if (
489 ( f1->params.size() != f2->params.size() || f1->returns.size() != f2->returns.size() )
490 && ! f1->isTtype()
491 && ! f2->isTtype()
492 ) return;
493
494 auto params1 = flattenList( f1->params, tenv );
495 auto params2 = flattenList( f2->params, tenv );
496
497 auto crnt1 = params1.begin();
498 auto crnt2 = params2.begin();
499 auto end1 = params1.end();
500 auto end2 = params2.end();
501
502 while (crnt1 != end1 && crnt2 != end2 ) {
503 const ast::Type * arg1 = *crnt1;
504 const ast::Type * arg2 = *crnt2;
505
506 bool isTuple1 = Tuples::isTtype( t1 );
507 bool isTuple2 = Tuples::isTtype( t2 );
508
509 // assumes here that ttype *must* be last parameter
510 if ( isTuple1 && ! isTuple2 ) {
511 // combine remainder of list2, then unify
512 if (unifyExact(
513 arg1, tupleFromTypes( crnt2, end2 ), tenv, need, have, open,
514 noWiden() )) {
515 break;
516 } else return;
517 } else if ( ! isTuple1 && isTuple2 ) {
518 // combine remainder of list1, then unify
519 if (unifyExact(
520 tupleFromTypes( crnt1, end1 ), arg2, tenv, need, have, open,
521 noWiden() )) {
522 break;
523 } else return;
524 }
525
526 // allow qualifiers of pointer and reference base to become more specific
527 if (auto ref1 = dynamic_cast<const ast::ReferenceType *> (arg1)) {
528 if (auto ref2 = dynamic_cast<const ast::ReferenceType *> (arg2)) {
529 ast::ptr<ast::Type> base1 = ref1->base;
530 ast::ptr<ast::Type> base2 = ref2->base;
531
532 // xxx - assume LHS is always the target type
533
534 if ( ! ((widen.second && ref2->qualifiers.is_mutex)
535 || (ref1->qualifiers.is_mutex == ref2->qualifiers.is_mutex ))) return;
536
537 if ( (widen.second && base1->qualifiers <= base2->qualifiers ) || (base2->qualifiers == base1->qualifiers) ) {
538
539 reset_qualifiers(base1);
540 reset_qualifiers(base2);
541
542 if ( !unifyExact(
543 base1, base2, tenv, need, have, open, noWiden() )
544 ) return;
545 }
546 } else return;
547 } else if (auto ptr1 = dynamic_cast<const ast::PointerType *> (arg1)) {
548 if (auto ptr2 = dynamic_cast<const ast::PointerType *> (arg2)) {
549 ast::ptr<ast::Type> base1 = ptr1->base;
550 ast::ptr<ast::Type> base2 = ptr2->base;
551
552 // xxx - assume LHS is always the target type
553 // a function accepting const can always be called by non-const arg
554
555 if ( (widen.second && base1->qualifiers <= base2->qualifiers ) || (base2->qualifiers == base1->qualifiers) ) {
556
557 reset_qualifiers(base1);
558 reset_qualifiers(base2);
559
560 if ( ! unifyExact(
561 base1, base2, tenv, need, have, open, noWiden() )
562 ) return;
563 }
564 } else return;
565 } else if (! unifyExact(
566 arg1, arg2, tenv, need, have, open, noWiden() )) {
567 return;
568 }
569 ++crnt1; ++crnt2;
570 }
571 if ( crnt1 != end1 ) {
572 // try unifying empty tuple with ttype
573 const ast::Type * t1 = *crnt1;
574 if (! Tuples::isTtype( t1 ) ) return;
575 if (! unifyExact(
576 t1, tupleFromTypes( crnt2, end2 ), tenv, need, have, open,
577 noWiden() )) return;
578 } else if ( crnt2 != end2 ) {
579 // try unifying empty tuple with ttype
580 const ast::Type * t2 = *crnt2;
581 if ( !Tuples::isTtype( t2 ) ) return;
582 if ( !unifyExact(
583 tupleFromTypes( crnt1, end1 ), t2, tenv, need, have, open,
584 noWiden() )) return;
585 }
586 if ((f1->returns.size() == 0 && f2->returns.size() == 0)
587 || (f1->returns.size() == 1 && f2->returns.size() == 1 && unifyExact(f1->returns[0], f2->returns[0], tenv, need, have, open, noWiden()))) {
588 result = pointer;
589
590 for (auto & assn : f1->assertions) {
591 auto i = need.find(assn);
592 if (i != need.end()) i->second.isUsed = true;
593 auto j = have.find(assn);
594 if (j != have.end()) j->second.isUsed = true;
595 }
596
597 for (auto & assn : f2->assertions) {
598 auto i = need.find(assn);
599 if (i != need.end()) i->second.isUsed = true;
600 auto j = have.find(assn);
601 if (j != have.end()) j->second.isUsed = true;
602 }
603 }
604 } // if ftype
605 }
606 } else if ( widen.second && dynamic_cast< const ast::ZeroType * >( type2 ) ) {
607 result = pointer;
608 add_qualifiers( result, type2->qualifiers );
609 } else {
610 tryResolveWithTypedEnum( pointer );
611 }
612 }
613
614 void postvisit( const ast::ArrayType * arr ) {
615 // xxx - does it make sense?
616 tryResolveWithTypedEnum( arr );
617 }
618
619 void postvisit( const ast::ReferenceType * ref ) {
620 if ( auto ref2 = dynamic_cast< const ast::ReferenceType * >( type2 ) ) {
621 if (
622 widen.first && ref2->base.as< ast::VoidType >() && ! ast::isFtype( ref->base )
623 ) {
624 getCommonWithVoidPointer( ref2, ref );
625 } else if (
626 widen.second && ref->base.as< ast::VoidType>() && ! ast::isFtype( ref2->base )
627 ) {
628 getCommonWithVoidPointer( ref, ref2 );
629 } else if (
630 ( ref->base->qualifiers >= ref2->base->qualifiers || widen.first )
631 && ( ref->base->qualifiers <= ref2->base->qualifiers || widen.second )
632 ) {
633 ast::CV::Qualifiers q1 = ref->base->qualifiers, q2 = ref2->base->qualifiers;
634
635 // force t{1,2} to be cloned if their qualifiers must be stripped, so that
636 // ref{,2}->base are unchanged
637 ast::ptr< ast::Type > t1{ ref->base }, t2{ ref2->base };
638 reset_qualifiers( t1 );
639 reset_qualifiers( t2 );
640
641 ast::OpenVarSet newOpen{ open };
642 if ( unifyExact( t1, t2, tenv, have, need, newOpen, noWiden() ) ) {
643 result = ref;
644 if ( q1.val != q2.val ) {
645 // reset result->base->qualifiers to be union of two base qualifiers
646 strict_dynamic_cast< ast::ReferenceType * >(
647 result.get_and_mutate()
648 )->base.get_and_mutate()->qualifiers = q1 | q2;
649 }
650 }
651 }
652 } else if ( widen.second && dynamic_cast< const ast::ZeroType * >( type2 ) ) {
653 result = ref;
654 add_qualifiers( result, type2->qualifiers );
655 } else {
656 if (!dynamic_cast<const ast::EnumInstType *>(type2))
657 result = commonType( type2, ref, tenv, need, have, open, widen );
658 }
659 }
660
661 void postvisit( const ast::FunctionType * func) {
662 tryResolveWithTypedEnum( func );
663 }
664
665 void postvisit( const ast::StructInstType * inst ) {
666 tryResolveWithTypedEnum( inst );
667 }
668
669 void postvisit( const ast::UnionInstType * inst ) {
670 tryResolveWithTypedEnum( inst );
671 }
672
673 void postvisit( const ast::EnumInstType * enumInst ) {
674 // if ( dynamic_cast<const ast::EnumPosType *>(enumInst) ) {
675 // result = enumInst;
676 // } else
677 if (!dynamic_cast<const ast::EnumInstType *>(type2)) {
678 result = commonType( type2, enumInst, tenv, need, have, open, widen);
679 }
680 }
681
682 void postvisit( const ast::EnumPosType * enumPos ) {
683 if ( auto type2AsPos = dynamic_cast<const ast::EnumPosType *>(type2) ) {
684 // result = commonType( type2AsPos->instance, enumPos->instance, tenv, need, have, open, widen );
685 // result = enumPos;
686 if ( enumPos->instance->base->name == type2AsPos->instance->base->name ) {
687 result = type2;
688 }
689 } else if ( dynamic_cast<const ast::BasicType *>(type2) ) {
690 result = type2;
691 }
692 }
693
694 void postvisit( const ast::TraitInstType * ) {}
695
696 void postvisit( const ast::TypeInstType * ) {}
697
698 void postvisit( const ast::TupleType * tuple ) {
699 tryResolveWithTypedEnum( tuple );
700 }
701
702 void postvisit( const ast::VarArgsType * ) {}
703
704 void postvisit( const ast::ZeroType * zero ) {
705 if ( !widen.first ) return;
706 if ( dynamic_cast< const ast::BasicType * >( type2 )
707 || dynamic_cast< const ast::PointerType * >( type2 ) ) {
708 if ( widen.second || zero->qualifiers <= type2->qualifiers ) {
709 result = type2;
710 add_qualifiers( result, zero->qualifiers );
711 }
712 } else if ( widen.second && dynamic_cast< const ast::OneType * >( type2 ) ) {
713 result = new ast::BasicType{
714 ast::BasicType::SignedInt, zero->qualifiers | type2->qualifiers };
715 } else if ( const ast::EnumInstType * enumInst = dynamic_cast< const ast::EnumInstType * >( type2 ) ) {
716 const ast::EnumDecl * enumDecl = enumInst->base;
717 if ( enumDecl->base ) {
718 if ( tryResolveWithTypedEnum( zero ) )
719 add_qualifiers( result, zero->qualifiers );
720 } else {
721 if ( widen.second || zero->qualifiers <= type2->qualifiers ) {
722 result = type2;
723 add_qualifiers( result, zero->qualifiers );
724 }
725 }
726 }
727 }
728
729 void postvisit( const ast::OneType * one ) {
730 if ( !widen.first ) return;
731 if ( dynamic_cast< const ast::BasicType * >( type2 ) ) {
732 if ( widen.second || one->qualifiers <= type2->qualifiers ) {
733 result = type2;
734 add_qualifiers( result, one->qualifiers );
735 }
736 } else if ( widen.second && dynamic_cast< const ast::ZeroType * >( type2 ) ) {
737 result = new ast::BasicType{
738 ast::BasicType::SignedInt, one->qualifiers | type2->qualifiers };
739 } else if ( const ast::EnumInstType * enumInst = dynamic_cast< const ast::EnumInstType * >( type2 ) ) {
740 const ast::EnumDecl * enumBase = enumInst->base;
741 if ( enumBase->base ) {
742 if ( tryResolveWithTypedEnum( one ))
743 add_qualifiers( result, one->qualifiers );
744 } else {
745 if ( widen.second || one->qualifiers <= type2->qualifiers ) {
746 result = type2;
747 add_qualifiers( result, one->qualifiers );
748 }
749 }
750 }
751 }
752};
753
754// size_t CommonType::traceId = Stats::Heap::new_stacktrace_id("CommonType");
755
756namespace {
757 ast::ptr< ast::Type > handleReference(
758 const ast::ptr< ast::Type > & t1, const ast::ptr< ast::Type > & t2, WidenMode widen,
759 ast::TypeEnvironment & env,
760 const ast::OpenVarSet & open
761 ) {
762 ast::ptr<ast::Type> common;
763 ast::AssertionSet have, need;
764 ast::OpenVarSet newOpen{ open };
765
766 // need unify to bind type variables
767 if ( unify( t1, t2, env, have, need, newOpen, common ) ) {
768 ast::CV::Qualifiers q1 = t1->qualifiers, q2 = t2->qualifiers;
769 PRINT(
770 std::cerr << "unify success: " << widenFirst << " " << widenSecond << std::endl;
771 )
772 if ( ( widen.first || q2 <= q1 ) && ( widen.second || q1 <= q2 ) ) {
773 PRINT(
774 std::cerr << "widen okay" << std::endl;
775 )
776 add_qualifiers( common, q1 | q2 );
777 return common;
778 }
779 }
780
781 PRINT(
782 std::cerr << "exact unify failed: " << t1 << " " << t2 << std::endl;
783 )
784 return { nullptr };
785 }
786}
787
788ast::ptr< ast::Type > commonType(
789 const ast::ptr< ast::Type > & type1, const ast::ptr< ast::Type > & type2,
790 ast::TypeEnvironment & env, ast::AssertionSet & need, ast::AssertionSet & have,
791 const ast::OpenVarSet & open, WidenMode widen
792) {
793 unsigned depth1 = type1->referenceDepth();
794 unsigned depth2 = type2->referenceDepth();
795
796 if ( depth1 != depth2 ) { // implies depth1 > 0 || depth2 > 0
797 PRINT(
798 std::cerr << "reference depth diff: " << (depth1-depth2) << std::endl;
799 )
800 ast::ptr< ast::Type > result;
801 const ast::ReferenceType * ref1 = type1.as< ast::ReferenceType >();
802 const ast::ReferenceType * ref2 = type2.as< ast::ReferenceType >();
803
804 if ( depth1 > depth2 ) {
805 assert( ref1 );
806 result = handleReference( ref1->base, type2, widen, env, open );
807 } else { // Implies depth1 < depth2
808 assert( ref2 );
809 result = handleReference( type1, ref2->base, widen, env, open );
810 }
811
812 if ( result && ref1 ) {
813 // formal is reference, so result should be reference
814 PRINT(
815 std::cerr << "formal is reference; result should be reference" << std::endl;
816 )
817 result = new ast::ReferenceType{ result, ref1->qualifiers };
818 }
819
820 PRINT(
821 std::cerr << "common type of reference [" << type1 << "] and [" << type2 << "] is "
822 "[" << result << "]" << std::endl;
823 )
824 return result;
825 }
826 // otherwise both are reference types of the same depth and this is handled by the visitor
827 ast::Pass<CommonType> visitor{ type2, widen, env, open, need, have };
828 type1->accept( visitor );
829 // ast::ptr< ast::Type > result = visitor.core.result;
830
831 return visitor.core.result;
832}
833
834} // namespace ResolvExpr
835
836// Local Variables: //
837// tab-width: 4 //
838// mode: c++ //
839// compile-command: "make install" //
840// End: //
Note: See TracBrowser for help on using the repository browser.