authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2024-03-19 16:14:49+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2024-03-29 07:10:57+02:00
log2d443cdabf4fc3af8f325adc4b9a96c1f41005f0
tree59e270281367683c496dab4fd879aaf391f9ad5f
parentfda9a32fef30cd2ca8af14d97d076fe6d7572f45

Sema: allow .ptr on pointer to array


2 files changed, 32 insertions(+), 1 deletions(-)

src/Sema.zig+31
......@@ -27256,6 +27256,37 @@ fn fieldPtr(
2725627256 if (ip.stringEqlSlice(field_name, "len")) {
2725727257 const int_val = try mod.intValue(Type.usize, inner_ty.arrayLen(mod));
2725827258 return anonDeclRef(sema, int_val.toIntern());
27259 } else if (ip.stringEqlSlice(field_name, "ptr") and is_pointer_to) {
27260 const ptr_info = object_ty.ptrInfo(mod);
27261 const new_ptr_ty = try sema.ptrType(.{
27262 .child = Type.fromInterned(ptr_info.child).childType(mod).toIntern(),
27263 .sentinel = if (object_ty.sentinel(mod)) |s| s.toIntern() else .none,
27264 .flags = .{
27265 .size = .Many,
27266 .alignment = ptr_info.flags.alignment,
27267 .is_const = ptr_info.flags.is_const,
27268 .is_volatile = ptr_info.flags.is_volatile,
27269 .is_allowzero = ptr_info.flags.is_allowzero,
27270 .address_space = ptr_info.flags.address_space,
27271 .vector_index = ptr_info.flags.vector_index,
27272 },
27273 .packed_offset = ptr_info.packed_offset,
27274 });
27275 const ptr_ptr_info = object_ptr_ty.ptrInfo(mod);
27276 const result_ty = try sema.ptrType(.{
27277 .child = new_ptr_ty.toIntern(),
27278 .sentinel = if (object_ptr_ty.sentinel(mod)) |s| s.toIntern() else .none,
27279 .flags = .{
27280 .alignment = ptr_ptr_info.flags.alignment,
27281 .is_const = ptr_ptr_info.flags.is_const,
27282 .is_volatile = ptr_ptr_info.flags.is_volatile,
27283 .is_allowzero = ptr_ptr_info.flags.is_allowzero,
27284 .address_space = ptr_ptr_info.flags.address_space,
27285 .vector_index = ptr_ptr_info.flags.vector_index,
27286 },
27287 .packed_offset = ptr_ptr_info.packed_offset,
27288 });
27289 return sema.bitCast(block, result_ty, object_ptr, src, null);
2725927290 } else {
2726027291 return sema.fail(
2726127292 block,
test/behavior/array.zig+1-1
......@@ -709,7 +709,7 @@ test "pointer to array has ptr field" {
709709 try std.testing.expect(arr.ptr[1] == 20);
710710 try std.testing.expect(arr.ptr[2] == 30);
711711 try std.testing.expect(arr.ptr[3] == 40);
712 try std.testing.expect(arr.ptr[4] == 50);
712 try std.testing.expect((&arr.ptr).*[4] == 50);
713713}
714714
715715test "discarded array init preserves result location" {