Commit 9c8dfadbb1

Andrew Kelley <superjoe30@gmail.com>
2018-09-20 18:24:51
add compile error for casting const array to mutable slice
See #1565
1 parent f8fe517
Changed files (2)
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);
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 {