authorgravatar for sinon@vortan.devDavid Rubin <sinon@vortan.dev> 2026-06-09 18:06:38-07:00
committergravatar for alichraghi@noreply.codeberg.orgAli Cheraghi <alichraghi@noreply.codeberg.org> 2026-06-18 22:40:04+02:00
loge6686ae00d8d4b4b104037f3afa6b0b603c7d708
tree50710b114eeb23c7d31b6e29c9bce3fde9a515d6
parent2db133b53f80268e4e36ea43a58340bc7853bb61

Sema: copy alignment flags to pointer of slice field


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

src/Sema.zig+2-20
......@@ -26283,17 +26283,7 @@ fn fieldPtr(
2628326283 const attr_ptr_ty = if (is_pointer_to) object_ty else object_ptr_ty;
2628426284
2628526285 if (field_name.eqlSlice("ptr", ip)) {
26286 const slice_ptr_ty = inner_ty.slicePtrFieldType(zcu);
26287
26288 const result_ty = try pt.ptrType(.{
26289 .child = slice_ptr_ty.toIntern(),
26290 .flags = .{
26291 .is_const = !attr_ptr_ty.ptrIsMutable(zcu),
26292 .is_volatile = attr_ptr_ty.isVolatilePtr(zcu),
26293 .address_space = attr_ptr_ty.ptrAddressSpace(zcu),
26294 },
26295 });
26296
26286 const result_ty = try attr_ptr_ty.fieldPtrType(Value.slice_ptr_index, pt);
2629726287 if (try sema.resolveDefinedValue(block, object_ptr_src, inner_ptr)) |val| {
2629826288 return Air.internedToRef((try val.ptrField(Value.slice_ptr_index, pt)).toIntern());
2629926289 }
......@@ -26303,15 +26293,7 @@ fn fieldPtr(
2630326293 try sema.checkKnownAllocPtr(block, inner_ptr, field_ptr);
2630426294 return field_ptr;
2630526295 } else if (field_name.eqlSlice("len", ip)) {
26306 const result_ty = try pt.ptrType(.{
26307 .child = .usize_type,
26308 .flags = .{
26309 .is_const = !attr_ptr_ty.ptrIsMutable(zcu),
26310 .is_volatile = attr_ptr_ty.isVolatilePtr(zcu),
26311 .address_space = attr_ptr_ty.ptrAddressSpace(zcu),
26312 },
26313 });
26314
26296 const result_ty = try attr_ptr_ty.fieldPtrType(Value.slice_len_index, pt);
2631526297 if (try sema.resolveDefinedValue(block, object_ptr_src, inner_ptr)) |val| {
2631626298 return Air.internedToRef((try val.ptrField(Value.slice_len_index, pt)).toIntern());
2631726299 }
test/behavior/slice.zig+12
......@@ -1083,3 +1083,15 @@ test "conditionally return second argument slice" {
10831083 try expectEqualStrings("", S.foo(false, "false"));
10841084 try expectEqualStrings("true", S.foo(true, "true"));
10851085}
1086
1087test "slice field alignment" {
1088 const S = struct {
1089 fn doTheTest(p: *align(1) const []u8) !void {
1090 comptime assert(@TypeOf(&p.ptr) == *align(1) const [*]u8);
1091 comptime assert(@TypeOf(&p.len) == *align(1) const usize);
1092 try expect(p.len == 10);
1093 }
1094 };
1095 var arr: [10]u8 = @splat(0);
1096 try S.doTheTest(&&arr);
1097}