diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-05-04 13:58:08 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-05-04 13:58:08 -0700 |
| commit | edfbf85ecdf29ee976534403369323def7905c62 (patch) | |
| tree | 04e9be8dfd761336da9544c2fbf52db27ede20d5 /src | |
| parent | 230ce72f168d5bcd0feb2f8f0aed42ea6ad27b09 (diff) | |
| download | zig-edfbf85ecdf29ee976534403369323def7905c62.tar.gz zig-edfbf85ecdf29ee976534403369323def7905c62.zip | |
Sema: implement error sets
Diffstat (limited to 'src')
| -rw-r--r-- | src/Module.zig | 1 | ||||
| -rw-r--r-- | src/Sema.zig | 24 |
2 files changed, 24 insertions, 1 deletions
diff --git a/src/Module.zig b/src/Module.zig index 4b421241cd..3f88efd717 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -478,6 +478,7 @@ pub const ErrorSet = struct { names_len: u32, /// The string bytes are stored in the owner Decl arena. /// They are in the same order they appear in the AST. + /// The length is given by `names_len`. names_ptr: [*]const []const u8, pub fn srcLoc(self: ErrorSet) SrcLoc { diff --git a/src/Sema.zig b/src/Sema.zig index 34713234c8..46b230f174 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -908,11 +908,33 @@ fn zirErrorSetDecl(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) Inner const tracy = trace(@src()); defer tracy.end(); + const gpa = sema.gpa; const inst_data = sema.code.instructions.items(.data)[inst].pl_node; const src = inst_data.src(); const extra = sema.code.extraData(Zir.Inst.ErrorSetDecl, inst_data.payload_index); + const fields = sema.code.extra[extra.end..][0..extra.data.fields_len]; + + var new_decl_arena = std.heap.ArenaAllocator.init(gpa); - return sema.mod.fail(&block.base, sema.src, "TODO implement zirErrorSetDecl", .{}); + const error_set = try new_decl_arena.allocator.create(Module.ErrorSet); + const error_set_ty = try Type.Tag.error_set.create(&new_decl_arena.allocator, error_set); + const error_set_val = try Value.Tag.ty.create(&new_decl_arena.allocator, error_set_ty); + const new_decl = try sema.mod.createAnonymousDecl(&block.base, .{ + .ty = Type.initTag(.type), + .val = error_set_val, + }); + const names = try new_decl_arena.allocator.alloc([]const u8, fields.len); + for (fields) |str_index, i| { + names[i] = try new_decl_arena.allocator.dupe(u8, sema.code.nullTerminatedString(str_index)); + } + error_set.* = .{ + .owner_decl = new_decl, + .node_offset = inst_data.src_node, + .names_ptr = names.ptr, + .names_len = @intCast(u32, names.len), + }; + try new_decl.finalizeNewArena(&new_decl_arena); + return sema.analyzeDeclVal(block, src, new_decl); } fn zirRetPtr( |
