authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-10-26 00:32:30-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-10-26 00:32:30-04:00
logc7053bea204f87fe1c8b28ec97b27003a24dcafc
treee6607a7abb0ae8a9f86e31e146a72e7c71ce1c73
parent300c83d8930d15d4bc4e34fe11e3b6bf3130ecc4

better output when @cImport generates invalid zig


2 files changed, 26 insertions(+), 6 deletions(-)

src/analyze.cpp+25-6
...@@ -27,9 +27,17 @@ static void resolve_enum_zero_bits(CodeGen *g, TypeTableEntry *enum_type);...@@ -27,9 +27,17 @@ static void resolve_enum_zero_bits(CodeGen *g, TypeTableEntry *enum_type);
27static void resolve_union_zero_bits(CodeGen *g, TypeTableEntry *union_type);27static void resolve_union_zero_bits(CodeGen *g, TypeTableEntry *union_type);
2828
29ErrorMsg *add_node_error(CodeGen *g, AstNode *node, Buf *msg) {29ErrorMsg *add_node_error(CodeGen *g, AstNode *node, Buf *msg) {
30 // if this assert fails, then parsec generated code that30 if (node->owner->c_import_node != nullptr) {
31 // failed semantic analysis, which isn't supposed to happen31 // if this happens, then parsec generated code that
32 assert(!node->owner->c_import_node);32 // failed semantic analysis, which isn't supposed to happen
33 ErrorMsg *err = add_node_error(g, node->owner->c_import_node,
34 buf_sprintf("compiler bug: @cImport generated invalid zig code"));
35
36 add_error_note(g, err, node, msg);
37
38 g->errors.append(err);
39 return err;
40 }
3341
34 ErrorMsg *err = err_msg_create_with_line(node->owner->path, node->line, node->column,42 ErrorMsg *err = err_msg_create_with_line(node->owner->path, node->line, node->column,
35 node->owner->source_code, node->owner->line_offsets, msg);43 node->owner->source_code, node->owner->line_offsets, msg);
...@@ -39,9 +47,20 @@ ErrorMsg *add_node_error(CodeGen *g, AstNode *node, Buf *msg) {...@@ -39,9 +47,20 @@ ErrorMsg *add_node_error(CodeGen *g, AstNode *node, Buf *msg) {
39}47}
4048
41ErrorMsg *add_error_note(CodeGen *g, ErrorMsg *parent_msg, AstNode *node, Buf *msg) {49ErrorMsg *add_error_note(CodeGen *g, ErrorMsg *parent_msg, AstNode *node, Buf *msg) {
42 // if this assert fails, then parsec generated code that50 if (node->owner->c_import_node != nullptr) {
43 // failed semantic analysis, which isn't supposed to happen51 // if this happens, then parsec generated code that
44 assert(!node->owner->c_import_node);52 // failed semantic analysis, which isn't supposed to happen
53
54 Buf *note_path = buf_create_from_str("?.c");
55 Buf *note_source = buf_create_from_str("TODO: remember C source location to display here ");
56 ZigList<size_t> note_line_offsets = {0};
57 note_line_offsets.append(0);
58 ErrorMsg *note = err_msg_create_with_line(note_path, 0, 0,
59 note_source, &note_line_offsets, msg);
60
61 err_msg_add_note(parent_msg, note);
62 return note;
63 }
4564
46 ErrorMsg *err = err_msg_create_with_line(node->owner->path, node->line, node->column,65 ErrorMsg *err = err_msg_create_with_line(node->owner->path, node->line, node->column,
47 node->owner->source_code, node->owner->line_offsets, msg);66 node->owner->source_code, node->owner->line_offsets, msg);
src/errmsg.cpp+1
...@@ -123,6 +123,7 @@ ErrorMsg *err_msg_create_with_line(Buf *path, size_t line, size_t column,...@@ -123,6 +123,7 @@ ErrorMsg *err_msg_create_with_line(Buf *path, size_t line, size_t column,
123 size_t end_line = line + 1;123 size_t end_line = line + 1;
124 size_t line_end_offset = (end_line >= line_offsets->length) ? buf_len(source) : line_offsets->at(line + 1);124 size_t line_end_offset = (end_line >= line_offsets->length) ? buf_len(source) : line_offsets->at(line + 1);
125 size_t len = (line_end_offset + 1 > line_start_offset) ? (line_end_offset - line_start_offset - 1) : 0;125 size_t len = (line_end_offset + 1 > line_start_offset) ? (line_end_offset - line_start_offset - 1) : 0;
126 if (len == SIZE_MAX) len = 0;
126127
127 buf_init_from_mem(&err_msg->line_buf, buf_ptr(source) + line_start_offset, len);128 buf_init_from_mem(&err_msg->line_buf, buf_ptr(source) + line_start_offset, len);
128129