82    std::shared_ptr<MinimalNameGenerator> nameGen;
 
   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);
 
  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,
 
  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,
 
  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;
 
  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;