Commit 535d419590

Andrew Kelley <andrew@ziglang.org>
2019-04-22 01:46:34
translate-c: self-hosted implementation can detect C errors
See #1964
1 parent 7122749
Changed files (3)
src-self-hosted/clang.zig
@@ -959,3 +959,11 @@ pub const Stage2ErrorMsg = extern struct {
     offset: c_uint,
 };
 pub extern fn ZigClangErrorMsg_delete(ptr: [*c]Stage2ErrorMsg, len: usize) void;
+
+pub extern fn ZigClangLoadFromCommandLine(
+    args_begin: [*]?[*]const u8,
+    args_end: [*]?[*]const u8,
+    errors_ptr: *[*]Stage2ErrorMsg,
+    errors_len: *usize,
+    resources_path: [*c]const u8,
+) ?*ZigClangASTUnit;
src-self-hosted/stage1.zig
@@ -88,10 +88,15 @@ export fn stage2_translate_c(
     out_ast.* = translate_c.translate(args_begin, args_end, switch (mode) {
         .import => translate_c.Mode.import,
         .translate => translate_c.Mode.translate,
-    }, &errors) catch |err| switch (err) {
+    }, &errors, resources_path) catch |err| switch (err) {
         error.Unimplemented => return Error.Unimplemented,
+        error.SemanticAnalyzeFail => {
+            out_errors_ptr.* = errors.ptr;
+            out_errors_len.* = errors.len;
+            return Error.CCompileErrors;
+        },
+        error.OutOfMemory => return Error.OutOfMemory,
     };
-
     return Error.None;
 }
 
src-self-hosted/translate_c.zig
@@ -17,7 +17,19 @@ pub fn translate(
     args_end: [*]?[*]const u8,
     mode: Mode,
     errors: *[]ClangErrMsg,
+    resources_path: [*]const u8,
 ) !*ast.Tree {
+    const ast_unit = ZigClangLoadFromCommandLine(
+        args_begin,
+        args_end,
+        &errors.ptr,
+        &errors.len,
+        resources_path,
+    ) orelse {
+        if (errors.len == 0) return error.OutOfMemory;
+        return error.SemanticAnalyzeFail;
+    };
+
     return error.Unimplemented;
 }