diff --git a/deps/aro/aro/Attribute.zig b/deps/aro/aro/Attribute.zig index 3a812ab7beb4..4fbc408126c1 100644 --- a/deps/aro/aro/Attribute.zig +++ b/deps/aro/aro/Attribute.zig @@ -645,7 +645,7 @@ pub const Arguments = blk: { var union_fields: [decls.len]ZigType.UnionField = undefined; for (decls, &union_fields) |decl, *field| { field.* = .{ - .name = decl.name, + .name = decl.name ++ "", .type = @field(attributes, decl.name), .alignment = 0, }; diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig index 19c704c9a56c..24c6036d60b3 100644 --- a/lib/std/builtin.zig +++ b/lib/std/builtin.zig @@ -314,7 +314,7 @@ pub const Type = union(enum) { /// This data structure is used by the Zig language code generation and /// therefore must be kept in sync with the compiler implementation. pub const StructField = struct { - name: []const u8, + name: [:0]const u8, type: type, default_value: ?*const anyopaque, is_comptime: bool, @@ -348,7 +348,7 @@ pub const Type = union(enum) { /// This data structure is used by the Zig language code generation and /// therefore must be kept in sync with the compiler implementation. pub const Error = struct { - name: []const u8, + name: [:0]const u8, }; /// This data structure is used by the Zig language code generation and @@ -358,7 +358,7 @@ pub const Type = union(enum) { /// This data structure is used by the Zig language code generation and /// therefore must be kept in sync with the compiler implementation. pub const EnumField = struct { - name: []const u8, + name: [:0]const u8, value: comptime_int, }; @@ -374,7 +374,7 @@ pub const Type = union(enum) { /// This data structure is used by the Zig language code generation and /// therefore must be kept in sync with the compiler implementation. pub const UnionField = struct { - name: []const u8, + name: [:0]const u8, type: type, alignment: comptime_int, }; @@ -436,7 +436,7 @@ pub const Type = union(enum) { /// This data structure is used by the Zig language code generation and /// therefore must be kept in sync with the compiler implementation. pub const Declaration = struct { - name: []const u8, + name: [:0]const u8, }; }; diff --git a/lib/std/enums.zig b/lib/std/enums.zig index 839781ffb770..872b752a40bf 100644 --- a/lib/std/enums.zig +++ b/lib/std/enums.zig @@ -14,7 +14,7 @@ pub fn EnumFieldStruct(comptime E: type, comptime Data: type, comptime field_def var fields: []const StructField = &[_]StructField{}; for (std.meta.fields(E)) |field| { fields = fields ++ &[_]StructField{.{ - .name = field.name, + .name = field.name ++ "", .type = Data, .default_value = if (field_default) |d| @as(?*const anyopaque, @ptrCast(&d)) else null, .is_comptime = false, diff --git a/lib/std/io.zig b/lib/std/io.zig index e19b2e0e163c..912e834a7510 100644 --- a/lib/std/io.zig +++ b/lib/std/io.zig @@ -635,7 +635,7 @@ pub fn PollFiles(comptime StreamEnum: type) type { var struct_fields: [enum_fields.len]std.builtin.Type.StructField = undefined; for (&struct_fields, enum_fields) |*struct_field, enum_field| { struct_field.* = .{ - .name = enum_field.name, + .name = enum_field.name ++ "", .type = fs.File, .default_value = null, .is_comptime = false, diff --git a/lib/std/meta.zig b/lib/std/meta.zig index 5531242e30ef..94d5f962bcbb 100644 --- a/lib/std/meta.zig +++ b/lib/std/meta.zig @@ -556,7 +556,7 @@ pub fn FieldEnum(comptime T: type) type { var decls = [_]std.builtin.Type.Declaration{}; inline for (field_infos, 0..) |field, i| { enumFields[i] = .{ - .name = field.name, + .name = field.name ++ "", .value = i, }; } @@ -628,7 +628,7 @@ pub fn DeclEnum(comptime T: type) type { var enumDecls: [fieldInfos.len]std.builtin.Type.EnumField = undefined; var decls = [_]std.builtin.Type.Declaration{}; inline for (fieldInfos, 0..) |field, i| { - enumDecls[i] = .{ .name = field.name, .value = i }; + enumDecls[i] = .{ .name = field.name ++ "", .value = i }; } return @Type(.{ .Enum = .{ @@ -1015,7 +1015,7 @@ fn CreateUniqueTuple(comptime N: comptime_int, comptime types: [N]type) type { @setEvalBranchQuota(10_000); var num_buf: [128]u8 = undefined; tuple_fields[i] = .{ - .name = std.fmt.bufPrint(&num_buf, "{d}", .{i}) catch unreachable, + .name = std.fmt.bufPrintZ(&num_buf, "{d}", .{i}) catch unreachable, .type = T, .default_value = null, .is_comptime = false, diff --git a/src/InternPool.zig b/src/InternPool.zig index 2e690652a3e6..0844e0f7a586 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -5315,7 +5315,7 @@ pub fn get(ip: *InternPool, gpa: Allocator, key: Key) Allocator.Error!Index { try ip.extra.ensureUnusedCapacity( gpa, - @typeInfo(Tag.Aggregate).Struct.fields.len + @as(usize, @intCast(len_including_sentinel)), + @typeInfo(Tag.Aggregate).Struct.fields.len + @as(usize, @intCast(len_including_sentinel + 1)), ); ip.items.appendAssumeCapacity(.{ .tag = .aggregate, diff --git a/src/Sema.zig b/src/Sema.zig index 2b020b405bac..f79691f6acb8 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -17259,10 +17259,11 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai const vals = try sema.arena.alloc(InternPool.Index, names.len); for (vals, 0..) |*field_val, i| { // TODO: write something like getCoercedInts to avoid needing to dupe - const name = try sema.arena.dupe(u8, ip.stringToSlice(names.get(ip)[i])); + const name = try sema.arena.dupeZ(u8, ip.stringToSlice(names.get(ip)[i])); const name_val = v: { const new_decl_ty = try mod.arrayType(.{ .len = name.len, + .sentinel = .zero_u8, .child = .u8_type, }); const new_decl_val = try mod.intern(.{ .aggregate = .{ @@ -17270,17 +17271,17 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai .storage = .{ .bytes = name }, } }); break :v try mod.intern(.{ .ptr = .{ - .ty = .slice_const_u8_type, + .ty = .slice_const_u8_sentinel_0_type, .addr = .{ .anon_decl = .{ .val = new_decl_val, - .orig_ty = .slice_const_u8_type, + .orig_ty = .slice_const_u8_sentinel_0_type, } }, .len = (try mod.intValue(Type.usize, name.len)).toIntern(), } }); }; const error_field_fields = .{ - // name: []const u8, + // name: [:0]const u8, name_val, }; field_val.* = try mod.intern(.{ .aggregate = .{ @@ -17387,10 +17388,11 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai else (try mod.intValue(Type.comptime_int, i)).toIntern(); // TODO: write something like getCoercedInts to avoid needing to dupe - const name = try sema.arena.dupe(u8, ip.stringToSlice(enum_type.names.get(ip)[i])); + const name = try sema.arena.dupeZ(u8, ip.stringToSlice(enum_type.names.get(ip)[i])); const name_val = v: { const new_decl_ty = try mod.arrayType(.{ .len = name.len, + .sentinel = .zero_u8, .child = .u8_type, }); const new_decl_val = try mod.intern(.{ .aggregate = .{ @@ -17398,17 +17400,17 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai .storage = .{ .bytes = name }, } }); break :v try mod.intern(.{ .ptr = .{ - .ty = .slice_const_u8_type, + .ty = .slice_const_u8_sentinel_0_type, .addr = .{ .anon_decl = .{ .val = new_decl_val, - .orig_ty = .slice_const_u8_type, + .orig_ty = .slice_const_u8_sentinel_0_type, } }, .len = (try mod.intValue(Type.usize, name.len)).toIntern(), } }); }; const enum_field_fields = .{ - // name: []const u8, + // name: [:0]const u8, name_val, // value: comptime_int, value_val, @@ -17512,10 +17514,11 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai for (union_field_vals, 0..) |*field_val, i| { // TODO: write something like getCoercedInts to avoid needing to dupe - const name = try sema.arena.dupe(u8, ip.stringToSlice(union_obj.field_names.get(ip)[i])); + const name = try sema.arena.dupeZ(u8, ip.stringToSlice(union_obj.field_names.get(ip)[i])); const name_val = v: { const new_decl_ty = try mod.arrayType(.{ .len = name.len, + .sentinel = .zero_u8, .child = .u8_type, }); const new_decl_val = try mod.intern(.{ .aggregate = .{ @@ -17523,10 +17526,10 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai .storage = .{ .bytes = name }, } }); break :v try mod.intern(.{ .ptr = .{ - .ty = .slice_const_u8_type, + .ty = .slice_const_u8_sentinel_0_type, .addr = .{ .anon_decl = .{ .val = new_decl_val, - .orig_ty = .slice_const_u8_type, + .orig_ty = .slice_const_u8_sentinel_0_type, } }, .len = (try mod.intValue(Type.usize, name.len)).toIntern(), } }); @@ -17539,7 +17542,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai const field_ty = union_obj.field_types.get(ip)[i]; const union_field_fields = .{ - // name: []const u8, + // name: [:0]const u8, name_val, // type: type, field_ty, @@ -17658,11 +17661,12 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai // TODO: write something like getCoercedInts to avoid needing to dupe const bytes = if (tuple.names.len != 0) // https://github.com/ziglang/zig/issues/15709 - try sema.arena.dupe(u8, ip.stringToSlice(ip.indexToKey(ty.toIntern()).anon_struct_type.names.get(ip)[i])) + try sema.arena.dupeZ(u8, ip.stringToSlice(ip.indexToKey(ty.toIntern()).anon_struct_type.names.get(ip)[i])) else - try std.fmt.allocPrint(sema.arena, "{d}", .{i}); + try std.fmt.allocPrintZ(sema.arena, "{d}", .{i}); const new_decl_ty = try mod.arrayType(.{ .len = bytes.len, + .sentinel = .zero_u8, .child = .u8_type, }); const new_decl_val = try mod.intern(.{ .aggregate = .{ @@ -17670,10 +17674,10 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai .storage = .{ .bytes = bytes }, } }); break :v try mod.intern(.{ .ptr = .{ - .ty = .slice_const_u8_type, + .ty = .slice_const_u8_sentinel_0_type, .addr = .{ .anon_decl = .{ .val = new_decl_val, - .orig_ty = .slice_const_u8_type, + .orig_ty = .slice_const_u8_sentinel_0_type, } }, .len = (try mod.intValue(Type.usize, bytes.len)).toIntern(), } }); @@ -17685,7 +17689,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai const opt_default_val = if (is_comptime) Value.fromInterned(field_val) else null; const default_val_ptr = try sema.optRefValue(opt_default_val); const struct_field_fields = .{ - // name: []const u8, + // name: [:0]const u8, name_val, // type: type, field_ty, @@ -17713,7 +17717,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai for (struct_field_vals, 0..) |*field_val, i| { // TODO: write something like getCoercedInts to avoid needing to dupe const name = if (struct_type.fieldName(ip, i).unwrap()) |name_nts| - try sema.arena.dupe(u8, ip.stringToSlice(name_nts)) + try sema.arena.dupeZ(u8, ip.stringToSlice(name_nts)) else try std.fmt.allocPrintZ(sema.arena, "{d}", .{i}); const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[i]); @@ -17722,6 +17726,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai const name_val = v: { const new_decl_ty = try mod.arrayType(.{ .len = name.len, + .sentinel = .zero_u8, .child = .u8_type, }); const new_decl_val = try mod.intern(.{ .aggregate = .{ @@ -17729,10 +17734,10 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai .storage = .{ .bytes = name }, } }); break :v try mod.intern(.{ .ptr = .{ - .ty = .slice_const_u8_type, + .ty = .slice_const_u8_sentinel_0_type, .addr = .{ .anon_decl = .{ .val = new_decl_val, - .orig_ty = .slice_const_u8_type, + .orig_ty = .slice_const_u8_sentinel_0_type, } }, .len = (try mod.intValue(Type.usize, name.len)).toIntern(), } }); @@ -17750,7 +17755,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai }; const struct_field_fields = .{ - // name: []const u8, + // name: [:0]const u8, name_val, // type: type, field_ty.toIntern(), @@ -17957,9 +17962,10 @@ fn typeInfoNamespaceDecls( if (decl.kind != .named or !decl.is_pub) continue; const name_val = v: { // TODO: write something like getCoercedInts to avoid needing to dupe - const name = try sema.arena.dupe(u8, ip.stringToSlice(decl.name)); + const name = try sema.arena.dupeZ(u8, ip.stringToSlice(decl.name)); const new_decl_ty = try mod.arrayType(.{ .len = name.len, + .sentinel = .zero_u8, .child = .u8_type, }); const new_decl_val = try mod.intern(.{ .aggregate = .{ @@ -17967,9 +17973,9 @@ fn typeInfoNamespaceDecls( .storage = .{ .bytes = name }, } }); break :v try mod.intern(.{ .ptr = .{ - .ty = .slice_const_u8_type, + .ty = .slice_const_u8_sentinel_0_type, .addr = .{ .anon_decl = .{ - .orig_ty = .slice_const_u8_type, + .orig_ty = .slice_const_u8_sentinel_0_type, .val = new_decl_val, } }, .len = (try mod.intValue(Type.usize, name.len)).toIntern(), @@ -17977,7 +17983,7 @@ fn typeInfoNamespaceDecls( }; const fields = .{ - //name: []const u8, + //name: [:0]const u8, name_val, }; try decl_vals.append(try mod.intern(.{ .aggregate = .{ diff --git a/src/value.zig b/src/value.zig index 45f603ed2daa..896ca108a7c2 100644 --- a/src/value.zig +++ b/src/value.zig @@ -4050,7 +4050,7 @@ pub const Value = struct { const tags = @typeInfo(Tag).Enum.fields; var fields: [tags.len]std.builtin.Type.StructField = undefined; for (&fields, tags) |*field, t| field.* = .{ - .name = t.name, + .name = t.name ++ "", .type = *@field(Tag, t.name).Type(), .default_value = null, .is_comptime = false, diff --git a/test/behavior/type.zig b/test/behavior/type.zig index 7cb9212c3022..1ce31fecfd59 100644 --- a/test/behavior/type.zig +++ b/test/behavior/type.zig @@ -549,7 +549,7 @@ test "Type.Fn" { test "reified struct field name from optional payload" { comptime { - const m_name: ?[1]u8 = "a".*; + const m_name: ?[1:0]u8 = "a".*; if (m_name) |*name| { const T = @Type(.{ .Struct = .{ .layout = .Auto, @@ -711,7 +711,7 @@ test "struct field names sliced at comptime from larger string" { while (it.next()) |name| { fields = fields ++ &[_]Type.StructField{.{ .alignment = 0, - .name = name, + .name = name ++ "", .type = usize, .default_value = null, .is_comptime = false,