authorgravatar for daniele.cocca@gmail.comDaniele Cocca <daniele.cocca@gmail.com> 2021-06-18 17:59:38+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-07-15 15:12:44-04:00
logb009aca38a861f74fd5378db19c65db286ad397e
treed66aaa750958d46598b6c0d75ab2bf889dffc355
parent08e5daa7d5ff0226ced462308d06b3b17ee4472f

src: return a null-terminated slice


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

src/stage1/ir.cpp+6-14
...@@ -24261,12 +24261,6 @@ static Stage1AirInst *ir_analyze_instruction_src(IrAnalyze *ira, Stage1ZirInstSr...@@ -24261,12 +24261,6 @@ static Stage1AirInst *ir_analyze_instruction_src(IrAnalyze *ira, Stage1ZirInstSr
24261 return ira->codegen->invalid_inst_gen;24261 return ira->codegen->invalid_inst_gen;
24262 }24262 }
2426324263
24264 ZigType *u8_ptr = get_pointer_to_type_extra2(
24265 ira->codegen, ira->codegen->builtin_types.entry_u8,
24266 true, false, PtrLenUnknown,
24267 0, 0, 0, false, VECTOR_INDEX_NONE, nullptr, ira->codegen->intern.for_zero_byte());
24268 ZigType *u8_slice = get_slice_type(ira->codegen, u8_ptr);
24269
24270 ZigType *source_location_type = get_builtin_type(ira->codegen, "SourceLocation");24264 ZigType *source_location_type = get_builtin_type(ira->codegen, "SourceLocation");
24271 if (type_resolve(ira->codegen, source_location_type, ResolveStatusSizeKnown)) {24265 if (type_resolve(ira->codegen, source_location_type, ResolveStatusSizeKnown)) {
24272 zig_unreachable();24266 zig_unreachable();
...@@ -24286,18 +24280,16 @@ static Stage1AirInst *ir_analyze_instruction_src(IrAnalyze *ira, Stage1ZirInstSr...@@ -24286,18 +24280,16 @@ static Stage1AirInst *ir_analyze_instruction_src(IrAnalyze *ira, Stage1ZirInstSr
24286 ZigType *import = instruction->base.source_node->owner;24280 ZigType *import = instruction->base.source_node->owner;
24287 RootStruct *root_struct = import->data.structure.root_struct;24281 RootStruct *root_struct = import->data.structure.root_struct;
24288 Buf *path = root_struct->path;24282 Buf *path = root_struct->path;
24289 ZigValue *file_name = create_const_str_lit(ira->codegen, path)->data.x_ptr.data.ref.pointee;24283 fields[0] = create_sentineled_str_lit(
24290 init_const_slice(ira->codegen, fields[0], file_name, 0, buf_len(path), true, nullptr);24284 ira->codegen, path,
24291 fields[0]->type = u8_slice;24285 ira->codegen->intern.for_zero_byte());
2429224286
24293 // fn_name: [:0]const u824287 // fn_name: [:0]const u8
24294 ensure_field_index(source_location_type, "fn_name", 1);24288 ensure_field_index(source_location_type, "fn_name", 1);
24295 fields[1]->special = ConstValSpecialStatic;24289 fields[1]->special = ConstValSpecialStatic;
2429624290 fields[1] = create_sentineled_str_lit(
24297 ZigValue *fn_name = create_const_str_lit(ira->codegen, &fn_entry->symbol_name)->data.x_ptr.data.ref.pointee;24291 ira->codegen, &fn_entry->symbol_name,
24298 init_const_slice(ira->codegen, fields[1], fn_name, 0, buf_len(&fn_entry->symbol_name), true, nullptr);24292 ira->codegen->intern.for_zero_byte());
24299 fields[1]->type = u8_slice;
24300
2430124293
24302 TokenLoc tok_loc = root_struct->token_locs[instruction->base.source_node->main_token];24294 TokenLoc tok_loc = root_struct->token_locs[instruction->base.source_node->main_token];
2430324295
test/behavior/bugs/3779.zig+15
...@@ -40,3 +40,18 @@ test "@embedFile() returns a string literal" {...@@ -40,3 +40,18 @@ test "@embedFile() returns a string literal" {
40 try std.testing.expectEqualStrings(expected_contents, actual_contents);40 try std.testing.expectEqualStrings(expected_contents, actual_contents);
41 try std.testing.expectEqualStrings(expected_contents, ptr_actual_contents[0..actual_contents.len]);41 try std.testing.expectEqualStrings(expected_contents, ptr_actual_contents[0..actual_contents.len]);
42}42}
43
44fn testFnForSrc() std.builtin.SourceLocation {
45 return @src();
46}
47
48test "@src() returns a struct containing 0-terminated string slices" {
49 const src = testFnForSrc();
50 try std.testing.expectEqual([:0]const u8, @TypeOf(src.file));
51 try std.testing.expect(std.mem.endsWith(u8, src.file, "3779.zig"));
52 try std.testing.expectEqual([:0]const u8, @TypeOf(src.fn_name));
53 try std.testing.expect(std.mem.endsWith(u8, src.fn_name, "testFnForSrc"));
54
55 const ptr_src_file: [*:0]const u8 = src.file;
56 const ptr_src_fn_name: [*:0]const u8 = src.fn_name;
57}