+bool is_type_signed(const type_t *type)
+{
+ /* enum types are int for now */
+ if(type->type == TYPE_ENUM)
+ return true;
+
+ if(type->type != TYPE_ATOMIC)
+ return false;
+
+ atomic_type_t *atomic_type = (atomic_type_t*) type;
+ switch(atomic_type->atype) {
+ case ATOMIC_TYPE_CHAR:
+ case ATOMIC_TYPE_SCHAR:
+ case ATOMIC_TYPE_SHORT:
+ case ATOMIC_TYPE_INT:
+ case ATOMIC_TYPE_LONG:
+ case ATOMIC_TYPE_LONGLONG:
+ case ATOMIC_TYPE_FLOAT:
+ case ATOMIC_TYPE_DOUBLE:
+ case ATOMIC_TYPE_LONG_DOUBLE:
+#ifdef PROVIDE_COMPLEX
+ case ATOMIC_TYPE_FLOAT_COMPLEX:
+ case ATOMIC_TYPE_DOUBLE_COMPLEX:
+ case ATOMIC_TYPE_LONG_DOUBLE_COMPLEX:
+#endif
+#ifdef PROVIDE_IMAGINARY
+ case ATOMIC_TYPE_FLOAT_IMAGINARY:
+ case ATOMIC_TYPE_DOUBLE_IMAGINARY:
+ case ATOMIC_TYPE_LONG_DOUBLE_IMAGINARY:
+#endif
+ return true;
+
+ case ATOMIC_TYPE_BOOL:
+ case ATOMIC_TYPE_UCHAR:
+ case ATOMIC_TYPE_USHORT:
+ case ATOMIC_TYPE_UINT:
+ case ATOMIC_TYPE_ULONG:
+ case ATOMIC_TYPE_ULONGLONG:
+ return false;
+
+ case ATOMIC_TYPE_INVALID:
+ case ATOMIC_TYPE_VOID:
+ return false;
+ }
+
+ panic("invalid atomic type found");
+ return false;
+}
+