method vlogic_var_decl lv =
    if not (LogicVarHashtbl.mem lvar_to_strawlvar lv) &&
      app_term_type isArrayType false lv.lv_type then
      begin
        LogicVarHashtbl.add lvar_to_array_type lv
          (force_app_term_type (fun x -> x) lv.lv_type);
        let elemty = force_app_term_type element_type lv.lv_type in
        lvarset := LogicVarSet.add lv !lvarset;
        let newty =
          if force_app_term_type array_size lv.lv_type > 0L then
            begin
              let size =
                constant_expr (force_app_term_type array_size lv.lv_type)
              in alloclvarset := LogicVarSet.add lv !alloclvarset;
              mkTRefArray(elemty,size,[])
            end
          else TPtr(elemty,[])
        in attach_globaction (fun () -> lv.lv_type <- Ctype newty);
        let strawlv = match lv.lv_origin with
            None -> make_temp_logic_var (Ctype newty)
          | Some v -> cvar_to_lvar (VarinfoHashtbl.find var_to_strawvar v)
        in
        LogicVarHashtbl.add lvar_to_strawlvar lv strawlv;
        LogicVarHashtbl.add strawlvar_to_lvar strawlv lv
      end;
      DoChildren