| 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,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 file | 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 | else => { | 751 | else => { |
| 752 | // In this case we are rendering an error union which has a | 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,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; |
| 277 | 277 | ||
| 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 | } |
| 286 | 287 | ||
| 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 { |
| 843 | test "catch within a function that calls no errorable functions" { | 843 | test "catch within a function that calls no errorable functions" { |
| 844 | non_errorable(); | 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 | } |