sig
  module type S =
    sig
      type value
      type location
      type offset
      val equal_loc :
        Abstract_location.S.location -> Abstract_location.S.location -> bool
      val equal_offset :
        Abstract_location.S.offset -> Abstract_location.S.offset -> bool
      val pretty_loc :
        Format.formatter -> Abstract_location.S.location -> unit
      val pretty_offset :
        Format.formatter -> Abstract_location.S.offset -> unit
      val to_value :
        Abstract_location.S.location -> Abstract_location.S.value
      val size : Abstract_location.S.location -> Int_Base.t
      val partially_overlap :
        Abstract_location.S.location -> Abstract_location.S.location -> bool
      val check_non_overlapping :
        (Cil_types.lval * Abstract_location.S.location) list ->
        (Cil_types.lval * Abstract_location.S.location) list ->
        unit Eval.evaluated
      val offset_cardinal_zero_or_one : Abstract_location.S.offset -> bool
      val no_offset : Abstract_location.S.offset
      val forward_field :
        Cil_types.typ ->
        Cil_types.fieldinfo ->
        Abstract_location.S.offset -> Abstract_location.S.offset
      val forward_index :
        Cil_types.typ ->
        Abstract_location.S.value ->
        Abstract_location.S.offset -> Abstract_location.S.offset
      val reduce_index_by_array_size :
        size_expr:Cil_types.exp ->
        index_expr:Cil_types.exp ->
        Integer.t ->
        Abstract_location.S.value -> Abstract_location.S.value Eval.evaluated
      val forward_variable :
        Cil_types.typ ->
        Cil_types.varinfo ->
        Abstract_location.S.offset ->
        Abstract_location.S.location Eval.or_bottom
      val forward_pointer :
        Cil_types.typ ->
        Abstract_location.S.value ->
        Abstract_location.S.offset ->
        Abstract_location.S.location Eval.or_bottom
      val eval_varinfo : Cil_types.varinfo -> Abstract_location.S.location
      val reduce_loc_by_validity :
        for_writing:bool ->
        bitfield:bool ->
        Cil_types.lval ->
        Abstract_location.S.location ->
        Abstract_location.S.location Eval.evaluated
      val backward_variable :
        Cil_types.varinfo ->
        Abstract_location.S.location ->
        Abstract_location.S.offset Eval.or_bottom
      val backward_pointer :
        Abstract_location.S.value ->
        Abstract_location.S.offset ->
        Abstract_location.S.location ->
        (Abstract_location.S.value * Abstract_location.S.offset)
        Eval.or_bottom
      val backward_field :
        Cil_types.typ ->
        Cil_types.fieldinfo ->
        Abstract_location.S.offset ->
        Abstract_location.S.offset Eval.or_bottom
      val backward_index :
        Cil_types.typ ->
        index:Abstract_location.S.value ->
        remaining:Abstract_location.S.offset ->
        Abstract_location.S.offset ->
        (Abstract_location.S.value * Abstract_location.S.offset)
        Eval.or_bottom
    end
  type 'a key = 'Structure.Key_Location.k
  type 'a structure = 'Structure.Key_Location.structure
  module type Internal =
    sig
      type value
      type location
      type offset
      val equal_loc : location -> location -> bool
      val equal_offset : offset -> offset -> bool
      val pretty_loc : Format.formatter -> location -> unit
      val pretty_offset : Format.formatter -> offset -> unit
      val to_value : location -> value
      val size : location -> Int_Base.t
      val partially_overlap : location -> location -> bool
      val check_non_overlapping :
        (Cil_types.lval * location) list ->
        (Cil_types.lval * location) list -> unit Eval.evaluated
      val offset_cardinal_zero_or_one : offset -> bool
      val no_offset : offset
      val forward_field :
        Cil_types.typ -> Cil_types.fieldinfo -> offset -> offset
      val forward_index : Cil_types.typ -> value -> offset -> offset
      val reduce_index_by_array_size :
        size_expr:Cil_types.exp ->
        index_expr:Cil_types.exp ->
        Integer.t -> value -> value Eval.evaluated
      val forward_variable :
        Cil_types.typ ->
        Cil_types.varinfo -> offset -> location Eval.or_bottom
      val forward_pointer :
        Cil_types.typ -> value -> offset -> location Eval.or_bottom
      val eval_varinfo : Cil_types.varinfo -> location
      val reduce_loc_by_validity :
        for_writing:bool ->
        bitfield:bool ->
        Cil_types.lval -> location -> location Eval.evaluated
      val backward_variable :
        Cil_types.varinfo -> location -> offset Eval.or_bottom
      val backward_pointer :
        value -> offset -> location -> (value * offset) Eval.or_bottom
      val backward_field :
        Cil_types.typ ->
        Cil_types.fieldinfo -> offset -> offset Eval.or_bottom
      val backward_index :
        Cil_types.typ ->
        index:value ->
        remaining:offset -> offset -> (value * offset) Eval.or_bottom
      val structure : location Abstract_location.structure
    end
  module type External =
    sig
      type value
      type location
      type offset
      val equal_loc : location -> location -> bool
      val equal_offset : offset -> offset -> bool
      val pretty_loc : Format.formatter -> location -> unit
      val pretty_offset : Format.formatter -> offset -> unit
      val to_value : location -> value
      val size : location -> Int_Base.t
      val partially_overlap : location -> location -> bool
      val check_non_overlapping :
        (Cil_types.lval * location) list ->
        (Cil_types.lval * location) list -> unit Eval.evaluated
      val offset_cardinal_zero_or_one : offset -> bool
      val no_offset : offset
      val forward_field :
        Cil_types.typ -> Cil_types.fieldinfo -> offset -> offset
      val forward_index : Cil_types.typ -> value -> offset -> offset
      val reduce_index_by_array_size :
        size_expr:Cil_types.exp ->
        index_expr:Cil_types.exp ->
        Integer.t -> value -> value Eval.evaluated
      val forward_variable :
        Cil_types.typ ->
        Cil_types.varinfo -> offset -> location Eval.or_bottom
      val forward_pointer :
        Cil_types.typ -> value -> offset -> location Eval.or_bottom
      val eval_varinfo : Cil_types.varinfo -> location
      val reduce_loc_by_validity :
        for_writing:bool ->
        bitfield:bool ->
        Cil_types.lval -> location -> location Eval.evaluated
      val backward_variable :
        Cil_types.varinfo -> location -> offset Eval.or_bottom
      val backward_pointer :
        value -> offset -> location -> (value * offset) Eval.or_bottom
      val backward_field :
        Cil_types.typ ->
        Cil_types.fieldinfo -> offset -> offset Eval.or_bottom
      val backward_index :
        Cil_types.typ ->
        index:value ->
        remaining:offset -> offset -> (value * offset) Eval.or_bottom
      val mem : 'a key -> bool
      val get : 'a key -> (location -> 'a) option
      val set : 'a key -> '-> location -> location
    end
end