authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-10-03 14:12:08+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-10-05 17:26:29+03:00
logba4aa12098a0a9def52582cecd5b0b664ded14d8
treefbb7caad7c97b10a7db6f07a7d76d1fd026390b8
parent40578656e85a4bd930b03c143f179d43a925d151

Sema: use correct value when `@ptrCast` operand is comptime known

Closes #13034

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

src/Sema.zig+1-1
......@@ -18352,7 +18352,7 @@ fn zirPtrCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
1835218352 return sema.failWithOwnedErrorMsg(msg);
1835318353 }
1835418354
18355 if (try sema.resolveMaybeUndefVal(block, operand_src, operand)) |operand_val| {
18355 if (try sema.resolveMaybeUndefVal(block, operand_src, ptr)) |operand_val| {
1835618356 if (!dest_ty.ptrAllowsZero() and operand_val.isUndef()) {
1835718357 return sema.failWithUseOfUndef(block, operand_src);
1835818358 }
test/behavior/pointers.zig+11
......@@ -483,3 +483,14 @@ test "pointer to constant decl preserves alignment" {
483483 const alignment = @typeInfo(@TypeOf(&S.aligned)).Pointer.alignment;
484484 try std.testing.expect(alignment == 8);
485485}
486
487test "ptrCast comptime known slice to C pointer" {
488 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
489 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
490 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
491 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
492
493 const s: [:0]const u8 = "foo";
494 var p = @ptrCast([*c]const u8, s);
495 try std.testing.expectEqualStrings(s, std.mem.sliceTo(p, 0));
496}