parseh: fix wrong fn parameters in some cases

master
Andrew Kelley 2015-12-04 11:45:11 -07:00
parent 5144c4fa37
commit cd6283e8c4
2 changed files with 29 additions and 26 deletions

View File

@ -42,7 +42,7 @@ make
## Roadmap
* unreachable <--> noreturn attribute
* parseh: unreachable <--> noreturn attribute
* error for extern function with void parameter
* unused label error
* loops

View File

@ -17,6 +17,7 @@ struct Fn {
};
struct ParseH {
CXTranslationUnit tu;
FILE *f;
ZigList<Fn *> fn_list;
Fn *cur_fn;
@ -243,18 +244,26 @@ static bool is_storage_class_export(CX_StorageClass storage_class) {
zig_unreachable();
}
static void begin_fn(ParseH *p) {
assert(!p->cur_fn);
p->cur_fn = allocate<Fn>(1);
}
static enum CXChildVisitResult visit_fn_children(CXCursor cursor, CXCursor parent, CXClientData client_data) {
ParseH *p = (ParseH*)client_data;
enum CXCursorKind kind = clang_getCursorKind(cursor);
static void end_fn(ParseH *p) {
if (p->cur_fn) {
p->fn_list.append(p->cur_fn);
p->cur_fn = nullptr;
switch (kind) {
case CXCursor_ParmDecl:
{
assert(p->cur_fn);
assert(p->arg_index < p->cur_fn->arg_count);
CXString name = clang_getCursorSpelling(cursor);
buf_init_from_str(&p->cur_fn->args[p->arg_index].name, clang_getCString(name));
p->arg_index += 1;
return CXChildVisit_Continue;
}
default:
return CXChildVisit_Recurse;
}
}
static enum CXChildVisitResult fn_visitor(CXCursor cursor, CXCursor parent, CXClientData client_data) {
ParseH *p = (ParseH*)client_data;
enum CXCursorKind kind = clang_getCursorKind(cursor);
@ -282,8 +291,8 @@ static enum CXChildVisitResult fn_visitor(CXCursor cursor, CXCursor parent, CXCl
return CXChildVisit_Continue;
}
end_fn(p);
begin_fn(p);
assert(!p->cur_fn);
p->cur_fn = allocate<Fn>(1);
CXType return_type = clang_getResultType(fn_type);
p->cur_fn->return_type = to_zig_type(p, return_type);
@ -300,17 +309,13 @@ static enum CXChildVisitResult fn_visitor(CXCursor cursor, CXCursor parent, CXCl
p->arg_index = 0;
clang_visitChildren(cursor, visit_fn_children, p);
p->fn_list.append(p->cur_fn);
p->cur_fn = nullptr;
return CXChildVisit_Recurse;
}
case CXCursor_ParmDecl:
{
assert(p->cur_fn);
assert(p->arg_index < p->cur_fn->arg_count);
buf_init_from_str(&p->cur_fn->args[p->arg_index].name, clang_getCString(name));
p->arg_index += 1;
return CXChildVisit_Continue;
}
case CXCursor_UnexposedAttr:
case CXCursor_CompoundStmt:
case CXCursor_FieldDecl:
case CXCursor_TypedefDecl:
@ -330,7 +335,6 @@ void parse_h_file(const char *target_path, ZigList<const char *> *clang_argv, FI
ParseH parse_h = {0};
ParseH *p = &parse_h;
p->f = f;
CXTranslationUnit tu;
CXIndex index = clang_createIndex(1, 0);
char *ZIG_PARSEH_CFLAGS = getenv("ZIG_PARSEH_CFLAGS");
@ -355,17 +359,17 @@ void parse_h_file(const char *target_path, ZigList<const char *> *clang_argv, FI
enum CXErrorCode err_code;
if ((err_code = clang_parseTranslationUnit2(index, target_path,
clang_argv->items, clang_argv->length - 1,
NULL, 0, CXTranslationUnit_None, &tu)))
NULL, 0, CXTranslationUnit_None, &p->tu)))
{
zig_panic("parse translation unit failure");
}
unsigned diag_count = clang_getNumDiagnostics(tu);
unsigned diag_count = clang_getNumDiagnostics(p->tu);
if (diag_count > 0) {
for (unsigned i = 0; i < diag_count; i += 1) {
CXDiagnostic diagnostic = clang_getDiagnostic(tu, i);
CXDiagnostic diagnostic = clang_getDiagnostic(p->tu, i);
CXSourceLocation location = clang_getDiagnosticLocation(diagnostic);
CXFile file;
@ -381,9 +385,8 @@ void parse_h_file(const char *target_path, ZigList<const char *> *clang_argv, FI
}
CXCursor cursor = clang_getTranslationUnitCursor(tu);
CXCursor cursor = clang_getTranslationUnitCursor(p->tu);
clang_visitChildren(cursor, fn_visitor, p);
end_fn(p);
if (p->fn_list.length) {
fprintf(f, "extern {\n");