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