sig
  val is_bitfield : Cil_types.typ -> bool
  val sizeof_lval_typ : Cil_types.typ -> Int_Base.t
  val offsetmap_matches_type : Cil_types.typ -> Cvalue.V_Offsetmap.t -> bool
  val need_cast : Cil_types.typ -> Cil_types.typ -> bool
  type fct_pointer_compatibility =
      Compatible
    | Incompatible
    | Incompatible_but_accepted
  val compatible_functions :
    typ_pointed:Cil_types.typ ->
    typ_fun:Cil_types.typ -> Eval_typ.fct_pointer_compatibility
  val resolve_functions :
    typ_pointer:Cil_types.typ ->
    Cvalue.V.t -> Kernel_function.Hptset.t Eval.or_top * bool
  val expr_contains_volatile : Cil_types.exp -> bool
  val lval_contains_volatile : Cil_types.lval -> bool
  val kf_assigns_only_result_or_volatile : Cil_types.kernel_function -> bool
  type integer_range = { i_bits : int; i_signed : bool; }
  module DatatypeIntegerRange :
    sig
      type t = integer_range
      val ty : t Type.t
      val name : string
      val descr : t Descr.t
      val packed_descr : Structural_descr.pack
      val reprs : t list
      val equal : t -> t -> bool
      val compare : t -> t -> int
      val hash : t -> int
      val pretty_code : Format.formatter -> t -> unit
      val internal_pretty_code :
        Type.precedence -> Format.formatter -> t -> unit
      val pretty : Format.formatter -> t -> unit
      val varname : t -> string
      val mem_project : (Project_skeleton.t -> bool) -> t -> bool
      val copy : t -> t
    end
  val ik_range : Cil_types.ikind -> Eval_typ.integer_range
  val ik_attrs_range :
    Cil_types.ikind -> Cil_types.attributes -> Eval_typ.integer_range
  val range_inclusion :
    Eval_typ.integer_range -> Eval_typ.integer_range -> bool * bool
  val range_lower_bound : Eval_typ.integer_range -> Integer.t
  val range_upper_bound : Eval_typ.integer_range -> Integer.t
  type scalar_typ =
      TSInt of Eval_typ.integer_range
    | TSPtr of Eval_typ.integer_range
    | TSFloat of Cil_types.fkind
    | TSNotScalar
  val classify_as_scalar : Cil_types.typ -> Eval_typ.scalar_typ
end