| author | |
| committer | |
| log | c8d0e71de6c0e59b8f103526204b990fafe41f54 |
| tree | f8d46324b2b3970e12838418e17a4570a5d9e7fd |
| parent | ab024d3524f60c691221f6c838d6fe340c7c7cd7 |
Closes #127513 files changed, 25 insertions(+), 7 deletions(-)
src/codegen/c.zig+1-1| ... | ... | @@ -746,7 +746,7 @@ pub const DeclGen = struct { |
| 746 | 746 | .@"error" => { |
| 747 | 747 | const payload = val.castTag(.@"error").?; |
| 748 | 748 | // 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 | 751 | else => { |
| 752 | 752 | // 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 | 275 | const err_typedef_index = f.all_buffers.items.len; |
| 276 | 276 | f.all_buffers.items.len += 1; |
| 277 | 277 | |
| 278 | render_errors: { | |
| 279 | if (module.global_error_set.size == 0) break :render_errors; | |
| 278 | if (module.global_error_set.size > 0) { | |
| 279 | try err_typedef_writer.writeAll("enum {\n"); | |
| 280 | 280 | var it = module.global_error_set.iterator(); |
| 281 | while (it.next()) |entry| { | |
| 282 | try err_typedef_writer.print("#define zig_error_{s} {d}\n", .{ entry.key_ptr.*, entry.value_ptr.* }); | |
| 283 | } | |
| 284 | try err_typedef_writer.writeByte('\n'); | |
| 281 | while (it.next()) |entry| try err_typedef_writer.print(" zig_error_{s} = {d},\n", .{ | |
| 282 | codegen.fmtIdent(entry.key_ptr.*), | |
| 283 | entry.value_ptr.*, | |
| 284 | }); | |
| 285 | try err_typedef_writer.writeAll("};\n"); | |
| 285 | 286 | } |
| 286 | 287 | |
| 287 | 288 | // Typedefs, forward decls, and non-functions first. |
test/behavior/error.zig+17| ... | ... | @@ -843,3 +843,20 @@ fn non_errorable() void { |
| 843 | 843 | test "catch within a function that calls no errorable functions" { |
| 844 | 844 | non_errorable(); |
| 845 | 845 | } |
| 846 | ||
| 847 | test "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 | } |