diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2022-10-17 22:10:22 -0400 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-10-18 14:16:39 +0200 |
| commit | 687a7d38a00e187a75c43617d8de6fefaffb5449 (patch) | |
| tree | 8adf485f0c6213d3f89b37a535df9a2a21176c45 /src/value.zig | |
| parent | edc842ff18e19d8c07cde1199f72903356fbf77f (diff) | |
| download | zig-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.zig | 22 |
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, |
