source: src/ResolvExpr/CommonType.cc @ 0bd3faf

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

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

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