diff options
Diffstat (limited to 'src/types.cpp')
| -rw-r--r-- | src/types.cpp | 60 |
1 files changed, 27 insertions, 33 deletions
diff --git a/src/types.cpp b/src/types.cpp index 360b9ed15..e7f183e79 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -146,6 +146,7 @@ struct TypeStruct { bool c_vararg; \ bool is_polymorphic; \ bool is_poly_specialized; \ + isize specialization_count; \ ProcCallingConvention calling_convention; \ }) \ TYPE_KIND(Map, struct { \ @@ -873,6 +874,11 @@ bool is_type_untyped_undef(Type *t) { } +bool is_type_empty_union(Type *t) { + t = base_type(t); + return t->kind == Type_Union && t->Union.variants.count == 0; +} + bool is_type_valid_for_keys(Type *t) { t = core_type(t); @@ -1822,6 +1828,9 @@ i64 type_align_of_internal(gbAllocator allocator, Type *t, TypePath *path) { return type_align_of_internal(allocator, t->Enum.base_type, path); case Type_Union: { + if (t->Union.variants.count == 0) { + return 1; + } i64 max = build_context.word_size; for_array(i, t->Union.variants) { Type *variant = t->Union.variants[i]; @@ -2056,6 +2065,9 @@ i64 type_size_of_internal(gbAllocator allocator, Type *t, TypePath *path) { return type_size_of_internal(allocator, t->Enum.base_type, path); case Type_Union: { + if (t->Union.variants.count == 0) { + return 0; + } i64 align = type_align_of_internal(allocator, t, path); if (path->failure) { return FAILURE_SIZE; @@ -2294,7 +2306,7 @@ gbString write_type_to_string(gbString str, Type *type) { break; case Type_Union: - str = gb_string_appendc(str, "union{"); + str = gb_string_appendc(str, "union {"); for_array(i, type->Union.variants) { Type *t = type->Union.variants[i]; if (i > 0) str = gb_string_appendc(str, ", "); @@ -2304,40 +2316,22 @@ gbString write_type_to_string(gbString str, Type *type) { break; case Type_Struct: { - if (type->Struct.is_raw_union) { - str = gb_string_appendc(str, "raw_union{"); - for_array(i, type->Struct.fields) { - Entity *f = type->Struct.fields[i]; - GB_ASSERT(f->kind == Entity_Variable); - if (i > 0) { - str = gb_string_appendc(str, ", "); - } - str = gb_string_append_length(str, f->token.string.text, f->token.string.len); - str = gb_string_appendc(str, ": "); - str = write_type_to_string(str, f->type); - } - str = gb_string_appendc(str, "}"); - } else { str = gb_string_appendc(str, "struct"); - if (type->Struct.is_packed) { - str = gb_string_appendc(str, " #packed"); - } - if (type->Struct.is_ordered) { - str = gb_string_appendc(str, " #ordered"); - } - str = gb_string_appendc(str, " {"); - for_array(i, type->Struct.fields) { - Entity *f = type->Struct.fields[i]; - GB_ASSERT(f->kind == Entity_Variable); - if (i > 0) { - str = gb_string_appendc(str, ", "); - } - str = gb_string_append_length(str, f->token.string.text, f->token.string.len); - str = gb_string_appendc(str, ": "); - str = write_type_to_string(str, f->type); + if (type->Struct.is_packed) str = gb_string_appendc(str, " #packed"); + if (type->Struct.is_ordered) str = gb_string_appendc(str, " #ordered"); + if (type->Struct.is_raw_union) str = gb_string_appendc(str, " #raw_union"); + str = gb_string_appendc(str, " {"); + for_array(i, type->Struct.fields) { + Entity *f = type->Struct.fields[i]; + GB_ASSERT(f->kind == Entity_Variable); + if (i > 0) { + str = gb_string_appendc(str, ", "); } - str = gb_string_appendc(str, "}"); + str = gb_string_append_length(str, f->token.string.text, f->token.string.len); + str = gb_string_appendc(str, ": "); + str = write_type_to_string(str, f->type); } + str = gb_string_appendc(str, "}"); } break; case Type_Map: { @@ -2373,7 +2367,7 @@ gbString write_type_to_string(gbString str, Type *type) { } if (var->flags&EntityFlag_Ellipsis) { Type *slice = base_type(var->type); - str = gb_string_appendc(str, ".."); + str = gb_string_appendc(str, "..."); GB_ASSERT(var->type->kind == Type_Slice); str = write_type_to_string(str, slice->Slice.elem); } else { |