diff options
| author | Daniele Cocca <daniele.cocca@gmail.com> | 2021-04-28 01:00:32 +0100 |
|---|---|---|
| committer | Daniele Cocca <dcocca@google.com> | 2021-06-16 22:02:52 +0100 |
| commit | 171102ea7ca3a11113d2ccfb7206b0eaddab19ac (patch) | |
| tree | e86fc48c104325a4ba2df95a7fb900872278e254 | |
| parent | 00e1c0082c7c3cee377cc4e31b205c26f8943419 (diff) | |
| download | zig-171102ea7ca3a11113d2ccfb7206b0eaddab19ac.tar.gz zig-171102ea7ca3a11113d2ccfb7206b0eaddab19ac.zip | |
errorName: return a null-terminated slice
| -rw-r--r-- | doc/langref.html.in | 2 | ||||
| -rw-r--r-- | src/stage1/ir.cpp | 15 | ||||
| -rw-r--r-- | test/behavior/bugs/3779.zig | 10 |
3 files changed, 19 insertions, 8 deletions
diff --git a/doc/langref.html.in b/doc/langref.html.in index fcf07eb6c1..c7a677bb8e 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -7475,7 +7475,7 @@ test "main" { {#header_close#} {#header_open|@errorName#} - <pre>{#syntax#}@errorName(err: anyerror) []const u8{#endsyntax#}</pre> + <pre>{#syntax#}@errorName(err: anyerror) [:0]const u8{#endsyntax#}</pre> <p> This function returns the string representation of an error. The string representation of {#syntax#}error.OutOfMem{#endsyntax#} is {#syntax#}"OutOfMem"{#endsyntax#}. diff --git a/src/stage1/ir.cpp b/src/stage1/ir.cpp index 10dfb798cb..2200e8380d 100644 --- a/src/stage1/ir.cpp +++ b/src/stage1/ir.cpp @@ -16864,26 +16864,27 @@ static IrInstGen *ir_analyze_instruction_err_name(IrAnalyze *ira, IrInstSrcErrNa if (type_is_invalid(casted_value->value->type)) return ira->codegen->invalid_inst_gen; - ZigType *u8_ptr_type = get_pointer_to_type_extra(ira->codegen, ira->codegen->builtin_types.entry_u8, - true, false, PtrLenUnknown, 0, 0, 0, false); - ZigType *str_type = get_slice_type(ira->codegen, u8_ptr_type); if (instr_is_comptime(casted_value)) { ZigValue *val = ir_resolve_const(ira, casted_value, UndefBad); if (val == nullptr) return ira->codegen->invalid_inst_gen; ErrorTableEntry *err = casted_value->value->data.x_err_set; if (!err->cached_error_name_val) { - ZigValue *array_val = create_const_str_lit(ira->codegen, &err->name)->data.x_ptr.data.ref.pointee; - err->cached_error_name_val = create_const_slice(ira->codegen, array_val, 0, buf_len(&err->name), true); + err->cached_error_name_val = create_sentineled_str_lit( + ira->codegen, &err->name, + ira->codegen->intern.for_zero_byte()); } IrInstGen *result = ir_const(ira, &instruction->base.base, nullptr); - copy_const_val(ira->codegen, result->value, err->cached_error_name_val); - result->value->type = str_type; + result->value = err->cached_error_name_val; return result; } ira->codegen->generate_error_name_table = true; + ZigType *u8_ptr_type = get_pointer_to_type_extra2(ira->codegen, ira->codegen->builtin_types.entry_u8, + true, false, PtrLenUnknown, 0, 0, 0, false, + VECTOR_INDEX_NONE, nullptr, ira->codegen->intern.for_zero_byte()); + ZigType *str_type = get_slice_type(ira->codegen, u8_ptr_type); return ir_build_err_name_gen(ira, &instruction->base.base, value, str_type); } diff --git a/test/behavior/bugs/3779.zig b/test/behavior/bugs/3779.zig index 8866b39de3..5423a6f265 100644 --- a/test/behavior/bugs/3779.zig +++ b/test/behavior/bugs/3779.zig @@ -9,3 +9,13 @@ test "@tagName() returns a string literal" { try std.testing.expectEqualStrings("TestEnumValue", tag_name); try std.testing.expectEqualStrings("TestEnumValue", ptr_tag_name[0..tag_name.len]); } + +const TestError = error{TestErrorCode}; +const error_name = @errorName(TestError.TestErrorCode); +const ptr_error_name: [*:0]const u8 = error_name; + +test "@errorName() returns a string literal" { + try std.testing.expectEqual([:0]const u8, @TypeOf(error_name)); + try std.testing.expectEqualStrings("TestErrorCode", error_name); + try std.testing.expectEqualStrings("TestErrorCode", ptr_error_name[0..error_name.len]); +} |
