aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-12-12 13:16:09 +0200
committerVeikka Tuominen <git@vexu.eu>2022-12-14 14:08:22 +0200
commitbc97a5662da4dd0a82840de79dd5600cef0ef825 (patch)
treec259592c1eca178bf6fc6b6380cd58896bb3035b /src/Sema.zig
parent886fa455fad4997cf766ec2adcbac09d7e28f668 (diff)
downloadzig-bc97a5662da4dd0a82840de79dd5600cef0ef825.tar.gz
zig-bc97a5662da4dd0a82840de79dd5600cef0ef825.zip
Sema: display cimport errors from clang
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig52
1 files changed, 45 insertions, 7 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 6fcff1fec8..8c7c8b0dd7 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -5130,20 +5130,58 @@ fn zirCImport(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileEr
if (c_import_res.errors.len != 0) {
const msg = msg: {
+ defer @import("clang.zig").ErrorMsg.delete(c_import_res.errors.ptr, c_import_res.errors.len);
+
const msg = try sema.errMsg(&child_block, src, "C import failed", .{});
errdefer msg.destroy(sema.gpa);
if (!mod.comp.bin_file.options.link_libc)
try sema.errNote(&child_block, src, msg, "libc headers not available; compilation does not link against libc", .{});
- for (c_import_res.errors) |_| {
- // TODO integrate with LazySrcLoc
- // try mod.errNoteNonLazy(.{}, msg, "{s}", .{clang_err.msg_ptr[0..clang_err.msg_len]});
- // if (clang_err.filename_ptr) |p| p[0..clang_err.filename_len] else "(no file)",
- // clang_err.line + 1,
- // clang_err.column + 1,
+ const gop = try sema.mod.cimport_errors.getOrPut(sema.gpa, sema.owner_decl_index);
+ if (!gop.found_existing) {
+ var errs = try std.ArrayListUnmanaged(Module.CImportError).initCapacity(sema.gpa, c_import_res.errors.len);
+ errdefer {
+ for (errs.items) |err| err.deinit(sema.gpa);
+ errs.deinit(sema.gpa);
+ }
+
+ for (c_import_res.errors) |c_error| {
+ const path = if (c_error.filename_ptr) |some|
+ try sema.gpa.dupeZ(u8, some[0..c_error.filename_len])
+ else
+ null;
+ errdefer if (path) |some| sema.gpa.free(some);
+
+ const c_msg = try sema.gpa.dupeZ(u8, c_error.msg_ptr[0..c_error.msg_len]);
+ errdefer sema.gpa.free(c_msg);
+
+ const line = line: {
+ const source = c_error.source orelse break :line null;
+ var start = c_error.offset;
+ while (start > 0) : (start -= 1) {
+ if (source[start - 1] == '\n') break;
+ }
+ var end = c_error.offset;
+ while (true) : (end += 1) {
+ if (source[end] == 0) break;
+ if (source[end] == '\n') break;
+ }
+ break :line try sema.gpa.dupeZ(u8, source[start..end]);
+ };
+ errdefer if (line) |some| sema.gpa.free(some);
+
+ errs.appendAssumeCapacity(.{
+ .path = path orelse null,
+ .source_line = line orelse null,
+ .line = c_error.line,
+ .column = c_error.column,
+ .offset = c_error.offset,
+ .msg = c_msg,
+ });
+ }
+ gop.value_ptr.* = errs.items;
}
- @import("clang.zig").Stage2ErrorMsg.delete(c_import_res.errors.ptr, c_import_res.errors.len);
break :msg msg;
};
return sema.failWithOwnedErrorMsg(msg);