source: src/ResolvExpr/CommonType.cc@ 8d182b1

Last change on this file since 8d182b1 was 0bd3faf, checked in by Andrew Beach <ajbeach@…>, 23 months ago

Removed forward declarations missed in the BaseSyntaxNode removal. Removed code and modified names to support two versions of the ast.

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