diff options
| author | Mitchell Hashimoto <mitchell.hashimoto@gmail.com> | 2022-03-15 14:33:23 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-03-16 01:41:22 -0400 |
| commit | 394252c9db6ae82a2cddf49b986a4e6b72cadb70 (patch) | |
| tree | dc76189c8da1677bbed1614a5680564006fc96b4 /src | |
| parent | 9a6fa67cbc7e5771f3770c0cb7d6d2c6bafb6957 (diff) | |
| download | zig-394252c9db6ae82a2cddf49b986a4e6b72cadb70.tar.gz zig-394252c9db6ae82a2cddf49b986a4e6b72cadb70.zip | |
stage2: move duplicate error set check to AstGen
Diffstat (limited to 'src')
| -rw-r--r-- | src/AstGen.zig | 24 | ||||
| -rw-r--r-- | src/Sema.zig | 6 |
2 files changed, 24 insertions, 6 deletions
diff --git a/src/AstGen.zig b/src/AstGen.zig index 60a7f54e54..84c6934acd 100644 --- a/src/AstGen.zig +++ b/src/AstGen.zig @@ -4723,14 +4723,36 @@ fn errorSetDecl(gz: *GenZir, rl: ResultLoc, node: Ast.Node.Index) InnerError!Zir const payload_index = try reserveExtra(astgen, @typeInfo(Zir.Inst.ErrorSetDecl).Struct.fields.len); var fields_len: usize = 0; { + var idents: std.AutoHashMapUnmanaged(u32, Ast.TokenIndex) = .{}; + defer idents.deinit(gpa); + const error_token = main_tokens[node]; var tok_i = error_token + 2; while (true) : (tok_i += 1) { switch (token_tags[tok_i]) { .doc_comment, .comma => {}, .identifier => { - try astgen.extra.ensureUnusedCapacity(gpa, 2); const str_index = try astgen.identAsString(tok_i); + const gop = try idents.getOrPut(gpa, str_index); + if (gop.found_existing) { + const name = try gpa.dupe(u8, mem.span(astgen.nullTerminatedString(str_index))); + defer gpa.free(name); + return astgen.failTokNotes( + tok_i, + "duplicate error set field '{s}'", + .{name}, + &[_]u32{ + try astgen.errNoteTok( + gop.value_ptr.*, + "previous declaration here", + .{}, + ), + }, + ); + } + gop.value_ptr.* = tok_i; + + try astgen.extra.ensureUnusedCapacity(gpa, 2); astgen.extra.appendAssumeCapacity(str_index); const doc_comment_index = try astgen.docCommentAsString(tok_i); astgen.extra.appendAssumeCapacity(doc_comment_index); diff --git a/src/Sema.zig b/src/Sema.zig index e7b4517590..c8a1f6e343 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -2220,12 +2220,8 @@ fn zirErrorSetDecl( while (extra_index < extra_index_end) : (extra_index += 2) { // +2 to skip over doc_string const str_index = sema.code.extra[extra_index]; const name = try new_decl_arena_allocator.dupe(u8, sema.code.nullTerminatedString(str_index)); - - // TODO: This check should be performed in AstGen instead. const result = names.getOrPutAssumeCapacity(name); - if (result.found_existing) { - return sema.fail(block, src, "duplicate error set field {s}", .{name}); - } + assert(!result.found_existing); // verified in AstGen } // names must be sorted. |
