authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2023-06-10 00:56:29+01:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-06-10 11:12:35+03:00
log34d44e0c1c2cdfc5916dd5c56914f181f87e8d85
tree5c856f3b102be5380e718fdbd6dfbe70f9c1dfe2
parentbf4b43a2f7257c3beb202790551a1312e4dd40b1

Sema: emit error on @intToPtr with slice dest type

Resolves: #15967

2 files changed, 16 insertions(+), 0 deletions(-)

src/Sema.zig+10
...@@ -19794,6 +19794,16 @@ fn zirIntToPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -19794,6 +19794,16 @@ fn zirIntToPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
19794 const target = sema.mod.getTarget();19794 const target = sema.mod.getTarget();
19795 const ptr_align = try ptr_ty.ptrAlignmentAdvanced(target, sema);19795 const ptr_align = try ptr_ty.ptrAlignmentAdvanced(target, sema);
1979619796
19797 if (ptr_ty.isSlice()) {
19798 const msg = msg: {
19799 const msg = try sema.errMsg(block, type_src, "integer cannot be converted to slice type '{}'", .{ptr_ty.fmt(sema.mod)});
19800 errdefer msg.destroy(sema.gpa);
19801 try sema.errNote(block, type_src, msg, "slice length cannot be inferred from address", .{});
19802 break :msg msg;
19803 };
19804 return sema.failWithOwnedErrorMsg(msg);
19805 }
19806
19797 if (try sema.resolveDefinedValue(block, operand_src, operand_coerced)) |val| {19807 if (try sema.resolveDefinedValue(block, operand_src, operand_coerced)) |val| {
19798 const addr = val.toUnsignedInt(target);19808 const addr = val.toUnsignedInt(target);
19799 if (!ptr_ty.isAllowzeroPtr() and addr == 0)19809 if (!ptr_ty.isAllowzeroPtr() and addr == 0)
test/cases/compile_errors/inttoptr_non_ptr_type.zig+6
...@@ -2,8 +2,14 @@ pub export fn entry() void {...@@ -2,8 +2,14 @@ pub export fn entry() void {
2 _ = @intToPtr(i32, 10);2 _ = @intToPtr(i32, 10);
3}3}
44
5pub export fn entry2() void {
6 _ = @intToPtr([]u8, 20);
7}
8
5// error9// error
6// backend=stage210// backend=stage2
7// target=native11// target=native
8//12//
9// :2:19: error: expected pointer type, found 'i32'13// :2:19: error: expected pointer type, found 'i32'
14// :6:19: error: integer cannot be converted to slice type '[]u8'
15// :6:19: note: slice length cannot be inferred from address