authorgravatar for daniele.cocca@gmail.comDaniele Cocca <daniele.cocca@gmail.com> 2021-04-28 01:00:32+01:00
committergravatar for dcocca@google.comDaniele Cocca <dcocca@google.com> 2021-06-16 22:02:52+01:00
log171102ea7ca3a11113d2ccfb7206b0eaddab19ac
treee86fc48c104325a4ba2df95a7fb900872278e254
parent00e1c0082c7c3cee377cc4e31b205c26f8943419

errorName: return a null-terminated slice


3 files changed, 19 insertions(+), 8 deletions(-)

doc/langref.html.in+1-1
......@@ -7475,7 +7475,7 @@ test "main" {
74757475 {#header_close#}
74767476
74777477 {#header_open|@errorName#}
7478 <pre>{#syntax#}@errorName(err: anyerror) []const u8{#endsyntax#}</pre>
7478 <pre>{#syntax#}@errorName(err: anyerror) [:0]const u8{#endsyntax#}</pre>
74797479 <p>
74807480 This function returns the string representation of an error. The string representation
74817481 of {#syntax#}error.OutOfMem{#endsyntax#} is {#syntax#}"OutOfMem"{#endsyntax#}.
src/stage1/ir.cpp+8-7
......@@ -16864,26 +16864,27 @@ static IrInstGen *ir_analyze_instruction_err_name(IrAnalyze *ira, IrInstSrcErrNa
1686416864 if (type_is_invalid(casted_value->value->type))
1686516865 return ira->codegen->invalid_inst_gen;
1686616866
16867 ZigType *u8_ptr_type = get_pointer_to_type_extra(ira->codegen, ira->codegen->builtin_types.entry_u8,
16868 true, false, PtrLenUnknown, 0, 0, 0, false);
16869 ZigType *str_type = get_slice_type(ira->codegen, u8_ptr_type);
1687016867 if (instr_is_comptime(casted_value)) {
1687116868 ZigValue *val = ir_resolve_const(ira, casted_value, UndefBad);
1687216869 if (val == nullptr)
1687316870 return ira->codegen->invalid_inst_gen;
1687416871 ErrorTableEntry *err = casted_value->value->data.x_err_set;
1687516872 if (!err->cached_error_name_val) {
16876 ZigValue *array_val = create_const_str_lit(ira->codegen, &err->name)->data.x_ptr.data.ref.pointee;
16877 err->cached_error_name_val = create_const_slice(ira->codegen, array_val, 0, buf_len(&err->name), true);
16873 err->cached_error_name_val = create_sentineled_str_lit(
16874 ira->codegen, &err->name,
16875 ira->codegen->intern.for_zero_byte());
1687816876 }
1687916877 IrInstGen *result = ir_const(ira, &instruction->base.base, nullptr);
16880 copy_const_val(ira->codegen, result->value, err->cached_error_name_val);
16881 result->value->type = str_type;
16878 result->value = err->cached_error_name_val;
1688216879 return result;
1688316880 }
1688416881
1688516882 ira->codegen->generate_error_name_table = true;
1688616883
16884 ZigType *u8_ptr_type = get_pointer_to_type_extra2(ira->codegen, ira->codegen->builtin_types.entry_u8,
16885 true, false, PtrLenUnknown, 0, 0, 0, false,
16886 VECTOR_INDEX_NONE, nullptr, ira->codegen->intern.for_zero_byte());
16887 ZigType *str_type = get_slice_type(ira->codegen, u8_ptr_type);
1688716888 return ir_build_err_name_gen(ira, &instruction->base.base, value, str_type);
1688816889}
1688916890
test/behavior/bugs/3779.zig+10
......@@ -9,3 +9,13 @@ test "@tagName() returns a string literal" {
99 try std.testing.expectEqualStrings("TestEnumValue", tag_name);
1010 try std.testing.expectEqualStrings("TestEnumValue", ptr_tag_name[0..tag_name.len]);
1111}
12
13const TestError = error{TestErrorCode};
14const error_name = @errorName(TestError.TestErrorCode);
15const ptr_error_name: [*:0]const u8 = error_name;
16
17test "@errorName() returns a string literal" {
18 try std.testing.expectEqual([:0]const u8, @TypeOf(error_name));
19 try std.testing.expectEqualStrings("TestErrorCode", error_name);
20 try std.testing.expectEqualStrings("TestErrorCode", ptr_error_name[0..error_name.len]);
21}