aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2024-03-19 16:14:49 +0200
committerVeikka Tuominen <git@vexu.eu>2024-03-29 07:10:57 +0200
commit2d443cdabf4fc3af8f325adc4b9a96c1f41005f0 (patch)
tree59e270281367683c496dab4fd879aaf391f9ad5f /src/Sema.zig
parentfda9a32fef30cd2ca8af14d97d076fe6d7572f45 (diff)
downloadzig-2d443cdabf4fc3af8f325adc4b9a96c1f41005f0.tar.gz
zig-2d443cdabf4fc3af8f325adc4b9a96c1f41005f0.zip
Sema: allow .ptr on pointer to array
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 4541d02f66..7db354334a 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -27256,6 +27256,37 @@ fn fieldPtr(
if (ip.stringEqlSlice(field_name, "len")) {
const int_val = try mod.intValue(Type.usize, inner_ty.arrayLen(mod));
return anonDeclRef(sema, int_val.toIntern());
+ } else if (ip.stringEqlSlice(field_name, "ptr") and is_pointer_to) {
+ const ptr_info = object_ty.ptrInfo(mod);
+ const new_ptr_ty = try sema.ptrType(.{
+ .child = Type.fromInterned(ptr_info.child).childType(mod).toIntern(),
+ .sentinel = if (object_ty.sentinel(mod)) |s| s.toIntern() else .none,
+ .flags = .{
+ .size = .Many,
+ .alignment = ptr_info.flags.alignment,
+ .is_const = ptr_info.flags.is_const,
+ .is_volatile = ptr_info.flags.is_volatile,
+ .is_allowzero = ptr_info.flags.is_allowzero,
+ .address_space = ptr_info.flags.address_space,
+ .vector_index = ptr_info.flags.vector_index,
+ },
+ .packed_offset = ptr_info.packed_offset,
+ });
+ const ptr_ptr_info = object_ptr_ty.ptrInfo(mod);
+ const result_ty = try sema.ptrType(.{
+ .child = new_ptr_ty.toIntern(),
+ .sentinel = if (object_ptr_ty.sentinel(mod)) |s| s.toIntern() else .none,
+ .flags = .{
+ .alignment = ptr_ptr_info.flags.alignment,
+ .is_const = ptr_ptr_info.flags.is_const,
+ .is_volatile = ptr_ptr_info.flags.is_volatile,
+ .is_allowzero = ptr_ptr_info.flags.is_allowzero,
+ .address_space = ptr_ptr_info.flags.address_space,
+ .vector_index = ptr_ptr_info.flags.vector_index,
+ },
+ .packed_offset = ptr_ptr_info.packed_offset,
+ });
+ return sema.bitCast(block, result_ty, object_ptr, src, null);
} else {
return sema.fail(
block,