source: src/ResolvExpr/CommonType.cc @ c6b4432

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

Remove BaseSyntaxNode? and clean-up.

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