let rec visit_exp_in_data do_sub_data do_exp acc d =
  let do_path acc ch = visit_path do_exp acc ch in
  let do_exp_opt acc e = match e with None -> acc | Some e -> do_exp acc e in
  let frec acc d = visit_exp_in_data do_sub_data do_exp (do_sub_data acc d) d in
    match d with
      | D1null | D1addr _ | D1var _ -> acc
      | D1base e -> frec acc e
      | D1indir e -> frec acc e
      | D1proj (e, ch) -> let acc = frec acc e in do_path acc ch
      | D1depl (e, ch) -> let acc = frec acc e in do_path acc ch
      | D1shift (e, i) -> let acc = frec acc e in do_exp acc i
      | D1mu (e, ch, x) ->
          let acc = frec acc e in let acc = do_path acc ch in do_exp_opt acc x
      | D1muRange (e, x) -> let acc = frec acc e in do_exp acc x
      | D1muI (e, None, x) -> let acc = frec acc e in do_exp_opt acc x
      | D1muI (e, Some i, x) -> 
          let acc = frec acc e in let acc = do_exp acc i in do_exp_opt acc x
      | D1muIrange (e, x) -> let acc = frec acc e in do_exp acc x