sig
  type cabsloc = { lineno : int; filename : string; byteno : int; }
  type lang_t = [ `C | `Cxx ]
  type typeSpecifier =
      Tvoid
    | Tbool
    | Tchar
    | Tshort
    | Tint
    | Tlong
    | Tint64
    | Tfloat
    | Tdouble
    | Tsigned
    | Tunsigned
    | Tcomplex
    | Timaginary
    | Tnamed of string
    | Tstruct of string * Flx_cil_cabs.field_group list option *
        Flx_cil_cabs.attribute list
    | Tunion of string * Flx_cil_cabs.field_group list option *
        Flx_cil_cabs.attribute list
    | Tenum of string * Flx_cil_cabs.enum_item list option *
        Flx_cil_cabs.attribute list
    | TtypeofE of Flx_cil_cabs.expression
    | TtypeofT of Flx_cil_cabs.specifier * Flx_cil_cabs.decl_type
  and storage = NO_STORAGE | AUTO | STATIC | EXTERN | REGISTER
  and funspec = INLINE | VIRTUAL | EXPLICIT
  and cvspec = CV_CONST | CV_VOLATILE | CV_RESTRICT
  and spec_elem =
      SpecTypedef
    | SpecCV of Flx_cil_cabs.cvspec
    | SpecAttr of Flx_cil_cabs.attribute
    | SpecStorage of Flx_cil_cabs.storage
    | SpecInline
    | SpecType of Flx_cil_cabs.typeSpecifier
    | SpecPattern of string
  and specifier = Flx_cil_cabs.spec_elem list
  and decl_type =
      JUSTBASE
    | PARENTYPE of Flx_cil_cabs.attribute list * Flx_cil_cabs.decl_type *
        Flx_cil_cabs.attribute list
    | ARRAY of Flx_cil_cabs.decl_type * Flx_cil_cabs.attribute list *
        Flx_cil_cabs.expression
    | PTR of Flx_cil_cabs.attribute list * Flx_cil_cabs.decl_type
    | PROTO of Flx_cil_cabs.decl_type * Flx_cil_cabs.single_name list * bool
  and name_group = Flx_cil_cabs.specifier * Flx_cil_cabs.name list
  and field_group =
      Flx_cil_cabs.specifier *
      (Flx_cil_cabs.name * Flx_cil_cabs.expression option) list
  and init_name_group = Flx_cil_cabs.specifier * Flx_cil_cabs.init_name list
  and name =
      string * Flx_cil_cabs.decl_type * Flx_cil_cabs.attribute list *
      Flx_cil_cabs.cabsloc
  and init_name = Flx_cil_cabs.name * Flx_cil_cabs.init_expression
  and single_name = Flx_cil_cabs.specifier * Flx_cil_cabs.name
  and enum_item = string * Flx_cil_cabs.expression * Flx_cil_cabs.cabsloc
  and base_spec =
      [ `Private of string
      | `Private_virtual of string
      | `Protected of string
      | `Protected_virtual of string
      | `Public of string
      | `Public_virtual of string ]
  and definition =
      FUNDEF of Flx_cil_cabs.single_name * Flx_cil_cabs.block *
        Flx_cil_cabs.cabsloc * Flx_cil_cabs.cabsloc
    | DECDEF of Flx_cil_cabs.init_name_group * Flx_cil_cabs.cabsloc
    | TYPEDEF of Flx_cil_cabs.name_group * Flx_cil_cabs.cabsloc
    | ONLYTYPEDEF of Flx_cil_cabs.specifier * Flx_cil_cabs.cabsloc
    | GLOBASM of string * Flx_cil_cabs.cabsloc
    | PRAGMA of Flx_cil_cabs.expression * Flx_cil_cabs.cabsloc
    | LINKAGE of string * Flx_cil_cabs.cabsloc * Flx_cil_cabs.definition list
    | NAMESPACE of string * Flx_cil_cabs.cabsloc *
        Flx_cil_cabs.definition list
    | TRANSFORMER of Flx_cil_cabs.definition * Flx_cil_cabs.definition list *
        Flx_cil_cabs.cabsloc
    | EXPRTRANSFORMER of Flx_cil_cabs.expression * Flx_cil_cabs.expression *
        Flx_cil_cabs.cabsloc
  and file = string * Flx_cil_cabs.definition list
  and block = {
    blabels : string list;
    battrs : Flx_cil_cabs.attribute list;
    bstmts : Flx_cil_cabs.statement list;
  }
  and statement =
      NOP of Flx_cil_cabs.cabsloc
    | COMPUTATION of Flx_cil_cabs.expression * Flx_cil_cabs.cabsloc
    | BLOCK of Flx_cil_cabs.block * Flx_cil_cabs.cabsloc
    | SEQUENCE of Flx_cil_cabs.statement * Flx_cil_cabs.statement *
        Flx_cil_cabs.cabsloc
    | IF of Flx_cil_cabs.expression * Flx_cil_cabs.statement *
        Flx_cil_cabs.statement * Flx_cil_cabs.cabsloc
    | WHILE of Flx_cil_cabs.expression * Flx_cil_cabs.statement *
        Flx_cil_cabs.cabsloc
    | DOWHILE of Flx_cil_cabs.expression * Flx_cil_cabs.statement *
        Flx_cil_cabs.cabsloc
    | FOR of Flx_cil_cabs.for_clause * Flx_cil_cabs.expression *
        Flx_cil_cabs.expression * Flx_cil_cabs.statement *
        Flx_cil_cabs.cabsloc
    | BREAK of Flx_cil_cabs.cabsloc
    | CONTINUE of Flx_cil_cabs.cabsloc
    | RETURN of Flx_cil_cabs.expression * Flx_cil_cabs.cabsloc
    | SWITCH of Flx_cil_cabs.expression * Flx_cil_cabs.statement *
        Flx_cil_cabs.cabsloc
    | CASE of Flx_cil_cabs.expression * Flx_cil_cabs.statement *
        Flx_cil_cabs.cabsloc
    | CASERANGE of Flx_cil_cabs.expression * Flx_cil_cabs.expression *
        Flx_cil_cabs.statement * Flx_cil_cabs.cabsloc
    | DEFAULT of Flx_cil_cabs.statement * Flx_cil_cabs.cabsloc
    | LABEL of string * Flx_cil_cabs.statement * Flx_cil_cabs.cabsloc
    | GOTO of string * Flx_cil_cabs.cabsloc
    | COMPGOTO of Flx_cil_cabs.expression * Flx_cil_cabs.cabsloc
    | DEFINITION of Flx_cil_cabs.definition
    | ASM of Flx_cil_cabs.attribute list * string list *
        (string * Flx_cil_cabs.expression) list *
        (string * Flx_cil_cabs.expression) list * string list *
        Flx_cil_cabs.cabsloc
    | TRY_EXCEPT of Flx_cil_cabs.block * Flx_cil_cabs.expression *
        Flx_cil_cabs.block * Flx_cil_cabs.cabsloc
    | TRY_FINALLY of Flx_cil_cabs.block * Flx_cil_cabs.block *
        Flx_cil_cabs.cabsloc
  and for_clause =
      FC_EXP of Flx_cil_cabs.expression
    | FC_DECL of Flx_cil_cabs.definition
  and binary_operator =
      ADD
    | SUB
    | MUL
    | DIV
    | MOD
    | AND
    | OR
    | BAND
    | BOR
    | XOR
    | SHL
    | SHR
    | EQ
    | NE
    | LT
    | GT
    | LE
    | GE
    | ASSIGN
    | ADD_ASSIGN
    | SUB_ASSIGN
    | MUL_ASSIGN
    | DIV_ASSIGN
    | MOD_ASSIGN
    | BAND_ASSIGN
    | BOR_ASSIGN
    | XOR_ASSIGN
    | SHL_ASSIGN
    | SHR_ASSIGN
  and unary_operator =
      MINUS
    | PLUS
    | NOT
    | BNOT
    | MEMOF
    | ADDROF
    | PREINCR
    | PREDECR
    | POSINCR
    | POSDECR
  and expression =
      NOTHING
    | UNARY of Flx_cil_cabs.unary_operator * Flx_cil_cabs.expression
    | LABELADDR of string
    | BINARY of Flx_cil_cabs.binary_operator * Flx_cil_cabs.expression *
        Flx_cil_cabs.expression
    | QUESTION of Flx_cil_cabs.expression * Flx_cil_cabs.expression *
        Flx_cil_cabs.expression
    | CAST of (Flx_cil_cabs.specifier * Flx_cil_cabs.decl_type) *
        Flx_cil_cabs.init_expression
    | CALL of Flx_cil_cabs.expression * Flx_cil_cabs.expression list
    | COMMA of Flx_cil_cabs.expression list
    | CONSTANT of Flx_cil_cabs.constant
    | VARIABLE of string
    | EXPR_SIZEOF of Flx_cil_cabs.expression
    | TYPE_SIZEOF of Flx_cil_cabs.specifier * Flx_cil_cabs.decl_type
    | EXPR_ALIGNOF of Flx_cil_cabs.expression
    | TYPE_ALIGNOF of Flx_cil_cabs.specifier * Flx_cil_cabs.decl_type
    | INDEX of Flx_cil_cabs.expression * Flx_cil_cabs.expression
    | MEMBEROF of Flx_cil_cabs.expression * string
    | MEMBEROFPTR of Flx_cil_cabs.expression * string
    | GNU_BODY of Flx_cil_cabs.block
    | EXPR_PATTERN of string
  and constant =
      CONST_INT of string
    | CONST_FLOAT of string
    | CONST_CHAR of int64 list
    | CONST_WCHAR of int64 list
    | CONST_STRING of string
    | CONST_WSTRING of int64 list
  and init_expression =
      NO_INIT
    | SINGLE_INIT of Flx_cil_cabs.expression
    | COMPOUND_INIT of
        (Flx_cil_cabs.initwhat * Flx_cil_cabs.init_expression) list
  and initwhat =
      NEXT_INIT
    | INFIELD_INIT of string * Flx_cil_cabs.initwhat
    | ATINDEX_INIT of Flx_cil_cabs.expression * Flx_cil_cabs.initwhat
    | ATINDEXRANGE_INIT of Flx_cil_cabs.expression * Flx_cil_cabs.expression
  and attribute = string * Flx_cil_cabs.expression list
end