diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-07-21 10:14:28 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-21 10:14:28 -0700 |
commit | 1830c2d8b404d7a7c7bbcbcd678b9bef9866ee91 (patch) | |
tree | 6c6d45881fff02f4a32c6bf22f621bf7384f125e | |
parent | 85c063b3d6b89a0f69c20e2415479489d6758764 (diff) | |
parent | ba9298d41db350010b58ea0b9cfffd1c0f1e4ba5 (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.rs | 2 | ||||
-rw-r--r-- | src/ir/traversal.rs | 28 | ||||
-rw-r--r-- | tests/expectations/tests/issue-833.rs | 10 | ||||
-rw-r--r-- | tests/headers/issue-833.hpp | 8 |
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(); |