let add_effect_assigns env pid label kind assigned wp =
let from = Clabels.c_label label in
let goal = ref NoAssigns in
on_context env "add_assigns" wp Keep_opened (Goal_assigns goal)
(fun env _noassigns _prop ->
try
let asgns = assigned_for_assigns_goal kind from env assigned in
let ze = D.fresh "ze" (Formula.Model WpModel.tau_of_dzone) in
let zx = D.fresh "zx" (Formula.Model WpModel.tau_of_dzone) in
let mem = L.mem_at env from in
let zs = List.fold_left
(fun zs a ->
let zx = WpModel.dzone_assigned mem a in
WpModel.dzone_union zs zx)
(F.var zx) asgns
in
goal := EffectAssigns {
a_pid = pid ;
a_label = from ;
a_effect = ze ;
a_locals = zx ;
} ;
WpModel.dzone_subset (F.var ze) zs
with e ->
let (source,reason) = Wp_error.protect e in
Datalib.Collector.add_warning
~severe:true ~source ~reason
"Goal for %a can not be translated"
WpPropId.pretty pid ;
F.p_false)