source: src/ResolvExpr/CommonType.cc @ f1149ac

Last change on this file since f1149ac was f1149ac, checked in by JiadaL <j82liang@…>, 3 months ago

Remove unused variables

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