Commit 34d44e0c1c

mlugg <mlugg@mlugg.co.uk>
2023-06-10 01:56:29
Sema: emit error on @intToPtr with slice dest type
Resolves: #15967
1 parent bf4b43a
Changed files (2)
src
test
cases
src/Sema.zig
@@ -19794,6 +19794,16 @@ fn zirIntToPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
     const target = sema.mod.getTarget();
     const ptr_align = try ptr_ty.ptrAlignmentAdvanced(target, sema);
 
+    if (ptr_ty.isSlice()) {
+        const msg = msg: {
+            const msg = try sema.errMsg(block, type_src, "integer cannot be converted to slice type '{}'", .{ptr_ty.fmt(sema.mod)});
+            errdefer msg.destroy(sema.gpa);
+            try sema.errNote(block, type_src, msg, "slice length cannot be inferred from address", .{});
+            break :msg msg;
+        };
+        return sema.failWithOwnedErrorMsg(msg);
+    }
+
     if (try sema.resolveDefinedValue(block, operand_src, operand_coerced)) |val| {
         const addr = val.toUnsignedInt(target);
         if (!ptr_ty.isAllowzeroPtr() and addr == 0)
test/cases/compile_errors/inttoptr_non_ptr_type.zig
@@ -2,8 +2,14 @@ pub export fn entry() void {
     _ = @intToPtr(i32, 10);
 }
 
+pub export fn entry2() void {
+    _ = @intToPtr([]u8, 20);
+}
+
 // error
 // backend=stage2
 // target=native
 //
 // :2:19: error: expected pointer type, found 'i32'
+// :6:19: error: integer cannot be converted to slice type '[]u8'
+// :6:19: note: slice length cannot be inferred from address