authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2024-01-08 01:23:17+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2024-01-08 06:57:06+02:00
logfaeb0ef032cbe941d5593c9e72ebfefaa994f70b
tree9f50ffedb095a117e034e036e8ec9dbc19343c3d
parent3f6e651d5a850bb9623e628aa83cd9d70e83c417

llvm: optional slices cannot be passed in parts when they allowzero

Closes #18428

2 files changed, 20 insertions(+), 1 deletions(-)

src/codegen/llvm.zig+3-1
......@@ -11197,7 +11197,9 @@ const ParamTypeIterator = struct {
1119711197 .Unspecified, .Inline => {
1119811198 it.zig_index += 1;
1119911199 it.llvm_index += 1;
11200 if (ty.isSlice(mod) or (ty.zigTypeTag(mod) == .Optional and ty.optionalChild(mod).isSlice(mod))) {
11200 if (ty.isSlice(mod) or
11201 (ty.zigTypeTag(mod) == .Optional and ty.optionalChild(mod).isSlice(mod) and !ty.ptrAllowsZero(mod)))
11202 {
1120111203 it.llvm_index += 1;
1120211204 return .slice;
1120311205 } else if (isByRef(ty, mod)) {
test/behavior/optional.zig+17
......@@ -448,6 +448,23 @@ test "Optional slice size is optimized" {
448448 try expectEqualStrings(a.?, "hello");
449449}
450450
451test "Optional slice passed to function" {
452 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
453 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
454 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
455
456 const S = struct {
457 fn foo(a: ?[]const u8) !void {
458 try std.testing.expectEqualStrings(a.?, "foo");
459 }
460 fn bar(a: ?[]allowzero const u8) !void {
461 try std.testing.expectEqualStrings(@ptrCast(a.?), "bar");
462 }
463 };
464 try S.foo("foo");
465 try S.bar("bar");
466}
467
451468test "peer type resolution in nested if expressions" {
452469 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
453470 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;