* credit to Christian Biere.
  */
 #define __type_half_max(type) ((type)1 << (8*sizeof(type) - 1 - is_signed_type(type)))
-#define type_max(T) ((T)((__type_half_max(T) - 1) + __type_half_max(T)))
-#define type_min(T) ((T)((T)-type_max(T)-(T)1))
+#define __type_max(T) ((T)((__type_half_max(T) - 1) + __type_half_max(T)))
+#define type_max(t)    __type_max(typeof(t))
+#define __type_min(T) ((T)((T)-type_max(T)-(T)1))
+#define type_min(t)    __type_min(typeof(t))
 
 /*
  * Avoids triggering -Wtype-limits compilation warning,
 
 #define __overflows_type_constexpr(x, T) (                     \
        is_unsigned_type(typeof(x)) ?                           \
-               (x) > type_max(typeof(T)) :                     \
+               (x) > type_max(T) :                             \
        is_unsigned_type(typeof(T)) ?                           \
-               (x) < 0 || (x) > type_max(typeof(T)) :          \
-       (x) < type_min(typeof(T)) || (x) > type_max(typeof(T)))
+               (x) < 0 || (x) > type_max(T) :                  \
+       (x) < type_min(T) || (x) > type_max(T))
 
 #define __overflows_type(x, T)         ({      \
        typeof(T) v = 0;                        \