translate-c: self-hosted implementation can detect C errors

See #1964
This commit is contained in:
Andrew Kelley 2019-04-21 19:46:34 -04:00
parent 712274997e
commit 535d419590
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
3 changed files with 27 additions and 2 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}