let visit_expr self expr = 
  let body = match expr.expr_t with
    CTTexpComma(e1,e2) -> 
      let e1 = self e1 in
      let e2 = self e2 in
      CTTexpComma(e1, e2)
  | CTTexpAssign(e1,e2) ->
      let e1 = self e1 in
      let e2 = self e2 in
      CTTexpAssign(e1, e2)
  | CTTexpBinAssign(binop,e1,t_cast,e2) ->
      let e1 = self e1 in
      let e2 = self e2 in
      CTTexpBinAssign(binop, e1, t_cast, e2)
  | CTTexpConditional(e1,e2,e3) ->
      let e1 = self e1 in
      let e2 = self e2 in
      let e3 = self e3 in
      CTTexpConditional(e1, e2, e3)
  | CTTexpBinExpr(binop,e1,e2) ->
      let e1 = self e1 in
      let e2 = self e2 in
      CTTexpBinExpr(binop, e1, e2)
  | CTTexpCoerce(t,e1) -> CTTexpCoerce(t,self e1)
  | CTTexpUnaryExpr(uop,e1) -> CTTexpUnaryExpr(uop,self e1)
  | CTTexpAddress(e1) -> CTTexpAddress(self e1)
  | CTTexpPtrDeref(e1) -> CTTexpPtrDeref(self e1)
  | CTTexpInvoke(e1,es) ->
      let e1 = self e1 in
      let es = list_map_ordered self es in
      CTTexpInvoke(e1, es)
  | CTTexpField(e1,id) -> CTTexpField(self e1,id)
  | CTTexpConstant(_) | CTTexpVar(_) -> expr.expr_t
  in
  { expr with expr_t = body }