authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-12-03 16:50:20-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-12-03 16:50:20-07:00
log84704ef43e5414860aa9d3dc0f94f9737404f6e5
tree3e4560b5ce481376e1c6491b77f2e4b04ff9e021
parent77fc9090d54e9a66223f0e73adfbb7e6b0d30e13

stage1: LLVM code for `@tagName` not emitting null byte

Thanks LemonBoy for the patch.

2 files changed, 14 insertions(+), 3 deletions(-)

src/stage1/codegen.cpp+4-3
...@@ -5402,8 +5402,9 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) {...@@ -5402,8 +5402,9 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) {
5402 if (enum_type->data.enumeration.name_function)5402 if (enum_type->data.enumeration.name_function)
5403 return enum_type->data.enumeration.name_function;5403 return enum_type->data.enumeration.name_function;
54045404
5405 ZigType *u8_ptr_type = get_pointer_to_type_extra(g, g->builtin_types.entry_u8, false, false,5405 ZigType *u8_ptr_type = get_pointer_to_type_extra2(g, g->builtin_types.entry_u8, false, false,
5406 PtrLenUnknown, get_abi_alignment(g, g->builtin_types.entry_u8), 0, 0, false);5406 PtrLenUnknown, get_abi_alignment(g, g->builtin_types.entry_u8), 0, 0, false,
5407 VECTOR_INDEX_NONE, nullptr, g->intern.for_zero_byte());
5407 ZigType *u8_slice_type = get_slice_type(g, u8_ptr_type);5408 ZigType *u8_slice_type = get_slice_type(g, u8_ptr_type);
5408 ZigType *tag_int_type = enum_type->data.enumeration.tag_int_type;5409 ZigType *tag_int_type = enum_type->data.enumeration.tag_int_type;
54095410
...@@ -5456,7 +5457,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) {...@@ -5456,7 +5457,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) {
5456 continue;5457 continue;
5457 }5458 }
54585459
5459 LLVMValueRef str_init = LLVMConstString(buf_ptr(name), (unsigned)buf_len(name), true);5460 LLVMValueRef str_init = LLVMConstString(buf_ptr(name), (unsigned)buf_len(name), false);
5460 LLVMValueRef str_global = LLVMAddGlobal(g->module, LLVMTypeOf(str_init), "");5461 LLVMValueRef str_global = LLVMAddGlobal(g->module, LLVMTypeOf(str_init), "");
5461 LLVMSetInitializer(str_global, str_init);5462 LLVMSetInitializer(str_global, str_init);
5462 LLVMSetLinkage(str_global, LLVMPrivateLinkage);5463 LLVMSetLinkage(str_global, LLVMPrivateLinkage);
test/behavior/enum_stage1.zig+10
...@@ -114,6 +114,16 @@ test "@tagName non-exhaustive enum" {...@@ -114,6 +114,16 @@ test "@tagName non-exhaustive enum" {
114 comptime try expect(mem.eql(u8, testEnumTagNameBare(NonExhaustive.B), "B"));114 comptime try expect(mem.eql(u8, testEnumTagNameBare(NonExhaustive.B), "B"));
115}115}
116116
117test "@tagName is null-terminated" {
118 const S = struct {
119 fn doTheTest(n: BareNumber) !void {
120 try expect(@tagName(n)[3] == 0);
121 }
122 };
123 try S.doTheTest(.Two);
124 try comptime S.doTheTest(.Two);
125}
126
117fn testEnumTagNameBare(n: anytype) []const u8 {127fn testEnumTagNameBare(n: anytype) []const u8 {
118 return @tagName(n);128 return @tagName(n);
119}129}