aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Module.zig1
-rw-r--r--src/Sema.zig24
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(