mirror of
https://github.com/ziglang/zig.git
synced 2026-01-29 10:47:40 +00:00
There is no way to know the expected parent pointer attributes (most notably alignment) from the type of the field pointer, so provide them in the first argument.
1925 lines
57 KiB
Zig
1925 lines
57 KiB
Zig
const expect = @import("std").testing.expect;
|
|
const builtin = @import("builtin");
|
|
|
|
test "@fieldParentPtr struct" {
|
|
const C = struct {
|
|
a: bool = true,
|
|
b: f32 = 3.14,
|
|
c: struct { u8 } = .{42},
|
|
d: i32 = 12345,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = 666.667 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = .{255} };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{255} };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{255} };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = .{255} };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr extern struct" {
|
|
const C = extern struct {
|
|
a: bool = true,
|
|
b: f32 = 3.14,
|
|
c: extern struct { x: u8 } = .{ .x = 42 },
|
|
d: i32 = 12345,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = 666.667 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = .{ .x = 255 } };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr extern struct first zero-bit field" {
|
|
const C = extern struct {
|
|
a: u0 = 0,
|
|
b: f32 = 3.14,
|
|
c: i32 = 12345,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = 0 };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 0 };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 0 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = 0 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = 666.667 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = -1111111111 };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = -1111111111 };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = -1111111111 };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = -1111111111 };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr extern struct middle zero-bit field" {
|
|
const C = extern struct {
|
|
a: f32 = 3.14,
|
|
b: u0 = 0,
|
|
c: i32 = 12345,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = 666.667 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = -1111111111 };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = -1111111111 };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = -1111111111 };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = -1111111111 };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr extern struct last zero-bit field" {
|
|
const C = extern struct {
|
|
a: f32 = 3.14,
|
|
b: i32 = 12345,
|
|
c: u0 = 0,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = 666.667 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = -1111111111 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = -1111111111 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = -1111111111 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = -1111111111 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = 0 };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = 0 };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = 0 };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = 0 };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr unaligned packed struct" {
|
|
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
|
|
if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
|
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
|
|
|
const C = packed struct {
|
|
a: bool = true,
|
|
b: f32 = 3.14,
|
|
c: packed struct { x: u8 } = .{ .x = 42 },
|
|
d: i32 = 12345,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = 666.667 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = .{ .x = 255 } };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr aligned packed struct" {
|
|
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
|
|
if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
|
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
|
|
|
const C = packed struct {
|
|
a: f32 = 3.14,
|
|
b: i32 = 12345,
|
|
c: packed struct { x: u8 } = .{ .x = 42 },
|
|
d: bool = true,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = 666.667 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = -1111111111 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = -1111111111 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = -1111111111 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = -1111111111 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = .{ .x = 255 } };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .d = false };
|
|
const pcf = &c.d;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = false };
|
|
const pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = false };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .d = false };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr nested packed struct" {
|
|
if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
|
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
|
|
|
{
|
|
const C = packed struct {
|
|
a: u8,
|
|
b: packed struct {
|
|
a: u8,
|
|
b: packed struct {
|
|
a: u8,
|
|
},
|
|
},
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
|
|
const pcbba = &c.b.b.a;
|
|
const pcbb: @TypeOf(&c.b.b) = @alignCast(@fieldParentPtr(*align(1) const @TypeOf(c.b.b), "a", pcbba));
|
|
try expect(pcbb == &c.b.b);
|
|
const pcb: @TypeOf(&c.b) = @alignCast(@fieldParentPtr(*align(1) const @TypeOf(c.b), "b", pcbb));
|
|
try expect(pcb == &c.b);
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcb));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
|
|
var pcbba: @TypeOf(&c.b.b.a) = undefined;
|
|
pcbba = &c.b.b.a;
|
|
var pcbb: @TypeOf(&c.b.b) = undefined;
|
|
pcbb = @alignCast(@fieldParentPtr(*align(1) @TypeOf(c.b.b), "a", pcbba));
|
|
try expect(pcbb == &c.b.b);
|
|
var pcb: @TypeOf(&c.b) = undefined;
|
|
pcb = @alignCast(@fieldParentPtr(*align(1) @TypeOf(c.b), "b", pcbb));
|
|
try expect(pcb == &c.b);
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcb));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
{
|
|
const C = packed struct {
|
|
a: u8,
|
|
b: packed struct {
|
|
a: u9,
|
|
b: packed struct {
|
|
a: u8,
|
|
},
|
|
},
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
|
|
const pcbba = &c.b.b.a;
|
|
const pcbb: @TypeOf(&c.b.b) = @alignCast(@fieldParentPtr(*align(1:17:4) const @TypeOf(c.b.b), "a", pcbba));
|
|
try expect(pcbb == &c.b.b);
|
|
const pcb: @TypeOf(&c.b) = @alignCast(@fieldParentPtr(*align(1:8:4) const @TypeOf(c.b), "b", pcbb));
|
|
try expect(pcb == &c.b);
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcb));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
|
|
var pcbba: @TypeOf(&c.b.b.a) = undefined;
|
|
pcbba = &c.b.b.a;
|
|
var pcbb: @TypeOf(&c.b.b) = undefined;
|
|
pcbb = @alignCast(@fieldParentPtr(*align(1:17:4) @TypeOf(c.b.b), "a", pcbba));
|
|
try expect(pcbb == &c.b.b);
|
|
var pcb: @TypeOf(&c.b) = undefined;
|
|
pcb = @alignCast(@fieldParentPtr(*align(1:8:4) @TypeOf(c.b), "b", pcbb));
|
|
try expect(pcb == &c.b);
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcb));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
{
|
|
const C = packed struct {
|
|
a: u9,
|
|
b: packed struct {
|
|
a: u7,
|
|
b: packed struct {
|
|
a: u8,
|
|
},
|
|
},
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
|
|
const pcbba = &c.b.b.a;
|
|
const pcbb: @TypeOf(&c.b.b) = @alignCast(@fieldParentPtr(*align(1) const @TypeOf(c.b.b), "a", pcbba));
|
|
try expect(pcbb == &c.b.b);
|
|
const pcb: @TypeOf(&c.b) = @alignCast(@fieldParentPtr(*align(1:9:3) const @TypeOf(c.b), "b", pcbb));
|
|
try expect(pcb == &c.b);
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcb));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
|
|
var pcbba: @TypeOf(&c.b.b.a) = undefined;
|
|
pcbba = &c.b.b.a;
|
|
var pcbb: @TypeOf(&c.b.b) = undefined;
|
|
pcbb = @alignCast(@fieldParentPtr(*align(1) @TypeOf(c.b.b), "a", pcbba));
|
|
try expect(pcbb == &c.b.b);
|
|
var pcb: @TypeOf(&c.b) = undefined;
|
|
pcb = @alignCast(@fieldParentPtr(*align(1:9:3) @TypeOf(c.b), "b", pcbb));
|
|
try expect(pcb == &c.b);
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcb));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
{
|
|
const C = packed struct {
|
|
a: u9,
|
|
b: packed struct {
|
|
a: u8,
|
|
b: packed struct {
|
|
a: u8,
|
|
},
|
|
},
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
|
|
const pcbba = &c.b.b.a;
|
|
const pcbb: @TypeOf(&c.b.b) = @alignCast(@fieldParentPtr(*align(1:17:4) const @TypeOf(c.b.b), "a", pcbba));
|
|
try expect(pcbb == &c.b.b);
|
|
const pcb: @TypeOf(&c.b) = @alignCast(@fieldParentPtr(*align(1:9:4) const @TypeOf(c.b), "b", pcbb));
|
|
try expect(pcb == &c.b);
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcb));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = 0, .b = .{ .a = 0, .b = .{ .a = 0 } } };
|
|
var pcbba: @TypeOf(&c.b.b.a) = undefined;
|
|
pcbba = &c.b.b.a;
|
|
var pcbb: @TypeOf(&c.b.b) = undefined;
|
|
pcbb = @alignCast(@fieldParentPtr(*align(1:17:4) @TypeOf(c.b.b), "a", pcbba));
|
|
try expect(pcbb == &c.b.b);
|
|
var pcb: @TypeOf(&c.b) = undefined;
|
|
pcb = @alignCast(@fieldParentPtr(*align(1:9:4) @TypeOf(c.b), "b", pcbb));
|
|
try expect(pcb == &c.b);
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcb));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr packed struct first zero-bit field" {
|
|
if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
|
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
|
|
|
const C = packed struct {
|
|
a: u0 = 0,
|
|
b: f32 = 3.14,
|
|
c: i32 = 12345,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = 0 };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 0 };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 0 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = 0 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 666.667 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = 666.667 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = -1111111111 };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = -1111111111 };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = -1111111111 };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = -1111111111 };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr packed struct middle zero-bit field" {
|
|
if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
|
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
|
|
|
const C = packed struct {
|
|
a: f32 = 3.14,
|
|
b: u0 = 0,
|
|
c: i32 = 12345,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = 666.667 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = -1111111111 };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = -1111111111 };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = -1111111111 };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = -1111111111 };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr packed struct last zero-bit field" {
|
|
if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
|
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
|
|
|
const C = packed struct {
|
|
a: f32 = 3.14,
|
|
b: i32 = 12345,
|
|
c: u0 = 0,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 666.667 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = 666.667 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = -1111111111 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = -1111111111 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = -1111111111 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = -1111111111 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = 0 };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = 0 };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = 0 };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = 0 };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr tagged union" {
|
|
const C = union(enum) {
|
|
a: bool,
|
|
b: f32,
|
|
c: struct { u8 },
|
|
d: i32,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = .{255} };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{255} };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{255} };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = .{255} };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr untagged union" {
|
|
const C = union {
|
|
a: bool,
|
|
b: f32,
|
|
c: struct { u8 },
|
|
d: i32,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = .{255} };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{255} };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{255} };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = .{255} };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr extern union" {
|
|
const C = extern union {
|
|
a: bool,
|
|
b: f32,
|
|
c: extern struct { x: u8 },
|
|
d: i32,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = .{ .x = 255 } };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr packed union" {
|
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
|
|
|
const C = packed union {
|
|
a: bool,
|
|
b: f32,
|
|
c: packed struct { x: u8 },
|
|
d: i32,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = false };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
const pcf = &c.c;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
const pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .c = .{ .x = 255 } };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .c = .{ .x = 255 } };
|
|
var pcf: @TypeOf(&c.c) = undefined;
|
|
pcf = &c.c;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "c", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
const pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .d = -1111111111 };
|
|
var pcf: @TypeOf(&c.d) = undefined;
|
|
pcf = &c.d;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "d", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|
|
|
|
test "@fieldParentPtr tagged union all zero-bit fields" {
|
|
if (builtin.zig_backend == .stage2_llvm) return error.SkipZigTest;
|
|
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
|
|
|
const C = union(enum) {
|
|
a: u0,
|
|
b: i0,
|
|
};
|
|
|
|
{
|
|
const c: C = .{ .a = 0 };
|
|
const pcf = &c.a;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 0 };
|
|
const pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .a = 0 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .a = 0 };
|
|
var pcf: @TypeOf(&c.a) = undefined;
|
|
pcf = &c.a;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "a", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
const pc: *const C = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
const pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
const c: C = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *const C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) const C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
{
|
|
var c: C = undefined;
|
|
c = .{ .b = 0 };
|
|
var pcf: @TypeOf(&c.b) = undefined;
|
|
pcf = &c.b;
|
|
var pc: *C = undefined;
|
|
pc = @alignCast(@fieldParentPtr(*align(1) C, "b", pcf));
|
|
try expect(pc == &c);
|
|
}
|
|
}
|