let rec convert_type t =
  let new_ty = 
    match t.ct_ty with
      Tarray(t1,sz1) -> begin
        match convert_type t1 with
          { ct_ty = Tarray(t2,sz2) } ->
            let new_size = 
              match sz1, sz2 with
                Some x, Some y -> Some (mult_big_int x y)
              | _ -> None
            in
            Tarray(t2,new_size)
        | t2 ->
            Tarray(t2,sz1)
      end
    | Tbuiltin _ | Tvoid | Tstruct _ -> t.ct_ty
    | Tfunction(at,f,rt) ->
        Tfunction(List.map convert_type at, f, convert_type rt)
    | Tpointer(t) ->
        let t = convert_type t in
        Tpointer(
        match t.ct_ty with
          Tarray(t1,sz1) -> t1
        | _ -> t)
  in
  { t with ct_ty = new_ty }