From d0edaabf9d5fd4a8a8e43aef38d8970781dd1c86 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Thu, 1 Dec 2022 11:49:06 +0200 Subject: [PATCH] Value: fix elemValueAdvanced for optional payloads Closes #13707 --- src/value.zig | 6 ++++++ test/behavior/type.zig | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/value.zig b/src/value.zig index a029be6c7b..be643f65a3 100644 --- a/src/value.zig +++ b/src/value.zig @@ -2895,6 +2895,12 @@ pub const Value = extern union { return val; }, + .opt_payload_ptr => return val.castTag(.opt_payload_ptr).?.data.container_ptr.elemValueAdvanced(mod, index, arena, buffer), + .eu_payload_ptr => return val.castTag(.eu_payload_ptr).?.data.container_ptr.elemValueAdvanced(mod, index, arena, buffer), + + .opt_payload => return val.castTag(.opt_payload).?.data.elemValueAdvanced(mod, index, arena, buffer), + .eu_payload => return val.castTag(.eu_payload).?.data.elemValueAdvanced(mod, index, arena, buffer), + else => unreachable, } } diff --git a/test/behavior/type.zig b/test/behavior/type.zig index 81aeda6171..556a8c990d 100644 --- a/test/behavior/type.zig +++ b/test/behavior/type.zig @@ -535,3 +535,25 @@ test "Type.Fn" { try std.testing.expectEqual(T, fn_type); } } + +test "reified struct field name from optional payload" { + comptime { + const m_name: ?[1]u8 = "a".*; + if (m_name) |*name| { + const T = @Type(.{ .Struct = .{ + .layout = .Auto, + .fields = &.{.{ + .name = name, + .field_type = u8, + .default_value = null, + .is_comptime = false, + .alignment = 1, + }}, + .decls = &.{}, + .is_tuple = false, + } }); + var t: T = .{ .a = 123 }; + try std.testing.expect(t.a == 123); + } + } +}