aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-10-26 00:32:30 -0400
committerAndrew Kelley <superjoe30@gmail.com>2017-10-26 00:32:30 -0400
commitc7053bea204f87fe1c8b28ec97b27003a24dcafc (patch)
treee6607a7abb0ae8a9f86e31e146a72e7c71ce1c73 /src/analyze.cpp
parent300c83d8930d15d4bc4e34fe11e3b6bf3130ecc4 (diff)
downloadzig-c7053bea204f87fe1c8b28ec97b27003a24dcafc.tar.gz
zig-c7053bea204f87fe1c8b28ec97b27003a24dcafc.zip
better output when @cImport generates invalid zig
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index b6bd9c8124..e6ccf82dfe 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -27,9 +27,17 @@ static void resolve_enum_zero_bits(CodeGen *g, TypeTableEntry *enum_type);
static void resolve_union_zero_bits(CodeGen *g, TypeTableEntry *union_type);
ErrorMsg *add_node_error(CodeGen *g, AstNode *node, Buf *msg) {
- // if this assert fails, then parsec generated code that
- // failed semantic analysis, which isn't supposed to happen
- assert(!node->owner->c_import_node);
+ if (node->owner->c_import_node != nullptr) {
+ // if this happens, then parsec generated code that
+ // failed semantic analysis, which isn't supposed to happen
+ ErrorMsg *err = add_node_error(g, node->owner->c_import_node,
+ buf_sprintf("compiler bug: @cImport generated invalid zig code"));
+
+ add_error_note(g, err, node, msg);
+
+ g->errors.append(err);
+ return err;
+ }
ErrorMsg *err = err_msg_create_with_line(node->owner->path, node->line, node->column,
node->owner->source_code, node->owner->line_offsets, msg);
@@ -39,9 +47,20 @@ ErrorMsg *add_node_error(CodeGen *g, AstNode *node, Buf *msg) {
}
ErrorMsg *add_error_note(CodeGen *g, ErrorMsg *parent_msg, AstNode *node, Buf *msg) {
- // if this assert fails, then parsec generated code that
- // failed semantic analysis, which isn't supposed to happen
- assert(!node->owner->c_import_node);
+ if (node->owner->c_import_node != nullptr) {
+ // if this happens, then parsec generated code that
+ // failed semantic analysis, which isn't supposed to happen
+
+ Buf *note_path = buf_create_from_str("?.c");
+ Buf *note_source = buf_create_from_str("TODO: remember C source location to display here ");
+ ZigList<size_t> note_line_offsets = {0};
+ note_line_offsets.append(0);
+ ErrorMsg *note = err_msg_create_with_line(note_path, 0, 0,
+ note_source, &note_line_offsets, msg);
+
+ err_msg_add_note(parent_msg, note);
+ return note;
+ }
ErrorMsg *err = err_msg_create_with_line(node->owner->path, node->line, node->column,
node->owner->source_code, node->owner->line_offsets, msg);