X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=type.c;h=1ddba550517cc93b490e0033294b7f468297d9ee;hb=f972547895d0931b7d80a5e5f78d16b79230833b;hp=5134fd5335bb59c352cb02e205bff39739c2255c;hpb=a8cfcdb8260b73f249481b761b00df92e311787f;p=cparser diff --git a/type.c b/type.c index 5134fd5..1ddba55 100644 --- a/type.c +++ b/type.c @@ -621,7 +621,6 @@ static void print_typeof_type_pre(const typeof_type_t *const type) { fputs("typeof(", out); if (type->expression != NULL) { - assert(type->typeof_type == NULL); print_expression(type->expression); } else { print_type(type->typeof_type); @@ -803,6 +802,7 @@ type_t *duplicate_type(const type_t *type) type_t *copy = obstack_alloc(type_obst, size); memcpy(copy, type, size); + copy->base.firm_type = NULL; return copy; } @@ -823,12 +823,7 @@ type_t *get_unqualified_type(type_t *type) type_t *unqualified_type = duplicate_type(type); unqualified_type->base.qualifiers = TYPE_QUALIFIER_NONE; - type_t *result = typehash_insert(unqualified_type); - if (result != unqualified_type) { - obstack_free(type_obst, unqualified_type); - } - - return result; + return identify_new_type(unqualified_type); } type_t *get_qualified_type(type_t *orig_type, type_qualifiers_t const qual) @@ -856,11 +851,7 @@ type_t *get_qualified_type(type_t *orig_type, type_qualifiers_t const qual) return type; } - type = typehash_insert(copy); - if (type != copy) - obstack_free(type_obst, copy); - - return type; + return identify_new_type(copy); } /** @@ -1220,14 +1211,19 @@ type_t *skip_typeref(type_t *type) { type_qualifiers_t qualifiers = TYPE_QUALIFIER_NONE; type_modifiers_t modifiers = TYPE_MODIFIER_NONE; + il_alignment_t alignment = 0; while (true) { + if (alignment < type->base.alignment) + alignment = type->base.alignment; + switch (type->kind) { case TYPE_ERROR: return type; case TYPE_TYPEDEF: { qualifiers |= type->base.qualifiers; modifiers |= type->base.modifiers; + const typedef_type_t *typedef_type = &type->typedeft; if (typedef_type->resolved_type != NULL) { type = typedef_type->resolved_type; @@ -1237,6 +1233,9 @@ type_t *skip_typeref(type_t *type) continue; } case TYPE_TYPEOF: { + qualifiers |= type->base.qualifiers; + modifiers |= type->base.modifiers; + const typeof_type_t *typeof_type = &type->typeoft; if (typeof_type->typeof_type != NULL) { type = typeof_type->typeof_type; @@ -1251,7 +1250,9 @@ type_t *skip_typeref(type_t *type) break; } - if (qualifiers != TYPE_QUALIFIER_NONE || modifiers != TYPE_MODIFIER_NONE) { + if (qualifiers != TYPE_QUALIFIER_NONE || + modifiers != TYPE_MODIFIER_NONE || + alignment > type->base.alignment) { type_t *const copy = duplicate_type(type); /* for const with typedefed array type the element type has to be @@ -1261,16 +1262,15 @@ type_t *skip_typeref(type_t *type) element_type = duplicate_type(element_type); element_type->base.qualifiers |= qualifiers; element_type->base.modifiers |= modifiers; + element_type->base.alignment = alignment; copy->array.element_type = element_type; } else { copy->base.qualifiers |= qualifiers; copy->base.modifiers |= modifiers; + copy->base.alignment = alignment; } - type = typehash_insert(copy); - if (type != copy) { - obstack_free(type_obst, copy); - } + type = identify_new_type(copy); } return type; @@ -1410,7 +1410,7 @@ atomic_type_kind_t find_unsigned_int_atomic_type_kind_for_size(unsigned size) { * Hash the given type and return the "singleton" version * of it. */ -static type_t *identify_new_type(type_t *type) +type_t *identify_new_type(type_t *type) { type_t *result = typehash_insert(type); if (result != type) {