diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2018-01-29 15:13:53 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2018-01-29 15:13:53 +0100 |
commit | 450970dcc1a710b94d34242b85038a39a8c71fd2 (patch) | |
tree | c07a9dbac7c0bd787122a6cd517acf88b29e1d76 | |
parent | 8725aea78fb312d678fc17088eb8ba5c883c720c (diff) |
codegen: Make the cyclic typedef name detection catch more cases.
By looking through typedefs, we also catch more complex cases like the ones that
appear on Android's stdlib.
Fixes #946
-rw-r--r-- | src/codegen/mod.rs | 22 | ||||
-rw-r--r-- | tests/expectations/tests/issue-946.rs | 21 | ||||
-rw-r--r-- | tests/headers/issue-946.h | 5 |
3 files changed, 40 insertions, 8 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index af202a02..0ad4e805 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -614,14 +614,20 @@ impl CodeGenerator for Type { .resolve(ctx); let name = item.canonical_name(ctx); - // Try to catch the common pattern: - // - // typedef struct foo { ... } foo; - // - // here. - // - if inner_item.canonical_name(ctx) == name { - return; + { + let through_type_aliases = inner.into_resolver() + .through_type_refs() + .through_type_aliases() + .resolve(ctx); + + // Try to catch the common pattern: + // + // typedef struct foo { ... } foo; + // + // here, and also other more complex cases like #946. + if through_type_aliases.canonical_name(ctx) == name { + return; + } } // If this is a known named type, disallow generating anything diff --git a/tests/expectations/tests/issue-946.rs b/tests/expectations/tests/issue-946.rs new file mode 100644 index 00000000..14ed38c6 --- /dev/null +++ b/tests/expectations/tests/issue-946.rs @@ -0,0 +1,21 @@ +/* automatically generated by rust-bindgen */ + +#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct foo {} +#[test] +fn bindgen_test_layout_foo() { + assert_eq!( + ::std::mem::size_of::<foo>(), + 0usize, + concat!("Size of: ", stringify!(foo)) + ); + assert_eq!( + ::std::mem::align_of::<foo>(), + 1usize, + concat!("Alignment of ", stringify!(foo)) + ); +} +pub type bar = foo; diff --git a/tests/headers/issue-946.h b/tests/headers/issue-946.h new file mode 100644 index 00000000..5d145e09 --- /dev/null +++ b/tests/headers/issue-946.h @@ -0,0 +1,5 @@ +struct foo { }; + +typedef struct foo bar; + +typedef bar foo; |