summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2017-07-06 11:20:42 +0200
committerEmilio Cobos Álvarez <emilio@crisal.io>2017-07-06 11:20:42 +0200
commite9381670d610d4525a89b3dc65d43a58329a4aa5 (patch)
tree924c59c7dc246c2a8c2e485ec96b57755ac2c2dc
parent9b4bd6bff754e6b654f85fc676288ff660dbc6b3 (diff)
ir: Properly skip inline namespaces when building names.
Fixes #789
-rw-r--r--src/ir/item.rs12
-rw-r--r--tests/expectations/tests/inline_namespace_no_ns_enabled.rs34
-rw-r--r--tests/headers/inline_namespace_no_ns_enabled.hpp18
3 files changed, 63 insertions, 1 deletions
diff --git a/src/ir/item.rs b/src/ir/item.rs
index 3564c6e8..cfda4953 100644
--- a/src/ir/item.rs
+++ b/src/ir/item.rs
@@ -768,9 +768,19 @@ impl Item {
.ancestors(ctx)
.filter(|id| *id != ctx.root_module())
.take_while(|id| {
- // Stop iterating ancestors once we reach a namespace.
+ // Stop iterating ancestors once we reach a non-inline namespace
+ // when opt.within_namespaces is set.
!opt.within_namespaces || !ctx.resolve_item(*id).is_module()
})
+ .filter(|id| {
+ if !ctx.options().conservative_inline_namespaces {
+ if let ItemKind::Module(ref module) = *ctx.resolve_item(*id).kind() {
+ return !module.is_inline();
+ }
+ }
+
+ true
+ })
.map(|id| {
let item = ctx.resolve_item(id);
let target = ctx.resolve_item(item.name_target(ctx));
diff --git a/tests/expectations/tests/inline_namespace_no_ns_enabled.rs b/tests/expectations/tests/inline_namespace_no_ns_enabled.rs
new file mode 100644
index 00000000..c2592e57
--- /dev/null
+++ b/tests/expectations/tests/inline_namespace_no_ns_enabled.rs
@@ -0,0 +1,34 @@
+/* automatically generated by rust-bindgen */
+
+
+#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
+
+
+#[repr(C)]
+#[derive(Debug)]
+pub struct std_basic_string<CharT> {
+ pub hider: std_basic_string_Alloc_hider,
+ pub length: ::std::os::raw::c_ulong,
+ pub __bindgen_anon_1: std_basic_string__bindgen_ty_1<CharT>,
+ pub _phantom_0: ::std::marker::PhantomData<::std::cell::UnsafeCell<CharT>>,
+}
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct std_basic_string_Alloc_hider {
+ pub storage: *mut ::std::os::raw::c_void,
+}
+impl Default for std_basic_string_Alloc_hider {
+ fn default() -> Self { unsafe { ::std::mem::zeroed() } }
+}
+#[repr(C)]
+#[derive(Debug)]
+pub struct std_basic_string__bindgen_ty_1<CharT> {
+ pub inline_storage: [CharT; 4usize],
+ pub _phantom_0: ::std::marker::PhantomData<::std::cell::UnsafeCell<CharT>>,
+}
+impl <CharT> Default for std_basic_string__bindgen_ty_1<CharT> {
+ fn default() -> Self { unsafe { ::std::mem::zeroed() } }
+}
+impl <CharT> Default for std_basic_string<CharT> {
+ fn default() -> Self { unsafe { ::std::mem::zeroed() } }
+}
diff --git a/tests/headers/inline_namespace_no_ns_enabled.hpp b/tests/headers/inline_namespace_no_ns_enabled.hpp
new file mode 100644
index 00000000..30cd4e9b
--- /dev/null
+++ b/tests/headers/inline_namespace_no_ns_enabled.hpp
@@ -0,0 +1,18 @@
+// bindgen-flags: -- -std=c++11
+
+namespace std {
+inline namespace __cxx11 {
+
+template<typename CharT>
+class basic_string {
+ struct Alloc_hider {
+ void* storage;
+ } hider;
+ unsigned long length;
+ struct {
+ CharT inline_storage[4];
+ };
+};
+
+}
+}