From 34d44e0c1c2cdfc5916dd5c56914f181f87e8d85 Mon Sep 17 00:00:00 2001 From: mlugg Date: Sat, 10 Jun 2023 00:56:29 +0100 Subject: [PATCH] Sema: emit error on @intToPtr with slice dest type Resolves: #15967 --- src/Sema.zig | 10 ++++++++++ test/cases/compile_errors/inttoptr_non_ptr_type.zig | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/src/Sema.zig b/src/Sema.zig index 44daa02780..aed4dc7248 100644 --- a/src/Sema.zig +++ b/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) diff --git a/test/cases/compile_errors/inttoptr_non_ptr_type.zig b/test/cases/compile_errors/inttoptr_non_ptr_type.zig index 6a8af0ab95..fa308f677d 100644 --- a/test/cases/compile_errors/inttoptr_non_ptr_type.zig +++ b/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