mirror of
https://github.com/ziglang/zig.git
synced 2026-02-21 16:54:52 +00:00
parent
e2dc77ab62
commit
15cc4514e0
@ -3779,6 +3779,7 @@ fn validateStructInit(
|
||||
if ((is_comptime or block.is_comptime) and
|
||||
(try sema.resolveDefinedValue(block, init_src, struct_ptr)) != null)
|
||||
{
|
||||
try sema.resolveStructLayout(block, init_src, struct_ty);
|
||||
// In this case the only thing we need to do is evaluate the implicit
|
||||
// store instructions for default field values, and report any missing fields.
|
||||
// Avoid the cost of the extra machinery for detecting a comptime struct init value.
|
||||
@ -3973,6 +3974,7 @@ fn validateStructInit(
|
||||
try sema.storePtr2(block, init_src, struct_ptr, init_src, struct_init, init_src, .store);
|
||||
return;
|
||||
}
|
||||
try sema.resolveStructLayout(block, init_src, struct_ty);
|
||||
|
||||
// Our task is to insert `store` instructions for all the default field values.
|
||||
for (found_fields) |field_ptr, i| {
|
||||
@ -15843,6 +15845,7 @@ fn finishStructInit(
|
||||
}
|
||||
|
||||
if (is_ref) {
|
||||
try sema.resolveStructLayout(block, dest_src, struct_ty);
|
||||
const target = sema.mod.getTarget();
|
||||
const alloc_ty = try Type.ptr(sema.arena, sema.mod, .{
|
||||
.pointee_type = struct_ty,
|
||||
@ -28850,7 +28853,7 @@ pub fn typeHasOnePossibleValue(
|
||||
for (tuple.values) |val, i| {
|
||||
const is_comptime = val.tag() != .unreachable_value;
|
||||
if (is_comptime) continue;
|
||||
if ((try sema.typeHasOnePossibleValue(block, src, tuple.types[i])) != null) continue;
|
||||
if ((try sema.typeHasOnePossibleValue(block, src, tuple.types[i])) != null) continue;
|
||||
return null;
|
||||
}
|
||||
return Value.initTag(.empty_struct_value);
|
||||
|
||||
@ -564,3 +564,18 @@ test "nested packed struct field access test" {
|
||||
try std.testing.expect(arg.g.h == 6);
|
||||
try std.testing.expect(arg.g.i == 8);
|
||||
}
|
||||
|
||||
test "runtime init of unnamed packed struct type" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
|
||||
var z: u8 = 123;
|
||||
try (packed struct {
|
||||
x: u8,
|
||||
pub fn m(s: @This()) !void {
|
||||
try expect(s.x == 123);
|
||||
}
|
||||
}{ .x = z }).m();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user