authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-10-05 01:21:11-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-10-25 05:11:28-04:00
logc8d0e71de6c0e59b8f103526204b990fafe41f54
treef8d46324b2b3970e12838418e17a4570a5d9e7fd
parentab024d3524f60c691221f6c838d6fe340c7c7cd7

c: fix mangling of error names

Closes #12751

3 files changed, 25 insertions(+), 7 deletions(-)

src/codegen/c.zig+1-1
...@@ -746,7 +746,7 @@ pub const DeclGen = struct {...@@ -746,7 +746,7 @@ pub const DeclGen = struct {
746 .@"error" => {746 .@"error" => {
747 const payload = val.castTag(.@"error").?;747 const payload = val.castTag(.@"error").?;
748 // error values will be #defined at the top of the file748 // error values will be #defined at the top of the file
749 return writer.print("zig_error_{s}", .{payload.data.name});749 return writer.print("zig_error_{s}", .{fmtIdent(payload.data.name)});
750 },750 },
751 else => {751 else => {
752 // In this case we are rendering an error union which has a752 // In this case we are rendering an error union which has a
src/link/C.zig+7-6
...@@ -275,13 +275,14 @@ pub fn flushModule(self: *C, comp: *Compilation, prog_node: *std.Progress.Node)...@@ -275,13 +275,14 @@ pub fn flushModule(self: *C, comp: *Compilation, prog_node: *std.Progress.Node)
275 const err_typedef_index = f.all_buffers.items.len;275 const err_typedef_index = f.all_buffers.items.len;
276 f.all_buffers.items.len += 1;276 f.all_buffers.items.len += 1;
277277
278 render_errors: {278 if (module.global_error_set.size > 0) {
279 if (module.global_error_set.size == 0) break :render_errors;279 try err_typedef_writer.writeAll("enum {\n");
280 var it = module.global_error_set.iterator();280 var it = module.global_error_set.iterator();
281 while (it.next()) |entry| {281 while (it.next()) |entry| try err_typedef_writer.print(" zig_error_{s} = {d},\n", .{
282 try err_typedef_writer.print("#define zig_error_{s} {d}\n", .{ entry.key_ptr.*, entry.value_ptr.* });282 codegen.fmtIdent(entry.key_ptr.*),
283 }283 entry.value_ptr.*,
284 try err_typedef_writer.writeByte('\n');284 });
285 try err_typedef_writer.writeAll("};\n");
285 }286 }
286287
287 // Typedefs, forward decls, and non-functions first.288 // Typedefs, forward decls, and non-functions first.
test/behavior/error.zig+17
...@@ -843,3 +843,20 @@ fn non_errorable() void {...@@ -843,3 +843,20 @@ fn non_errorable() void {
843test "catch within a function that calls no errorable functions" {843test "catch within a function that calls no errorable functions" {
844 non_errorable();844 non_errorable();
845}845}
846
847test "error from comptime string" {
848 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
849 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
850 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
851 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
852
853 const name = "Weird error name!";
854 const S = struct {
855 fn foo() !void {
856 return @field(anyerror, name);
857 }
858 };
859 if (S.foo()) unreachable else |err| {
860 try expect(mem.eql(u8, name, @errorName(err)));
861 }
862}