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 ->
if assigned = [] then prop
else
try
let asgns = assigned_for_assigns_goal kind from env assigned in
let ze = D.fresh "ze" (Mdata.Vmodel WpModel.tau_of_dzone) in
let zx = D.fresh "zx" (Mdata.Vmodel WpModel.tau_of_dzone) in
let zs = List.fold_left
(fun zs a ->
let zx = WpModel.dzone_assigned 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 %a can not be translated"
WpAnnot.pp_id pid ;
F.p_false)