Module type BaseInvariant.Eval

module D : Lattice.S
module G : Lattice.S
val unop_ID : GoblintCil.Cil.unop -> ID.t -> ID.t
val unop_FD : GoblintCil.Cil.unop -> FD.t -> VD.t
val eval_rv : ctx:(D.t, G.t, _, V.t) Analyses.ctx -> D.t -> GoblintCil.exp -> VD.t
val eval_rv_address : ctx:(D.t, G.t, _, V.t) Analyses.ctx -> D.t -> GoblintCil.exp -> VD.t
val eval_lv : ctx:(D.t, G.t, _, V.t) Analyses.ctx -> D.t -> GoblintCil.lval -> AD.t
val convert_offset : ctx:(D.t, G.t, _, V.t) Analyses.ctx -> D.t -> GoblintCil.offset -> ID.t Offset.t
val get_var : ctx:(D.t, G.t, _, V.t) Analyses.ctx -> D.t -> GoblintCil.varinfo -> VD.t
val get : ctx:(D.t, G.t, _, V.t) Analyses.ctx -> D.t -> AD.t -> GoblintCil.exp option -> VD.t
val set : ctx:(D.t, G.t, _, V.t) Analyses.ctx -> D.t -> AD.t -> GoblintCil.typ -> ?lval_raw:GoblintCil.lval -> VD.t -> D.t
val refine_entire_var : bool
val map_oldval : VD.t -> GoblintCil.typ -> VD.t
val eval_rv_lval_refine : ctx:(D.t, G.t, _, V.t) Analyses.ctx -> D.t -> GoblintCil.exp -> GoblintCil.lval -> VD.t
val id_meet_down : old:ID.t -> c:ID.t -> ID.t
val fd_meet_down : old:FD.t -> c:FD.t -> FD.t
val contra : D.t -> D.t

Handle contradiction.

Normal branch refinement just raises Analyses.Deadcode. Unassume leaves unchanged.