let rec equal_type ?(check_qual = qual_dcare) ?(check_iqual = qual_dcare) t1 t2 = 
  match t1.ct_ty, t2.ct_ty with
    TvoidTvoid -> true
  | Tbuiltin bt1, Tbuiltin bt2 ->
      bt1 = bt2 && 
      check_qual t1 t2
  | Tpointer pt1, Tpointer pt2 ->
      equal_type ~check_qual:check_iqual ~check_iqual pt1 pt2
  | Tfunction (pt1,var1,rt1), Tfunction(pt2,var2,rt2) ->
      equal_type ~check_qual:qual_eq ~check_iqual:qual_eq rt1 rt2 &&
      var1 = var2 &&
      List.for_all2 (equal_type ~check_qual:qual_dcare ~check_iqual:qual_eq) pt1 pt2
  | Tarray(et1,Some sz1), Tarray(et2,Some sz2) ->
      eq_big_int sz1 sz2 && equal_type ~check_qual ~check_iqual et1 et2
  | Tarray(et1,None), Tarray(et2,None->
      equal_type ~check_qual ~check_iqual et1 et2
  | Tstruct(s1), Tstruct(s2) -> 
      check_qual t1 t2 &&
      s1 = s2 (* name-based equivalence *)
  | _ -> false