78class TypeInference :
public Transform,
public ResolutionContext {
82 std::shared_ptr<MinimalNameGenerator> nameGen;
84 TypeInference(
TypeMap *typeMap, std::shared_ptr<MinimalNameGenerator> nameGen);
89 explicit TypeInference(
TypeMap *typeMap,
bool readOnly =
false,
bool checkArrays =
true,
90 bool errorOnNullDecls =
false);
94 bool readOnly =
false;
95 bool checkArrays =
true;
96 bool errorOnNullDecls =
false;
97 const IR::Type *getType(
const IR::Node *element)
const;
98 const IR::Type *getTypeType(
const IR::Node *element)
const;
99 void setType(
const IR::Node *element,
const IR::Type *type);
100 void setLeftValue(
const IR::Expression *expression) { typeMap->setLeftValue(expression); }
101 bool isLeftValue(
const IR::Expression *expression)
const {
102 return typeMap->isLeftValue(expression) || expression->is<IR::DefaultExpression>();
104 void setCompileTimeConstant(
const IR::Expression *expression) {
105 typeMap->setCompileTimeConstant(expression);
107 bool isCompileTimeConstant(
const IR::Expression *expression)
const {
108 return typeMap->isCompileTimeConstant(expression);
116 const IR::Type *destType,
const IR::Type *srcType,
117 std::string_view errorFormat,
118 std::initializer_list<const IR::Node *> errorArgs);
124 const IR::Type *srcType, std::string_view errorFormat = {},
125 std::initializer_list<const IR::Node *> errorArgs = {}) {
126 return unifyBase(
true, errorPosition, destType, srcType, errorFormat, errorArgs);
130 const IR::Type *srcType, std::string_view errorFormat = {},
131 std::initializer_list<const IR::Node *> errorArgs = {}) {
132 return unifyBase(
false, errorPosition, destType, srcType, errorFormat, errorArgs);
139 const IR::Expression *
assignment(
const IR::Node *errorPosition,
const IR::Type *destType,
140 const IR::Expression *sourceExpression);
141 const IR::SelectCase *matchCase(
const IR::SelectExpression *select,
142 const IR::Type_BaseList *selectType,
143 const IR::SelectCase *selectCase,
const IR::Type *caseType);
144 bool canCastBetween(
const IR::Type *dest,
const IR::Type *src)
const;
145 bool checkAbstractMethods(
const IR::Declaration_Instance *inst,
const IR::Type_Extern *type);
146 void addSubstitutions(
const TypeVariableSubstitution *tvs);
148 const IR::Expression *constantFold(
const IR::Expression *expression);
153 virtual const IR::Type *
canonicalize(
const IR::Type *type);
154 template <
class Ctor>
155 const IR::Type *canonicalizeFields(
const IR::Type_StructLike *type, Ctor constructor);
156 virtual const IR::ParameterList *canonicalizeParameters(
const IR::ParameterList *params);
159 bool onlyBitsOrBitStructs(
const IR::Type *type)
const;
160 bool containsHeader(
const IR::Type *canonType);
161 bool validateFields(
const IR::Type *type, std::function<
bool(
const IR::Type *)> checker)
const;
162 const IR::Node *binaryBool(
const IR::Operation_Binary *op);
163 const IR::Node *binaryArith(
const IR::Operation_Binary *op);
164 const IR::Node *unsBinaryArith(
const IR::Operation_Binary *op);
165 const IR::Node *shift(
const IR::Operation_Binary *op);
166 const IR::Node *typeSet(
const IR::Operation_Binary *op);
168 const IR::Type *cloneWithFreshTypeVariables(
const IR::IMayBeGenericType *type);
170 const IR::Node *node,
const IR::Vector<IR::Argument> *args,
171 const IR::IContainer *container);
172 const IR::Expression *actionCall(
174 const IR::MethodCallExpression *actionCall);
175 std::pair<const IR::Type *, const IR::Vector<IR::Argument> *> checkExternConstructor(
176 const IR::Node *errorPosition,
const IR::Type_Extern *ext,
177 const IR::Vector<IR::Argument> *arguments);
179 static constexpr bool forbidModules =
true;
180 static constexpr bool forbidPackages =
true;
181 bool checkParameters(
const IR::ParameterList *paramList,
bool forbidModules =
false,
182 bool forbidPackage =
false)
const;
183 virtual const IR::Type *setTypeType(
const IR::Type *type,
bool learn =
true);
191 bool containsActionEnum(
const IR::Type *type)
const;
200 using Transform::postorder;
201 using Transform::preorder;
203 static const IR::Type *
specialize(
const IR::IMayBeGenericType *type,
205 const Visitor::Context *ctxt);
212 const IR::Node *preorder(IR::Expression *expression)
override {
213 return pruneIfDone(expression);
215 const IR::Node *preorder(IR::Type *type)
override {
return pruneIfDone(type); }
218 const IR::Expression *left;
219 const IR::Expression *right;
223 bool compare(
const IR::Node *errorPosition,
const IR::Type *ltype,
const IR::Type *rtype,
228 const IR::Node *preorder(IR::Function *function)
override;
229 const IR::Node *preorder(IR::P4Program *program)
override;
230 const IR::Node *preorder(IR::Declaration_Instance *decl)
override;
232 const IR::Node *preorder(IR::EntriesList *el)
override;
233 const IR::Node *preorder(IR::Type_SerEnum *type)
override;
235 const IR::Node *postorder(IR::Declaration_MatchKind *decl)
override;
236 const IR::Node *postorder(IR::Declaration_Variable *decl)
override;
237 const IR::Node *postorder(IR::Declaration_Constant *constant)
override;
238 const IR::Node *postorder(IR::P4Control *cont)
override;
239 const IR::Node *postorder(IR::P4Parser *cont)
override;
240 const IR::Node *postorder(IR::Method *method)
override;
242 const IR::Node *postorder(IR::Type_Type *type)
override;
243 const IR::Node *postorder(IR::Type_Table *type)
override;
244 const IR::Node *postorder(IR::Type_Error *decl)
override;
245 const IR::Node *postorder(IR::Type_InfInt *type)
override;
246 const IR::Node *postorder(IR::Type_Method *type)
override;
247 const IR::Node *postorder(IR::Type_Action *type)
override;
248 const IR::Node *postorder(IR::Type_Name *type)
override;
249 const IR::Node *postorder(IR::Type_Base *type)
override;
250 const IR::Node *postorder(IR::Type_Var *type)
override;
251 const IR::Node *postorder(IR::Type_Enum *type)
override;
252 const IR::Node *postorder(IR::Type_Extern *type)
override;
253 const IR::Node *postorder(IR::StructField *field)
override;
254 const IR::Node *postorder(IR::Type_Header *type)
override;
255 const IR::Node *postorder(IR::Type_Stack *type)
override;
256 const IR::Node *postorder(IR::Type_Struct *type)
override;
257 const IR::Node *postorder(IR::Type_HeaderUnion *type)
override;
258 const IR::Node *postorder(IR::Type_Typedef *type)
override;
259 const IR::Node *postorder(IR::Type_Specialized *type)
override;
260 const IR::Node *postorder(IR::Type_SpecializedCanonical *type)
override;
261 const IR::Node *postorder(IR::Type_Tuple *type)
override;
262 const IR::Node *postorder(IR::Type_P4List *type)
override;
263 const IR::Node *postorder(IR::Type_List *type)
override;
264 const IR::Node *postorder(IR::Type_Set *type)
override;
265 const IR::Node *postorder(IR::Type_ArchBlock *type)
override;
266 const IR::Node *postorder(IR::Type_Newtype *type)
override;
267 const IR::Node *postorder(IR::Type_Package *type)
override;
268 const IR::Node *postorder(IR::Type_ActionEnum *type)
override;
269 const IR::Node *postorder(IR::P4Table *type)
override;
270 const IR::Node *postorder(IR::P4Action *type)
override;
271 const IR::Node *postorder(IR::P4ValueSet *type)
override;
272 const IR::Node *postorder(IR::Key *key)
override;
273 const IR::Node *postorder(IR::Entry *e)
override;
275 const IR::Node *postorder(IR::Dots *expression)
override;
276 const IR::Node *postorder(IR::Argument *arg)
override;
277 const IR::Node *postorder(IR::SerEnumMember *member)
override;
278 const IR::Node *postorder(IR::Parameter *param)
override;
279 const IR::Node *postorder(IR::Constant *expression)
override;
280 const IR::Node *postorder(IR::BoolLiteral *expression)
override;
281 const IR::Node *postorder(IR::StringLiteral *expression)
override;
282 const IR::Node *postorder(IR::Operation_Relation *expression)
override;
283 const IR::Node *postorder(IR::Concat *expression)
override;
284 const IR::Node *postorder(IR::ArrayIndex *expression)
override;
285 const IR::Node *postorder(IR::LAnd *expression)
override {
return binaryBool(expression); }
286 const IR::Node *postorder(IR::LOr *expression)
override {
return binaryBool(expression); }
287 const IR::Node *postorder(IR::Add *expression)
override {
return binaryArith(expression); }
288 const IR::Node *postorder(IR::Sub *expression)
override {
return binaryArith(expression); }
289 const IR::Node *postorder(IR::AddSat *expression)
override {
return binaryArith(expression); }
290 const IR::Node *postorder(IR::SubSat *expression)
override {
return binaryArith(expression); }
291 const IR::Node *postorder(IR::Mul *expression)
override {
return binaryArith(expression); }
292 const IR::Node *postorder(IR::Div *expression)
override {
return unsBinaryArith(expression); }
293 const IR::Node *postorder(IR::Mod *expression)
override {
return unsBinaryArith(expression); }
294 const IR::Node *postorder(IR::Shl *expression)
override {
return shift(expression); }
295 const IR::Node *postorder(IR::Shr *expression)
override {
return shift(expression); }
296 const IR::Node *postorder(IR::BXor *expression)
override {
return binaryArith(expression); }
297 const IR::Node *postorder(IR::BAnd *expression)
override {
return binaryArith(expression); }
298 const IR::Node *postorder(IR::BOr *expression)
override {
return binaryArith(expression); }
299 const IR::Node *postorder(IR::Mask *expression)
override {
return typeSet(expression); }
300 const IR::Node *postorder(IR::Range *expression)
override {
return typeSet(expression); }
301 const IR::Node *postorder(IR::LNot *expression)
override;
302 const IR::Node *postorder(IR::Neg *expression)
override;
303 const IR::Node *postorder(IR::UPlus *expression)
override;
304 const IR::Node *postorder(IR::Cmpl *expression)
override;
305 const IR::Node *postorder(IR::Cast *expression)
override;
306 const IR::Node *postorder(IR::Mux *expression)
override;
307 const IR::Node *postorder(IR::Slice *expression)
override;
308 const IR::Node *postorder(IR::PathExpression *expression)
override;
309 const IR::Node *postorder(IR::Member *expression)
override;
310 const IR::Node *postorder(IR::TypeNameExpression *expression)
override;
311 const IR::Node *postorder(IR::ListExpression *expression)
override;
312 const IR::Node *postorder(IR::InvalidHeader *expression)
override;
313 const IR::Node *postorder(IR::InvalidHeaderUnion *expression)
override;
314 const IR::Node *postorder(IR::Invalid *expression)
override;
315 const IR::Node *postorder(IR::P4ListExpression *expression)
override;
316 const IR::Node *postorder(IR::StructExpression *expression)
override;
317 const IR::Node *postorder(IR::HeaderStackExpression *expression)
override;
318 const IR::Node *postorder(IR::MethodCallStatement *mcs)
override;
319 const IR::Node *postorder(IR::MethodCallExpression *expression)
override;
320 const IR::Node *postorder(IR::ConstructorCallExpression *expression)
override;
321 const IR::Node *postorder(IR::SelectExpression *expression)
override;
322 const IR::Node *postorder(IR::DefaultExpression *expression)
override;
323 const IR::Node *postorder(IR::This *expression)
override;
324 const IR::Node *postorder(IR::AttribLocal *local)
override;
325 const IR::Node *postorder(IR::ActionList *al)
override;
327 const IR::Node *postorder(IR::ReturnStatement *stat)
override;
328 const IR::Node *postorder(IR::IfStatement *stat)
override;
329 const IR::Node *postorder(IR::SwitchStatement *stat)
override;
330 const IR::Node *postorder(IR::AssignmentStatement *stat)
override;
331 const IR::Node *postorder(IR::ForInStatement *stat)
override;
332 const IR::Node *postorder(IR::ActionListElement *elem)
override;
333 const IR::Node *postorder(IR::KeyElement *elem)
override;
334 const IR::Node *postorder(IR::Property *elem)
override;
335 const IR::Node *postorder(IR::SelectCase *elem)
override;
336 const IR::Node *postorder(IR::Annotation *annotation)
override;
338 Visitor::profile_t init_apply(
const IR::Node *node)
override;
339 void end_apply(
const IR::Node *Node)
override;
340 const IR::Node *apply_visitor(
const IR::Node *,
const char *name = 0)
override;
342 TypeInference *clone()
const override;
346 bool learn(
const IR::Node *node, Visitor *caller,
const Visitor::Context *ctxt);