zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit faeb0ef032cbe941d5593c9e72ebfefaa994f70b (tree)
parent 3f6e651d5a850bb9623e628aa83cd9d70e83c417
Author: Veikka Tuominen <git@vexu.eu>
Date:   Mon,  8 Jan 2024 01:23:17 +0200

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

Closes #18428

Diffstat:
Msrc/codegen/llvm.zig | 4+++-
Mtest/behavior/optional.zig | 17+++++++++++++++++
2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig @@ -11197,7 +11197,9 @@ const ParamTypeIterator = struct { .Unspecified, .Inline => { it.zig_index += 1; it.llvm_index += 1; - if (ty.isSlice(mod) or (ty.zigTypeTag(mod) == .Optional and ty.optionalChild(mod).isSlice(mod))) { + if (ty.isSlice(mod) or + (ty.zigTypeTag(mod) == .Optional and ty.optionalChild(mod).isSlice(mod) and !ty.ptrAllowsZero(mod))) + { it.llvm_index += 1; return .slice; } else if (isByRef(ty, mod)) { diff --git a/test/behavior/optional.zig b/test/behavior/optional.zig @@ -448,6 +448,23 @@ test "Optional slice size is optimized" { try expectEqualStrings(a.?, "hello"); } +test "Optional slice passed to function" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const S = struct { + fn foo(a: ?[]const u8) !void { + try std.testing.expectEqualStrings(a.?, "foo"); + } + fn bar(a: ?[]allowzero const u8) !void { + try std.testing.expectEqualStrings(@ptrCast(a.?), "bar"); + } + }; + try S.foo("foo"); + try S.bar("bar"); +} + test "peer type resolution in nested if expressions" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;