diff --git a/src/Sema.zig b/src/Sema.zig index b4dd9fbd6649fbfcf3227ef1e664a73af721385f..504a335b53b6fba06dc87ccc50d3abed7d1cc85e 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -27289,6 +27289,7 @@ fn coerceExtra( // coercion from C pointer if (inst_ty.isCPtr(mod)) src_c_ptr: { + if (dest_info.flags.size == .Slice) break :src_c_ptr; if (!sema.checkPtrAttributes(dest_ty, inst_ty, &in_memory_result)) break :src_c_ptr; // In this case we must add a safety check because the C pointer // could be null. diff --git a/test/cases/compile_errors/ptr_coerced_to_slice.zig b/test/cases/compile_errors/ptr_coerced_to_slice.zig new file mode 100644 index 0000000000000000000000000000000000000000..2b96f830648fd460fe647187cf3335858b99a333 --- /dev/null +++ b/test/cases/compile_errors/ptr_coerced_to_slice.zig @@ -0,0 +1,20 @@ +export fn foo() void { + const ptr: [*]const u8 = "abc"; + _ = @as([]const u8, ptr); +} +export fn bar() void { + const ptr: [*c]const u8 = "def"; + _ = @as([]const u8, ptr); +} +export fn baz() void { + const ptr: *const u8 = &@as(u8, 123); + _ = @as([]const u8, ptr); +} + +// error +// backend=stage2 +// target=native +// +// :3:25: error: expected type '[]const u8', found '[*]const u8' +// :7:25: error: expected type '[]const u8', found '[*c]const u8' +// :11:25: error: expected type '[]const u8', found '*const u8'