let assigns_to_zone_inputs_state state assigns =
  try
    let treat_one_zone acc (_,ins) =
      if ins = [] then raise Top_input;
      List.fold_left
        (fun acc term ->
          let loc_ins =
            !Db.Properties.Interp.identified_term_zone_to_loc ~result:None
              state
              term
          in
          Zone.join
            acc
            (Locations.valid_enumerate_bits loc_ins))
        acc
        ins
    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
  | Invalid_argument "not an lvalue" ->
      CilE.warn_once "Failed to interpret assigns clause in inputs";
       Zone.top