let rec equal_type ?(check_qual = qual_dcare) ?(check_iqual = qual_dcare) t1 t2 =
match t1.ct_ty, t2.ct_ty with
Tvoid, Tvoid -> 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
| _ -> false