aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-12-01 11:49:06 +0200
committerVeikka Tuominen <git@vexu.eu>2022-12-01 11:49:06 +0200
commitd0edaabf9d5fd4a8a8e43aef38d8970781dd1c86 (patch)
treedfae257fa21ba3489fb623b15ad425f2b5a3a427
parent98037a02384cdd9fa9c71210fb35d24b82e61f36 (diff)
downloadzig-d0edaabf9d5fd4a8a8e43aef38d8970781dd1c86.tar.gz
zig-d0edaabf9d5fd4a8a8e43aef38d8970781dd1c86.zip
Value: fix elemValueAdvanced for optional payloads
Closes #13707
-rw-r--r--src/value.zig6
-rw-r--r--test/behavior/type.zig22
2 files changed, 28 insertions, 0 deletions
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);
+ }
+ }
+}