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 {...@@ -11197,7 +11197,9 @@ const ParamTypeIterator = struct {
11197 .Unspecified, .Inline => {11197 .Unspecified, .Inline => {
11198 it.zig_index += 1;11198 it.zig_index += 1;
11199 it.llvm_index += 1;11199 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 {
11201 it.llvm_index += 1;11203 it.llvm_index += 1;
11202 return .slice;11204 return .slice;
11203 } else if (isByRef(ty, mod)) {11205 } else if (isByRef(ty, mod)) {
test/behavior/optional.zig+17
...@@ -448,6 +448,23 @@ test "Optional slice size is optimized" {...@@ -448,6 +448,23 @@ test "Optional slice size is optimized" {
448 try expectEqualStrings(a.?, "hello");448 try expectEqualStrings(a.?, "hello");
449}449}
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
451test "peer type resolution in nested if expressions" {468test "peer type resolution in nested if expressions" {
452 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;469 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
453 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;470 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;