Commit 82101198f1
Changed files (4)
src/analyze.cpp
@@ -786,7 +786,7 @@ TypeTableEntry *get_fn_type(CodeGen *g, FnTypeId *fn_type_id) {
gen_param_info->src_index = i;
gen_param_info->gen_index = SIZE_MAX;
- assert(type_is_complete(type_entry));
+ ensure_complete_type(g, type_entry);
if (type_has_bits(type_entry)) {
TypeTableEntry *gen_type;
if (handle_is_ptr(type_entry)) {
@@ -2911,3 +2911,16 @@ ConstExprValue *create_const_bool(bool value) {
init_const_bool(const_val, value);
return const_val;
}
+
+void ensure_complete_type(CodeGen *g, TypeTableEntry *type_entry) {
+ if (type_entry->id == TypeTableEntryIdStruct) {
+ if (!type_entry->data.structure.complete)
+ resolve_struct_type(g, type_entry);
+ } else if (type_entry->id == TypeTableEntryIdEnum) {
+ if (!type_entry->data.enumeration.complete)
+ resolve_enum_type(g, type_entry);
+ } else if (type_entry->id == TypeTableEntryIdUnion) {
+ if (!type_entry->data.unionation.complete)
+ resolve_union_type(g, type_entry);
+ }
+}
src/analyze.hpp
@@ -74,6 +74,8 @@ void init_fn_type_id(FnTypeId *fn_type_id, AstNode *proto_node);
AstNode *get_param_decl_node(FnTableEntry *fn_entry, size_t index);
FnTableEntry *scope_get_fn_if_root(Scope *scope);
bool type_requires_comptime(TypeTableEntry *type_entry);
+void ensure_complete_type(CodeGen *g, TypeTableEntry *type_entry);
+void complete_enum(CodeGen *g, TypeTableEntry *enum_type);
ScopeBlock *create_block_scope(AstNode *node, Scope *parent);
ScopeDefer *create_defer_scope(AstNode *node, Scope *parent);
src/ir.cpp
@@ -6833,8 +6833,7 @@ static TypeTableEntry *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field
IrInstructionFieldPtr *field_ptr_instruction, IrInstruction *container_ptr, TypeTableEntry *container_type)
{
TypeTableEntry *bare_type = container_ref_type(container_type);
- if (!type_is_complete(bare_type))
- resolve_container_type(ira->codegen, bare_type);
+ ensure_complete_type(ira->codegen, bare_type);
if (bare_type->id == TypeTableEntryIdStruct) {
TypeStructField *field = find_struct_type_field(bare_type, field_name);
std/elf.zig
@@ -37,7 +37,9 @@ pub const FileType = enum {
Core,
};
-pub const Arch = enum {
+// TODO rename this to Arch when the builtin Arch enum is namespaced
+// or make debug info work for builtin enums
+pub const ElfArch = enum {
Sparc,
x86,
Mips,
@@ -68,7 +70,7 @@ pub const Elf = struct {
is_64: bool,
is_big_endian: bool,
file_type: FileType,
- arch: Arch,
+ arch: ElfArch,
entry_addr: u64,
program_header_offset: u64,
section_header_offset: u64,
@@ -122,15 +124,15 @@ pub const Elf = struct {
};
elf.arch = switch (%return elf.in_stream.readInt(elf.is_big_endian, u16)) {
- 0x02 => Arch.Sparc,
- 0x03 => Arch.x86,
- 0x08 => Arch.Mips,
- 0x14 => Arch.PowerPc,
- 0x28 => Arch.Arm,
- 0x2A => Arch.SuperH,
- 0x32 => Arch.IA_64,
- 0x3E => Arch.x86_64,
- 0xb7 => Arch.AArch64,
+ 0x02 => ElfArch.Sparc,
+ 0x03 => ElfArch.x86,
+ 0x08 => ElfArch.Mips,
+ 0x14 => ElfArch.PowerPc,
+ 0x28 => ElfArch.Arm,
+ 0x2A => ElfArch.SuperH,
+ 0x32 => ElfArch.IA_64,
+ 0x3E => ElfArch.x86_64,
+ 0xb7 => ElfArch.AArch64,
else => return error.InvalidFormat,
};