diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2019-02-04 12:34:00 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-04 12:34:00 +0100 |
commit | a5ccffbcf4b289f80bf5533cdf94175d78bedec5 (patch) | |
tree | f0e272474bddc4c9822b136bcf21b5c15efad50b | |
parent | 49b74244f7db8618b9a1b135ce2659751636c59c (diff) | |
parent | 4f17e693d9cd9074b355ac84d18d866f95a166a9 (diff) |
Merge pull request #1515 from emilio/implicit-base
codegen: Append implicit template parameters to base members.
-rw-r--r-- | src/codegen/mod.rs | 9 | ||||
-rw-r--r-- | tests/expectations/tests/issue-1514.rs | 36 | ||||
-rw-r--r-- | tests/headers/issue-1514.hpp | 9 |
3 files changed, 50 insertions, 4 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index d3395edf..4dfd12ce 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -1504,14 +1504,15 @@ impl CodeGenerator for CompInfo { continue; } - let inner = base.ty.to_rust_ty_or_opaque(ctx, &()); + let inner_item = ctx.resolve_item(base.ty); + let mut inner = inner_item.to_rust_ty_or_opaque(ctx, &()); + inner.append_implicit_template_params(ctx, &inner_item); let field_name = ctx.rust_ident(&base.field_name); - let base_ty = ctx.resolve_type(base.ty); - struct_layout.saw_base(base_ty); + struct_layout.saw_base(inner_item.expect_type()); fields.push(quote! { - pub #field_name : #inner , + pub #field_name: #inner, }); } } diff --git a/tests/expectations/tests/issue-1514.rs b/tests/expectations/tests/issue-1514.rs new file mode 100644 index 00000000..3f59f743 --- /dev/null +++ b/tests/expectations/tests/issue-1514.rs @@ -0,0 +1,36 @@ +/* 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 Thing { + pub _address: u8, +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Thing_Inner<T> { + pub ptr: *mut T, + pub _phantom_0: ::std::marker::PhantomData<::std::cell::UnsafeCell<T>>, +} +impl<T> Default for Thing_Inner<T> { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Thing_AnotherInner<T> { + pub _base: Thing_Inner<T>, + pub _phantom_0: ::std::marker::PhantomData<::std::cell::UnsafeCell<T>>, +} +impl<T> Default for Thing_AnotherInner<T> { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} diff --git a/tests/headers/issue-1514.hpp b/tests/headers/issue-1514.hpp new file mode 100644 index 00000000..2a398898 --- /dev/null +++ b/tests/headers/issue-1514.hpp @@ -0,0 +1,9 @@ +template<typename T> +struct Thing { + struct Inner { + T *ptr; + }; + + struct AnotherInner : Inner { + }; +}; |