commit 9c8dfadbb1b95703a1503ae3a508f5acc29e7695 (tree)
parent f8fe517d126d582e37ab4537fe9fd42f0531f44b
Author: Andrew Kelley <superjoe30@gmail.com>
Date: Thu, 20 Sep 2018 12:24:51 -0400
add compile error for casting const array to mutable slice
See #1565
Diffstat:
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git 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
@@ -2,6 +2,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 {
\\ var a: []u8 = undefined;