aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniele Cocca <daniele.cocca@gmail.com>2021-04-28 01:00:32 +0100
committerDaniele Cocca <dcocca@google.com>2021-06-16 22:02:52 +0100
commit171102ea7ca3a11113d2ccfb7206b0eaddab19ac (patch)
treee86fc48c104325a4ba2df95a7fb900872278e254
parent00e1c0082c7c3cee377cc4e31b205c26f8943419 (diff)
downloadzig-171102ea7ca3a11113d2ccfb7206b0eaddab19ac.tar.gz
zig-171102ea7ca3a11113d2ccfb7206b0eaddab19ac.zip
errorName: return a null-terminated slice
-rw-r--r--doc/langref.html.in2
-rw-r--r--src/stage1/ir.cpp15
-rw-r--r--test/behavior/bugs/3779.zig10
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]);
+}