Skip to content

Commit c830606

Browse files
committed
stage2: Support @fieldParentPtr for tuples and anon structs
1 parent 51a8f52 commit c830606

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

src/Sema.zig

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17173,24 +17173,30 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr
1717317173
}
1717417174
try sema.resolveTypeLayout(block, ty_src, struct_ty);
1717517175

17176-
const struct_obj = struct_ty.castTag(.@"struct").?.data;
17177-
const field_index = struct_obj.fields.getIndex(field_name) orelse
17178-
return sema.failWithBadStructFieldAccess(block, struct_obj, name_src, field_name);
17176+
const field_index = if (struct_ty.isTuple()) b: {
17177+
if (std.fmt.parseUnsigned(u32, field_name, 10)) |idx| {
17178+
if (idx < struct_ty.structFieldCount()) break :b idx;
17179+
} else |_| {}
17180+
return sema.fail(block, name_src, "tuple '{}' has no such field '{s}'", .{
17181+
struct_ty.fmt(sema.mod), field_name,
17182+
});
17183+
} else try sema.structFieldIndex(block, struct_ty, field_name, name_src);
1717917184

1718017185
try sema.checkPtrOperand(block, ptr_src, field_ptr_ty);
17181-
const field = struct_obj.fields.values()[field_index];
1718217186
const field_ptr_ty_info = field_ptr_ty.ptrInfo().data;
1718317187

1718417188
var ptr_ty_data: Type.Payload.Pointer.Data = .{
17185-
.pointee_type = field.ty,
17189+
.pointee_type = struct_ty.structFieldType(field_index),
1718617190
.mutable = field_ptr_ty_info.mutable,
1718717191
.@"addrspace" = field_ptr_ty_info.@"addrspace",
1718817192
};
1718917193

17190-
if (struct_obj.layout == .Packed) {
17194+
if (struct_ty.containerLayout() == .Packed) {
1719117195
return sema.fail(block, src, "TODO handle packed structs with @fieldParentPtr", .{});
1719217196
} else {
17193-
ptr_ty_data.@"align" = field.abi_align;
17197+
ptr_ty_data.@"align" = if (struct_ty.castTag(.@"struct")) |struct_obj| b: {
17198+
break :b struct_obj.data.fields.values()[field_index].abi_align;
17199+
} else 0;
1719417200
}
1719517201

1719617202
const actual_field_ptr_ty = try Type.ptr(sema.arena, sema.mod, ptr_ty_data);

test/behavior/tuple.zig

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,15 +205,21 @@ test "initializing anon struct with explicit type" {
205205
}
206206

207207
test "fieldParentPtr of tuple" {
208-
if (builtin.zig_backend != .stage1) return error.SkipZigTest;
208+
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
209+
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
210+
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
211+
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
209212

210213
var x: u32 = 0;
211214
const tuple = .{ x, x };
212215
try testing.expect(&tuple == @fieldParentPtr(@TypeOf(tuple), "1", &tuple[1]));
213216
}
214217

215218
test "fieldParentPtr of anon struct" {
216-
if (builtin.zig_backend != .stage1) return error.SkipZigTest;
219+
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
220+
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
221+
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
222+
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
217223

218224
var x: u32 = 0;
219225
const anon_st = .{ .foo = x, .bar = x };

0 commit comments

Comments
 (0)