diff --git a/src/ir.cpp b/src/ir.cpp index 79596d1d91..5e8d3c3a5a 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -10838,8 +10838,11 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst { ZigType *slice_ptr_type = wanted_type->data.structure.fields[slice_ptr_index].type_entry; assert(slice_ptr_type->id == ZigTypeIdPointer); - if (types_match_const_cast_only(ira, slice_ptr_type->data.pointer.child_type, - actual_type->data.pointer.child_type->data.array.child_type, source_node, + ZigType *array_type = actual_type->data.pointer.child_type; + bool const_ok = (slice_ptr_type->data.pointer.is_const || array_type->data.array.len == 0 + || !actual_type->data.pointer.is_const); + if (const_ok && types_match_const_cast_only(ira, slice_ptr_type->data.pointer.child_type, + array_type->data.array.child_type, source_node, !slice_ptr_type->data.pointer.is_const).id == ConstCastResultIdOk) { return ir_resolve_ptr_of_array_to_slice(ira, source_instr, value, wanted_type); diff --git a/test/compile_errors.zig b/test/compile_errors.zig index 0b1446b518..dfe17e9d82 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -1,6 +1,16 @@ const tests = @import("tests.zig"); pub fn addCases(cases: *tests.CompileErrorContext) void { + cases.add( + "implicit cast const array to mutable slice", + \\export fn entry() void { + \\ const buffer: [1]u8 = []u8{8}; + \\ const sliceA: []u8 = &buffer; + \\} + , + ".tmp_source.zig:3:27: error: expected type '[]u8', found '*const [1]u8'", + ); + cases.add( "deref slice and get len field", \\export fn entry() void {