From 4f17e693d9cd9074b355ac84d18d866f95a166a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 4 Feb 2019 11:52:25 +0100 Subject: [PATCH] codegen: Append implicit template parameters to base members. Fixes #1514 --- src/codegen/mod.rs | 9 ++++--- tests/expectations/tests/issue-1514.rs | 36 ++++++++++++++++++++++++++ tests/headers/issue-1514.hpp | 9 +++++++ 3 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 tests/expectations/tests/issue-1514.rs create mode 100644 tests/headers/issue-1514.hpp diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index d3395edff5..4dfd12cec4 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 0000000000..3f59f7430c --- /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 { + pub ptr: *mut T, + pub _phantom_0: ::std::marker::PhantomData<::std::cell::UnsafeCell>, +} +impl Default for Thing_Inner { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct Thing_AnotherInner { + pub _base: Thing_Inner, + pub _phantom_0: ::std::marker::PhantomData<::std::cell::UnsafeCell>, +} +impl Default for Thing_AnotherInner { + 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 0000000000..2a39889885 --- /dev/null +++ b/tests/headers/issue-1514.hpp @@ -0,0 +1,9 @@ +template +struct Thing { + struct Inner { + T *ptr; + }; + + struct AnotherInner : Inner { + }; +};