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 }