+static bool enum_types_equal(const enum_type_t *type1,
+ const enum_type_t *type2)
+{
+ return type1->enume == type2->enume;
+}
+
+static bool typedef_types_equal(const typedef_type_t *type1,
+ const typedef_type_t *type2)
+{
+ return type1->typedefe == type2->typedefe;
+}
+
+static bool typeof_types_equal(const typeof_type_t *type1,
+ const typeof_type_t *type2)
+{
+ if (type1->expression != type2->expression)
+ return false;
+ if (type1->typeof_type != type2->typeof_type)
+ return false;
+
+ return true;
+}
+
+static bool bitfield_types_equal(const bitfield_type_t *type1,
+ const bitfield_type_t *type2)
+{
+ if (type1->base_type != type2->base_type)
+ return false;
+ /* TODO: compare size expression */
+ return false;
+}
+
+static bool types_equal(const type_t *type1, const type_t *type2)
+{
+ if (type1 == type2)
+ return true;
+ if (type1->kind != type2->kind)
+ return false;
+ if (type1->base.qualifiers != type2->base.qualifiers)
+ return false;
+ if (type1->base.modifiers != type2->base.modifiers)
+ return false;
+ if (type1->base.alignment != type2->base.alignment)
+ return false;
+
+ switch (type1->kind) {
+ case TYPE_ERROR:
+ /* Hmm, the error type is never equal */
+ return false;