From e9381670d610d4525a89b3dc65d43a58329a4aa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 6 Jul 2017 11:20:42 +0200 Subject: [PATCH] ir: Properly skip inline namespaces when building names. Fixes #789 --- src/ir/item.rs | 12 ++++++- .../tests/inline_namespace_no_ns_enabled.rs | 34 +++++++++++++++++++ .../inline_namespace_no_ns_enabled.hpp | 18 ++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 tests/expectations/tests/inline_namespace_no_ns_enabled.rs create mode 100644 tests/headers/inline_namespace_no_ns_enabled.hpp diff --git a/src/ir/item.rs b/src/ir/item.rs index 3564c6e89a..cfda49539f 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 0000000000..c2592e577c --- /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 { + pub hider: std_basic_string_Alloc_hider, + pub length: ::std::os::raw::c_ulong, + pub __bindgen_anon_1: std_basic_string__bindgen_ty_1, + pub _phantom_0: ::std::marker::PhantomData<::std::cell::UnsafeCell>, +} +#[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 { + pub inline_storage: [CharT; 4usize], + pub _phantom_0: ::std::marker::PhantomData<::std::cell::UnsafeCell>, +} +impl Default for std_basic_string__bindgen_ty_1 { + fn default() -> Self { unsafe { ::std::mem::zeroed() } } +} +impl Default for std_basic_string { + 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 0000000000..30cd4e9b86 --- /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 +class basic_string { + struct Alloc_hider { + void* storage; + } hider; + unsigned long length; + struct { + CharT inline_storage[4]; + }; +}; + +} +}