source: src/ResolvExpr/CommonType.cc@ f5ec35a

Last change on this file since f5ec35a was c6b4432, checked in by Andrew Beach <ajbeach@…>, 23 months ago

Remove BaseSyntaxNode and clean-up.

  • Property mode set to 100644
File size: 51.3 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
345 class CommonType_new 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;
352 public:
353 static size_t traceId;
354 ast::ptr< ast::Type > result;
355
356 CommonType_new(
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 #warning remove casts when `commonTypes` moved to new AST
391 ast::BasicType::Kind kind = commonTypes[ basic->kind ][ ast::BasicType::SignedInt ];
392 if (
393 ( ( kind == basic->kind && basic->qualifiers >= type2->qualifiers )
394 || widen.first )
395 && ( ( kind != basic->kind && basic->qualifiers <= type2->qualifiers )
396 || widen.second )
397 ) {
398 result = new ast::BasicType{ kind, basic->qualifiers | type2->qualifiers };
399 }
400 }
401 }
402 }
403
404 private:
405 template< typename Pointer >
406 void getCommonWithVoidPointer( const Pointer * voidPtr, const Pointer * oPtr ) {
407 const ast::Type * base = oPtr->base;
408 if ( auto var = dynamic_cast< const ast::TypeInstType * >( base ) ) {
409 auto entry = open.find( *var );
410 if ( entry != open.end() ) {
411 ast::AssertionSet need, have;
412 if ( ! tenv.bindVar(
413 var, voidPtr->base, entry->second, need, have, open, widen )
414 ) return;
415 }
416 }
417 result = voidPtr;
418 add_qualifiers( result, oPtr->qualifiers );
419 }
420
421 // For a typed enum, we want to unify type1 with the base type of the enum
422 bool tryResolveWithTypedEnum( const ast::Type * type1 ) {
423 if (auto enumInst = dynamic_cast<const ast::EnumInstType *> (type2) ) {
424 ast::OpenVarSet newOpen{ open };
425 if (enumInst->base->base
426 && unifyExact(type1, enumInst->base->base, tenv, need, have, newOpen, widen)) {
427 result = type1;
428 return true;
429 }
430 }
431 return false;
432 }
433
434 public:
435 void postvisit( const ast::PointerType * pointer ) {
436 if ( auto pointer2 = dynamic_cast< const ast::PointerType * >( type2 ) ) {
437 if (
438 widen.first
439 && pointer2->base.as< ast::VoidType >()
440 && ! ast::isFtype( pointer->base )
441 ) {
442 getCommonWithVoidPointer( pointer2, pointer );
443 } else if (
444 widen.second
445 && pointer->base.as< ast::VoidType >()
446 && ! ast::isFtype( pointer2->base )
447 ) {
448 getCommonWithVoidPointer( pointer, pointer2 );
449 } else if (
450 ( pointer->base->qualifiers >= pointer2->base->qualifiers || widen.first )
451 && ( pointer->base->qualifiers <= pointer2->base->qualifiers || widen.second )
452 ) {
453 ast::CV::Qualifiers q1 = pointer->base->qualifiers;
454 ast::CV::Qualifiers q2 = pointer2->base->qualifiers;
455
456 // force t{1,2} to be cloned if their qualifiers must be stripped, so that
457 // pointer{,2}->base are unchanged
458 ast::ptr< ast::Type > t1{ pointer->base }, t2{ pointer2->base };
459 reset_qualifiers( t1 );
460 reset_qualifiers( t2 );
461
462 ast::OpenVarSet newOpen{ open };
463 if ( unifyExact( t1, t2, tenv, have, need, newOpen, noWiden() ) ) {
464 result = pointer;
465 if ( q1.val != q2.val ) {
466 // reset result->base->qualifiers to be union of two base qualifiers
467 strict_dynamic_cast< ast::PointerType * >(
468 result.get_and_mutate()
469 )->base.get_and_mutate()->qualifiers = q1 | q2;
470 }
471 }
472 else if ( isFtype (t1) && isFtype (t2) ) {
473 auto f1 = t1.as<ast::FunctionType>();
474 if (!f1) return;
475 auto f2 = t2.strict_as<ast::FunctionType>();
476
477 assertf(f1->returns.size() <= 1, "Function return should not be a list");
478 assertf(f2->returns.size() <= 1, "Function return should not be a list");
479
480 if (
481 ( f1->params.size() != f2->params.size() || f1->returns.size() != f2->returns.size() )
482 && ! f1->isTtype()
483 && ! f2->isTtype()
484 ) return;
485
486 auto params1 = flattenList( f1->params, tenv );
487 auto params2 = flattenList( f2->params, tenv );
488
489 auto crnt1 = params1.begin();
490 auto crnt2 = params2.begin();
491 auto end1 = params1.end();
492 auto end2 = params2.end();
493
494 while (crnt1 != end1 && crnt2 != end2 ) {
495 const ast::Type * arg1 = *crnt1;
496 const ast::Type * arg2 = *crnt2;
497
498 bool isTuple1 = Tuples::isTtype( t1 );
499 bool isTuple2 = Tuples::isTtype( t2 );
500
501 // assumes here that ttype *must* be last parameter
502 if ( isTuple1 && ! isTuple2 ) {
503 // combine remainder of list2, then unify
504 if (unifyExact(
505 arg1, tupleFromTypes( crnt2, end2 ), tenv, need, have, open,
506 noWiden() )) {
507 break;
508
509 }
510 else return;
511 } else if ( ! isTuple1 && isTuple2 ) {
512 // combine remainder of list1, then unify
513 if (unifyExact(
514 tupleFromTypes( crnt1, end1 ), arg2, tenv, need, have, open,
515 noWiden() )) {
516 break;
517
518 }
519 else return;
520 }
521
522 // allow qualifiers of pointer and reference base to become more specific
523 if (auto ref1 = dynamic_cast<const ast::ReferenceType *> (arg1)) {
524 if (auto ref2 = dynamic_cast<const ast::ReferenceType *> (arg2)) {
525 ast::ptr<ast::Type> base1 = ref1->base;
526 ast::ptr<ast::Type> base2 = ref2->base;
527
528 // xxx - assume LHS is always the target type
529
530 if ( ! ((widen.second && ref2->qualifiers.is_mutex)
531 || (ref1->qualifiers.is_mutex == ref2->qualifiers.is_mutex ))) return;
532
533 if ( (widen.second && base1->qualifiers <= base2->qualifiers ) || (base2->qualifiers == base1->qualifiers) ) {
534
535 reset_qualifiers(base1);
536 reset_qualifiers(base2);
537
538 if ( ! unifyExact(
539 base1, base2, tenv, need, have, open, noWiden() )
540 ) return;
541 }
542 }
543 else return;
544 }
545 else if (auto ptr1 = dynamic_cast<const ast::PointerType *> (arg1)) {
546 if (auto ptr2 = dynamic_cast<const ast::PointerType *> (arg2)) {
547 ast::ptr<ast::Type> base1 = ptr1->base;
548 ast::ptr<ast::Type> base2 = ptr2->base;
549
550 // xxx - assume LHS is always the target type
551 // a function accepting const can always be called by non-const arg
552
553 if ( (widen.second && base1->qualifiers <= base2->qualifiers ) || (base2->qualifiers == base1->qualifiers) ) {
554
555 reset_qualifiers(base1);
556 reset_qualifiers(base2);
557
558 if ( ! unifyExact(
559 base1, base2, tenv, need, have, open, noWiden() )
560 ) return;
561 }
562 }
563 else return;
564
565 }
566 else if (! unifyExact(
567 arg1, arg2, tenv, need, have, open, noWiden() )) 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 }
605 } // if ftype
606
607 }
608 } else if ( widen.second && dynamic_cast< const ast::ZeroType * >( type2 ) ) {
609 result = pointer;
610 add_qualifiers( result, type2->qualifiers );
611 } else {
612 tryResolveWithTypedEnum( pointer );
613 }
614 }
615
616 void postvisit( const ast::ArrayType * arr ) {
617 // xxx - does it make sense?
618 tryResolveWithTypedEnum( arr );
619 }
620
621 void postvisit( const ast::ReferenceType * ref ) {
622 if ( auto ref2 = dynamic_cast< const ast::ReferenceType * >( type2 ) ) {
623 if (
624 widen.first && ref2->base.as< ast::VoidType >() && ! ast::isFtype( ref->base )
625 ) {
626 getCommonWithVoidPointer( ref2, ref );
627 } else if (
628 widen.second && ref->base.as< ast::VoidType>() && ! ast::isFtype( ref2->base )
629 ) {
630 getCommonWithVoidPointer( ref, ref2 );
631 } else if (
632 ( ref->base->qualifiers >= ref2->base->qualifiers || widen.first )
633 && ( ref->base->qualifiers <= ref2->base->qualifiers || widen.second )
634 ) {
635 ast::CV::Qualifiers q1 = ref->base->qualifiers, q2 = ref2->base->qualifiers;
636
637 // force t{1,2} to be cloned if their qualifiers must be stripped, so that
638 // ref{,2}->base are unchanged
639 ast::ptr< ast::Type > t1{ ref->base }, t2{ ref2->base };
640 reset_qualifiers( t1 );
641 reset_qualifiers( t2 );
642
643 ast::OpenVarSet newOpen{ open };
644 if ( unifyExact( t1, t2, tenv, have, need, newOpen, noWiden() ) ) {
645 result = ref;
646 if ( q1.val != q2.val ) {
647 // reset result->base->qualifiers to be union of two base qualifiers
648 strict_dynamic_cast< ast::ReferenceType * >(
649 result.get_and_mutate()
650 )->base.get_and_mutate()->qualifiers = q1 | q2;
651 }
652 }
653 }
654 } else if ( widen.second && dynamic_cast< const ast::ZeroType * >( type2 ) ) {
655 result = ref;
656 add_qualifiers( result, type2->qualifiers );
657 } else {
658 if (!dynamic_cast<const ast::EnumInstType *>(type2))
659 result = commonType( type2, ref, tenv, need, have, open, widen );
660 }
661 }
662
663 void postvisit( const ast::FunctionType * func) {
664 tryResolveWithTypedEnum( func );
665 }
666
667 void postvisit( const ast::StructInstType * inst ) {
668 tryResolveWithTypedEnum( inst );
669 }
670
671 void postvisit( const ast::UnionInstType * inst ) {
672 tryResolveWithTypedEnum( inst );
673 }
674
675 void postvisit( const ast::EnumInstType * enumInst ) {
676 if (!dynamic_cast<const ast::EnumInstType *>(type2))
677 result = commonType( type2, enumInst, tenv, need, have, open, widen);
678 }
679
680 void postvisit( const ast::TraitInstType * ) {}
681
682 void postvisit( const ast::TypeInstType * ) {}
683
684 void postvisit( const ast::TupleType * tuple ) {
685 tryResolveWithTypedEnum( tuple );
686 }
687
688 void postvisit( const ast::VarArgsType * ) {}
689
690 void postvisit( const ast::ZeroType * zero ) {
691 if ( ! widen.first ) return;
692 if ( dynamic_cast< const ast::BasicType * >( type2 )
693 || dynamic_cast< const ast::PointerType * >( type2 ) ) {
694 if ( widen.second || zero->qualifiers <= type2->qualifiers ) {
695 result = type2;
696 add_qualifiers( result, zero->qualifiers );
697 }
698 } else if ( widen.second && dynamic_cast< const ast::OneType * >( type2 ) ) {
699 result = new ast::BasicType{
700 ast::BasicType::SignedInt, zero->qualifiers | type2->qualifiers };
701 } else if ( const ast::EnumInstType * enumInst = dynamic_cast< const ast::EnumInstType * >( type2 ) ) {
702 const ast::EnumDecl * enumDecl = enumInst->base;
703 if ( enumDecl->base ) {
704 if ( tryResolveWithTypedEnum( zero ) )
705 add_qualifiers( result, zero->qualifiers );
706 } else {
707 if ( widen.second || zero->qualifiers <= type2->qualifiers ) {
708 result = type2;
709 add_qualifiers( result, zero->qualifiers );
710 }
711 }
712 }
713 }
714
715 void postvisit( const ast::OneType * one ) {
716 if ( ! widen.first ) return;
717 if ( dynamic_cast< const ast::BasicType * >( type2 ) ) {
718 if ( widen.second || one->qualifiers <= type2->qualifiers ) {
719 result = type2;
720 add_qualifiers( result, one->qualifiers );
721 }
722 } else if ( widen.second && dynamic_cast< const ast::ZeroType * >( type2 ) ) {
723 result = new ast::BasicType{
724 ast::BasicType::SignedInt, one->qualifiers | type2->qualifiers };
725 } else if ( const ast::EnumInstType * enumInst = dynamic_cast< const ast::EnumInstType * >( type2 ) ) {
726 const ast::EnumDecl * enumBase = enumInst->base;
727 if ( enumBase->base ) {
728 if ( tryResolveWithTypedEnum( one ))
729 add_qualifiers( result, one->qualifiers );
730 } else {
731 if ( widen.second || one->qualifiers <= type2->qualifiers ) {
732 result = type2;
733 add_qualifiers( result, one->qualifiers );
734 }
735 }
736 }
737 }
738
739 };
740
741 // size_t CommonType_new::traceId = Stats::Heap::new_stacktrace_id("CommonType_new");
742 namespace {
743 ast::ptr< ast::Type > handleReference(
744 const ast::ptr< ast::Type > & t1, const ast::ptr< ast::Type > & t2, WidenMode widen,
745 ast::TypeEnvironment & env,
746 const ast::OpenVarSet & open
747 ) {
748 ast::ptr<ast::Type> common;
749 ast::AssertionSet have, need;
750 ast::OpenVarSet newOpen{ open };
751
752 // need unify to bind type variables
753 if ( unify( t1, t2, env, have, need, newOpen, common ) ) {
754 ast::CV::Qualifiers q1 = t1->qualifiers, q2 = t2->qualifiers;
755 PRINT(
756 std::cerr << "unify success: " << widenFirst << " " << widenSecond << std::endl;
757 )
758 if ( ( widen.first || q2 <= q1 ) && ( widen.second || q1 <= q2 ) ) {
759 PRINT(
760 std::cerr << "widen okay" << std::endl;
761 )
762 add_qualifiers( common, q1 | q2 );
763 return common;
764 }
765 }
766
767 PRINT(
768 std::cerr << "exact unify failed: " << t1 << " " << t2 << std::endl;
769 )
770 return { nullptr };
771 }
772 }
773
774 ast::ptr< ast::Type > commonType(
775 const ast::ptr< ast::Type > & type1, const ast::ptr< ast::Type > & type2,
776 ast::TypeEnvironment & env, ast::AssertionSet & need, ast::AssertionSet & have,
777 const ast::OpenVarSet & open, WidenMode widen
778 ) {
779 unsigned depth1 = type1->referenceDepth();
780 unsigned depth2 = type2->referenceDepth();
781
782 if ( depth1 != depth2 ) { // implies depth1 > 0 || depth2 > 0
783 PRINT(
784 std::cerr << "reference depth diff: " << (depth1-depth2) << std::endl;
785 )
786 ast::ptr< ast::Type > result;
787 const ast::ReferenceType * ref1 = type1.as< ast::ReferenceType >();
788 const ast::ReferenceType * ref2 = type2.as< ast::ReferenceType >();
789
790 if ( depth1 > depth2 ) {
791 assert( ref1 );
792 result = handleReference( ref1->base, type2, widen, env, open );
793 } else { // implies depth1 < depth2
794 assert( ref2 );
795 result = handleReference( type1, ref2->base, widen, env, open );
796 }
797
798 if ( result && ref1 ) {
799 // formal is reference, so result should be reference
800 PRINT(
801 std::cerr << "formal is reference; result should be reference" << std::endl;
802 )
803 result = new ast::ReferenceType{ result, ref1->qualifiers };
804 }
805
806 PRINT(
807 std::cerr << "common type of reference [" << type1 << "] and [" << type2 << "] is "
808 "[" << result << "]" << std::endl;
809 )
810 return result;
811 }
812 // otherwise both are reference types of the same depth and this is handled by the visitor
813 ast::Pass<CommonType_new> visitor{ type2, widen, env, open, need, have };
814 type1->accept( visitor );
815 // ast::ptr< ast::Type > result = visitor.core.result;
816
817 return visitor.core.result;
818 }
819
820} // namespace ResolvExpr
821
822// Local Variables: //
823// tab-width: 4 //
824// mode: c++ //
825// compile-command: "make install" //
826// End: //
Note: See TracBrowser for help on using the repository browser.