let assigns_to_zone_inputs_state state assigns =
  try
    let treat_one_zone acc (_,ins) =
      match ins with
          [] -> raise Top_input
        | ins ->
            (try
               List.fold_left
                 (fun acc loc ->
                    let clocs = match loc with
                        Location loc ->
                          !Db.Properties.Interp.loc_to_lval loc.it_content
                      | Nothing -> []
                    in
                    List.fold_left
                      (fun acc cin ->
                         Zone.join acc
                           (!Db.Value.lval_to_zone_state state cin))
                      acc clocs)
                 acc ins
             with Invalid_argument "not a lvalue" ->
               CilE.warn_once "Can not interpret assigns clause; Ignoring.";
               raise Top_input)
    in
    match assigns with
        [] -> Zone.bottom (*VP This corresponds to the old code (v1.9)
                              Not sure this is what we really want, though.
                             *)

      | [Nothing,_] -> Zone.bottom
      | _ -> List.fold_left treat_one_zone Zone.bottom assigns
  with Top_input -> Zone.top