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 (* everything assigned : nothing to do *)
         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)