summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Barnard <eabarnard@gmail.com>2014-12-29 22:07:29 +0100
committerEdward Barnard <eabarnard@gmail.com>2014-12-29 22:07:29 +0100
commit59d21bed70cd279cb35e86a0082147e7f591086f (patch)
tree8d427da5504d13703bd4fa9e9600bdffba7a6e29
parent6935ccb534c288a305f873d6b38bda646876b63d (diff)
Correctly output builtins. Closes #29.
-rw-r--r--src/lib.rs1
-rw-r--r--src/parser.rs13
-rw-r--r--tests/builtins.rs13
-rw-r--r--tests/headers/builtin_va_list.h6
4 files changed, 23 insertions, 10 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 5bd7ed6a..f87b4aac 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -173,6 +173,7 @@ fn builtin_names() -> HashSet<String> {
let keys = [
"__va_list_tag",
"__va_list",
+ "__builtin_va_list",
];
keys.iter().all(|s| {
diff --git a/src/parser.rs b/src/parser.rs
index 602641e7..c4291d5e 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -394,15 +394,8 @@ fn visit_enum(cursor: &Cursor,
return CXChildVisit_Continue;
}
-fn visit_top<'r>(cur: &'r Cursor,
- parent: &'r Cursor,
+fn visit_top<'r>(cursor: &Cursor,
ctx: &mut ClangParserCtx) -> Enum_CXVisitorResult {
- let cursor = if ctx.options.builtin_names.contains(&parent.spelling()) {
- parent
- } else {
- cur
- };
-
if !match_pattern(ctx, cursor) {
return CXChildVisit_Continue;
}
@@ -544,11 +537,11 @@ pub fn parse(options: ClangParserOptions, logger: &Logger) -> Result<Vec<Global>
cursor.visit(|cur, _| ast_dump(cur, 0));
}
- cursor.visit(|cur, parent| visit_top(cur, parent, &mut ctx));
+ cursor.visit(|cur, _| visit_top(cur, &mut ctx));
while !ctx.builtin_defs.is_empty() {
let c = ctx.builtin_defs.remove(0).unwrap();
- c.visit(|cur, parent| visit_top(cur, parent, &mut ctx));
+ visit_top(&c.definition(), &mut ctx);
}
unit.dispose();
diff --git a/tests/builtins.rs b/tests/builtins.rs
new file mode 100644
index 00000000..35cd573c
--- /dev/null
+++ b/tests/builtins.rs
@@ -0,0 +1,13 @@
+#![feature(phase)]
+
+#[phase(plugin)]
+extern crate bindgen;
+
+extern crate libc;
+
+#[test]
+fn test_builtin_va_list() {
+ mod ffi { bindgen!("headers/builtin_va_list.h", emit_builtins = true); }
+ // Should test for more than compilation.
+}
+
diff --git a/tests/headers/builtin_va_list.h b/tests/headers/builtin_va_list.h
new file mode 100644
index 00000000..b3951bb7
--- /dev/null
+++ b/tests/headers/builtin_va_list.h
@@ -0,0 +1,6 @@
+#include "stdarg.h"
+
+struct a
+{
+ va_list b;
+}; \ No newline at end of file