source: src/ResolvExpr/CommonType.cc @ b93c544

Last change on this file since b93c544 was 647d633, checked in by JiadaL <j82liang@…>, 8 months ago

Remove unused variables

  • Property mode set to 100644
File size: 51.7 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 ( dynamic_cast<const ast::EnumPosType *>(type2) ) {
684                        // result = commonType( type2AsPos->instance, enumPos->instance, tenv, need, have, open, widen );
685                        result = enumPos;
686                } else if ( dynamic_cast<const ast::BasicType *>(type2) ) {
687                        result = type2;
688                }
689        }
690
691        void postvisit( const ast::TraitInstType * ) {}
692
693        void postvisit( const ast::TypeInstType * ) {}
694
695        void postvisit( const ast::TupleType * tuple ) {
696                tryResolveWithTypedEnum( tuple );
697        }
698
699        void postvisit( const ast::VarArgsType * ) {}
700
701        void postvisit( const ast::ZeroType * zero ) {
702                if ( !widen.first ) return;
703                if ( dynamic_cast< const ast::BasicType * >( type2 )
704                                || dynamic_cast< const ast::PointerType * >( type2 ) ) {
705                        if ( widen.second || zero->qualifiers <= type2->qualifiers ) {
706                                result = type2;
707                                add_qualifiers( result, zero->qualifiers );
708                        }
709                } else if ( widen.second && dynamic_cast< const ast::OneType * >( type2 ) ) {
710                        result = new ast::BasicType{
711                                ast::BasicType::SignedInt, zero->qualifiers | type2->qualifiers };
712                } else if ( const ast::EnumInstType * enumInst = dynamic_cast< const ast::EnumInstType * >( type2 ) ) {
713                        const ast::EnumDecl * enumDecl = enumInst->base;
714                        if ( enumDecl->base ) {
715                                if ( tryResolveWithTypedEnum( zero ) )
716                                        add_qualifiers( result, zero->qualifiers );
717                        } else {
718                                if ( widen.second || zero->qualifiers <= type2->qualifiers ) {
719                                        result = type2;
720                                        add_qualifiers( result, zero->qualifiers );
721                                }
722                        }
723                }
724        }
725
726        void postvisit( const ast::OneType * one ) {
727                if ( !widen.first ) return;
728                if ( dynamic_cast< const ast::BasicType * >( type2 ) ) {
729                        if ( widen.second || one->qualifiers <= type2->qualifiers ) {
730                                result = type2;
731                                add_qualifiers( result, one->qualifiers );
732                        }
733                } else if ( widen.second && dynamic_cast< const ast::ZeroType * >( type2 ) ) {
734                        result = new ast::BasicType{
735                                ast::BasicType::SignedInt, one->qualifiers | type2->qualifiers };
736                } else if ( const ast::EnumInstType * enumInst = dynamic_cast< const ast::EnumInstType * >( type2 ) ) {
737                        const ast::EnumDecl * enumBase = enumInst->base;
738                        if ( enumBase->base ) {
739                                if ( tryResolveWithTypedEnum( one ))
740                                        add_qualifiers( result, one->qualifiers );
741                        } else {
742                                if ( widen.second || one->qualifiers <= type2->qualifiers ) {
743                                        result = type2;
744                                        add_qualifiers( result, one->qualifiers );
745                                }
746                        }
747                }
748        }
749};
750
751// size_t CommonType::traceId = Stats::Heap::new_stacktrace_id("CommonType");
752
753namespace {
754        ast::ptr< ast::Type > handleReference(
755                const ast::ptr< ast::Type > & t1, const ast::ptr< ast::Type > & t2, WidenMode widen,
756                ast::TypeEnvironment & env,
757                const ast::OpenVarSet & open
758        ) {
759                ast::ptr<ast::Type> common;
760                ast::AssertionSet have, need;
761                ast::OpenVarSet newOpen{ open };
762
763                // need unify to bind type variables
764                if ( unify( t1, t2, env, have, need, newOpen, common ) ) {
765                        ast::CV::Qualifiers q1 = t1->qualifiers, q2 = t2->qualifiers;
766                        PRINT(
767                                std::cerr << "unify success: " << widenFirst << " " << widenSecond << std::endl;
768                        )
769                        if ( ( widen.first || q2 <= q1 ) && ( widen.second || q1 <= q2 ) ) {
770                                PRINT(
771                                        std::cerr << "widen okay" << std::endl;
772                                )
773                                add_qualifiers( common, q1 | q2 );
774                                return common;
775                        }
776                }
777
778                PRINT(
779                        std::cerr << "exact unify failed: " << t1 << " " << t2 << std::endl;
780                )
781                return { nullptr };
782        }
783}
784
785ast::ptr< ast::Type > commonType(
786        const ast::ptr< ast::Type > & type1, const ast::ptr< ast::Type > & type2,
787        ast::TypeEnvironment & env, ast::AssertionSet & need, ast::AssertionSet & have,
788        const ast::OpenVarSet & open, WidenMode widen
789) {
790        unsigned depth1 = type1->referenceDepth();
791        unsigned depth2 = type2->referenceDepth();
792
793        if ( depth1 != depth2 ) {  // implies depth1 > 0 || depth2 > 0
794                PRINT(
795                        std::cerr << "reference depth diff: " << (depth1-depth2) << std::endl;
796                )
797                ast::ptr< ast::Type > result;
798                const ast::ReferenceType * ref1 = type1.as< ast::ReferenceType >();
799                const ast::ReferenceType * ref2 = type2.as< ast::ReferenceType >();
800
801                if ( depth1 > depth2 ) {
802                        assert( ref1 );
803                        result = handleReference( ref1->base, type2, widen, env, open );
804                } else {  // Implies depth1 < depth2
805                        assert( ref2 );
806                        result = handleReference( type1, ref2->base, widen, env, open );
807                }
808
809                if ( result && ref1 ) {
810                        // formal is reference, so result should be reference
811                        PRINT(
812                                std::cerr << "formal is reference; result should be reference" << std::endl;
813                        )
814                        result = new ast::ReferenceType{ result, ref1->qualifiers };
815                }
816
817                PRINT(
818                        std::cerr << "common type of reference [" << type1 << "] and [" << type2 << "] is "
819                        "[" << result << "]" << std::endl;
820                )
821                return result;
822        }
823        // otherwise both are reference types of the same depth and this is handled by the visitor
824        ast::Pass<CommonType> visitor{ type2, widen, env, open, need, have };
825        type1->accept( visitor );
826        // ast::ptr< ast::Type > result = visitor.core.result;
827
828        return visitor.core.result;
829}
830
831} // namespace ResolvExpr
832
833// Local Variables: //
834// tab-width: 4 //
835// mode: c++ //
836// compile-command: "make install" //
837// End: //
Note: See TracBrowser for help on using the repository browser.