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(...@@ -26283,17 +26283,7 @@ fn fieldPtr(
26283 const attr_ptr_ty = if (is_pointer_to) object_ty else object_ptr_ty;26283 const attr_ptr_ty = if (is_pointer_to) object_ty else object_ptr_ty;
2628426284
26285 if (field_name.eqlSlice("ptr", ip)) {26285 if (field_name.eqlSlice("ptr", ip)) {
26286 const slice_ptr_ty = inner_ty.slicePtrFieldType(zcu);26286 const result_ty = try attr_ptr_ty.fieldPtrType(Value.slice_ptr_index, pt);
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
26297 if (try sema.resolveDefinedValue(block, object_ptr_src, inner_ptr)) |val| {26287 if (try sema.resolveDefinedValue(block, object_ptr_src, inner_ptr)) |val| {
26298 return Air.internedToRef((try val.ptrField(Value.slice_ptr_index, pt)).toIntern());26288 return Air.internedToRef((try val.ptrField(Value.slice_ptr_index, pt)).toIntern());
26299 }26289 }
...@@ -26303,15 +26293,7 @@ fn fieldPtr(...@@ -26303,15 +26293,7 @@ fn fieldPtr(
26303 try sema.checkKnownAllocPtr(block, inner_ptr, field_ptr);26293 try sema.checkKnownAllocPtr(block, inner_ptr, field_ptr);
26304 return field_ptr;26294 return field_ptr;
26305 } else if (field_name.eqlSlice("len", ip)) {26295 } else if (field_name.eqlSlice("len", ip)) {
26306 const result_ty = try pt.ptrType(.{26296 const result_ty = try attr_ptr_ty.fieldPtrType(Value.slice_len_index, pt);
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
26315 if (try sema.resolveDefinedValue(block, object_ptr_src, inner_ptr)) |val| {26297 if (try sema.resolveDefinedValue(block, object_ptr_src, inner_ptr)) |val| {
26316 return Air.internedToRef((try val.ptrField(Value.slice_len_index, pt)).toIntern());26298 return Air.internedToRef((try val.ptrField(Value.slice_len_index, pt)).toIntern());
26317 }26299 }
test/behavior/slice.zig+12
...@@ -1083,3 +1083,15 @@ test "conditionally return second argument slice" {...@@ -1083,3 +1083,15 @@ test "conditionally return second argument slice" {
1083 try expectEqualStrings("", S.foo(false, "false"));1083 try expectEqualStrings("", S.foo(false, "false"));
1084 try expectEqualStrings("true", S.foo(true, "true"));1084 try expectEqualStrings("true", S.foo(true, "true"));
1085}1085}
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}