Commit 687a7d38a0

Jacob Young <jacobly0@users.noreply.github.com>
2022-10-18 04:10:22
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
1 parent edc842f
Changed files (2)
src
test
behavior
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,
test/behavior/generics.zig
@@ -382,3 +382,17 @@ test "generic struct as parameter type" {
     try S.doTheTest(u32, .{ .int = 123 });
     try S.doTheTest2(i32, .{ .int = 456 });
 }
+
+test "slice as parameter type" {
+    const S = struct {
+        fn internComptimeString(comptime str: []const u8) *const []const u8 {
+            return &struct {
+                const intern: []const u8 = str;
+            }.intern;
+        }
+    };
+
+    const source_a = "this is a string";
+    try expect(S.internComptimeString(source_a[1..2]) == S.internComptimeString(source_a[1..2]));
+    try expect(S.internComptimeString(source_a[2..4]) != S.internComptimeString(source_a[5..7]));
+}