From 687a7d38a00e187a75c43617d8de6fefaffb5449 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Mon, 17 Oct 2022 22:10:22 -0400 Subject: [PATCH] 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 --- src/value.zig | 22 ++++++++++++++++++++++ test/behavior/generics.zig | 14 ++++++++++++++ 2 files changed, 36 insertions(+) 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, diff --git a/test/behavior/generics.zig b/test/behavior/generics.zig index 9ec949bbf5..4a483ec0d5 100644 --- a/test/behavior/generics.zig +++ b/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])); +}