aboutsummaryrefslogtreecommitdiff
path: root/src/value.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2022-10-17 22:10:22 -0400
committerVeikka Tuominen <git@vexu.eu>2022-10-18 14:16:39 +0200
commit687a7d38a00e187a75c43617d8de6fefaffb5449 (patch)
tree8adf485f0c6213d3f89b37a535df9a2a21176c45 /src/value.zig
parentedc842ff18e19d8c07cde1199f72903356fbf77f (diff)
downloadzig-687a7d38a00e187a75c43617d8de6fefaffb5449.tar.gz
zig-687a7d38a00e187a75c43617d8de6fefaffb5449.zip
value: implement `Value.eqlAdvanced` on slices
* Support comparison between implicitly casted array pointer and slice. * Support comparison between slices with different value tags. Closes #12700
Diffstat (limited to 'src/value.zig')
-rw-r--r--src/value.zig22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/value.zig b/src/value.zig
index 4c6a64eefc..e34fbcee16 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -2260,6 +2260,28 @@ pub const Value = extern union {
}
return true;
},
+ .Pointer => switch (ty.ptrSize()) {
+ .Slice => {
+ const a_len = switch (a_ty.ptrSize()) {
+ .Slice => a.sliceLen(mod),
+ .One => a_ty.childType().arrayLen(),
+ else => unreachable,
+ };
+ if (a_len != b.sliceLen(mod)) {
+ return false;
+ }
+
+ var ptr_buf: Type.SlicePtrFieldTypeBuffer = undefined;
+ const ptr_ty = ty.slicePtrFieldType(&ptr_buf);
+ const a_ptr = switch (a_ty.ptrSize()) {
+ .Slice => a.slicePtr(),
+ .One => a,
+ else => unreachable,
+ };
+ return try eqlAdvanced(a_ptr, ptr_ty, b.slicePtr(), ptr_ty, mod, sema_kit);
+ },
+ .Many, .C, .One => {},
+ },
.Struct => {
// A struct can be represented with one of:
// .empty_struct_value,