authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-11-24 20:25:14-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-11-24 20:25:14-05:00
logb9f88c3552c0ac892aa6dba7ed8518a0aee51305
tree708d70c749f2501ad8b3b57f0870c5ad4ee6a0bc
parentce96323ba15309c08b868c442ef4511c244e2e83
signaturelock-open Commit is signed but in an unrecognized format.

fix compile errors for array sentinels mismatching


2 files changed, 25 insertions(+), 7 deletions(-)

src/ir.cpp+10-4
......@@ -12661,21 +12661,27 @@ static void report_recursive_error(IrAnalyze *ira, AstNode *source_node, ConstCa
1266112661 {
1266212662 Buf *txt_msg = buf_sprintf("destination pointer requires a terminating '");
1266312663 render_const_value(ira->codegen, txt_msg, wanted_type->data.pointer.sentinel);
12664 buf_appendf(txt_msg, "' sentinel value");
12664 buf_appendf(txt_msg, "' sentinel");
1266512665 if (actual_type->data.pointer.sentinel != nullptr) {
1266612666 buf_appendf(txt_msg, ", but source pointer has a terminating '");
1266712667 render_const_value(ira->codegen, txt_msg, actual_type->data.pointer.sentinel);
12668 buf_appendf(txt_msg, "' sentinel value");
12668 buf_appendf(txt_msg, "' sentinel");
1266912669 }
1267012670 add_error_note(ira->codegen, parent_msg, source_node, txt_msg);
1267112671 }
1267212672 break;
1267312673 }
1267412674 case ConstCastResultIdSentinelArrays: {
12675 ZigType *actual_type = cast_result->data.sentinel_arrays->actual_type;
1267512676 ZigType *wanted_type = cast_result->data.sentinel_arrays->wanted_type;
1267612677 Buf *txt_msg = buf_sprintf("destination array requires a terminating '");
12677 render_const_value(ira->codegen, txt_msg, wanted_type->data.pointer.sentinel);
12678 buf_appendf(txt_msg, "' sentinel value");
12678 render_const_value(ira->codegen, txt_msg, wanted_type->data.array.sentinel);
12679 buf_appendf(txt_msg, "' sentinel");
12680 if (actual_type->data.array.sentinel != nullptr) {
12681 buf_appendf(txt_msg, ", but source array has a terminating '");
12682 render_const_value(ira->codegen, txt_msg, actual_type->data.array.sentinel);
12683 buf_appendf(txt_msg, "' sentinel");
12684 }
1267912685 add_error_note(ira->codegen, parent_msg, source_node, txt_msg);
1268012686 break;
1268112687 }
test/compile_errors.zig+15-3
......@@ -3,18 +3,30 @@ const builtin = @import("builtin");
33
44pub fn addCases(cases: *tests.CompileErrorContext) void {
55 cases.add(
6 "incompatible pointer sentinels",
6 "incompatible sentinels",
77 \\export fn entry1(ptr: [*:255]u8) [*:0]u8 {
88 \\ return ptr;
99 \\}
1010 \\export fn entry2(ptr: [*]u8) [*:0]u8 {
1111 \\ return ptr;
1212 \\}
13 \\export fn entry3() void {
14 \\ var array: [2:0]u8 = [_:255]u8{1, 2};
15 \\}
16 \\export fn entry4() void {
17 \\ var array: [2:0]u8 = [_]u8{1, 2};
18 \\}
1319 ,
1420 "tmp.zig:2:12: error: expected type '[*:0]u8', found '[*:255]u8'",
15 "tmp.zig:2:12: note: destination pointer requires a terminating '0' sentinel value, but source pointer has a terminating '255' sentinel value",
21 "tmp.zig:2:12: note: destination pointer requires a terminating '0' sentinel, but source pointer has a terminating '255' sentinel",
1622 "tmp.zig:5:12: error: expected type '[*:0]u8', found '[*]u8'",
17 "tmp.zig:5:12: note: destination pointer requires a terminating '0' sentinel value",
23 "tmp.zig:5:12: note: destination pointer requires a terminating '0' sentinel",
24
25 "tmp.zig:8:35: error: expected type '[2:0]u8', found '[2:255]u8'",
26 "tmp.zig:8:35: note: destination array requires a terminating '0' sentinel, but source array has a terminating '255' sentinel",
27 "tmp.zig:11:31: error: expected type '[2:0]u8', found '[2]u8'",
28 "tmp.zig:11:31: note: destination array requires a terminating '0' sentinel",
29
1830 );
1931
2032 cases.add(