summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-07-21 10:14:28 -0700
committerGitHub <noreply@github.com>2017-07-21 10:14:28 -0700
commit1830c2d8b404d7a7c7bbcbcd678b9bef9866ee91 (patch)
tree6c6d45881fff02f4a32c6bf22f621bf7384f125e
parent85c063b3d6b89a0f69c20e2415479489d6758764 (diff)
parentba9298d41db350010b58ea0b9cfffd1c0f1e4ba5 (diff)
Auto merge of #835 - emilio:tp-function, r=fitzgen
ir: We really need to traverse all edges for the used template parameter analysis to be sound. Fixes #833
-rw-r--r--src/ir/context.rs2
-rw-r--r--src/ir/traversal.rs28
-rw-r--r--tests/expectations/tests/issue-833.rs10
-rw-r--r--tests/headers/issue-833.hpp8
4 files changed, 19 insertions, 29 deletions
diff --git a/src/ir/context.rs b/src/ir/context.rs
index ec79577f..d74d3ae0 100644
--- a/src/ir/context.rs
+++ b/src/ir/context.rs
@@ -219,7 +219,7 @@ impl<'ctx, 'gen> WhitelistedItems<'ctx, 'gen>
where R: IntoIterator<Item = ItemId>,
{
let predicate = if ctx.options().whitelist_recursively {
- traversal::codegen_edges
+ traversal::all_edges
} else {
traversal::no_edges
};
diff --git a/src/ir/traversal.rs b/src/ir/traversal.rs
index d4b081f5..842da61e 100644
--- a/src/ir/traversal.rs
+++ b/src/ir/traversal.rs
@@ -201,34 +201,6 @@ pub fn all_edges(_: &BindgenContext, _: Edge) -> bool {
true
}
-/// A `TraversalPredicate` implementation that only follows edges to items that
-/// are enabled for code generation. This lets us skip considering items for
-/// which we won't generate any bindings to.
-pub fn codegen_edges(ctx: &BindgenContext, edge: Edge) -> bool {
- let cc = &ctx.options().codegen_config;
- match edge.kind {
- EdgeKind::Generic => ctx.resolve_item(edge.to).is_enabled_for_codegen(ctx),
-
- // We statically know the kind of item that non-generic edges can point
- // to, so we don't need to actually resolve the item and check
- // `Item::is_enabled_for_codegen`.
- EdgeKind::TemplateParameterDefinition |
- EdgeKind::TemplateArgument |
- EdgeKind::TemplateDeclaration |
- EdgeKind::BaseMember |
- EdgeKind::Field |
- EdgeKind::InnerType |
- EdgeKind::FunctionReturn |
- EdgeKind::FunctionParameter |
- EdgeKind::VarType |
- EdgeKind::TypeReference => cc.types,
- EdgeKind::InnerVar => cc.vars,
- EdgeKind::Method => cc.methods,
- EdgeKind::Constructor => cc.constructors,
- EdgeKind::Destructor => cc.destructors,
- }
-}
-
/// A `TraversalPredicate` implementation that never follows any edges, and
/// therefore traversals using this predicate will only visit the traversal's
/// roots.
diff --git a/tests/expectations/tests/issue-833.rs b/tests/expectations/tests/issue-833.rs
new file mode 100644
index 00000000..9de7c64f
--- /dev/null
+++ b/tests/expectations/tests/issue-833.rs
@@ -0,0 +1,10 @@
+/* automatically generated by rust-bindgen */
+
+
+#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
+
+#[repr(C)] pub struct nsTArray<T> { pub hdr: *const T }
+
+extern "C" {
+ pub fn func() -> *mut nsTArray<::std::os::raw::c_int>;
+}
diff --git a/tests/headers/issue-833.hpp b/tests/headers/issue-833.hpp
new file mode 100644
index 00000000..ea0d2add
--- /dev/null
+++ b/tests/headers/issue-833.hpp
@@ -0,0 +1,8 @@
+// bindgen-flags: --generate functions --whitelist-function func --raw-line "#[repr(C)] pub struct nsTArray<T> { pub hdr: *const T }"
+
+template<typename T>
+class nsTArray {
+ T* mHeader;
+};
+
+extern "C" nsTArray<int>* func();