summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2019-02-04 12:34:00 +0100
committerGitHub <noreply@github.com>2019-02-04 12:34:00 +0100
commita5ccffbcf4b289f80bf5533cdf94175d78bedec5 (patch)
treef0e272474bddc4c9822b136bcf21b5c15efad50b
parent49b74244f7db8618b9a1b135ce2659751636c59c (diff)
parent4f17e693d9cd9074b355ac84d18d866f95a166a9 (diff)
Merge pull request #1515 from emilio/implicit-base
codegen: Append implicit template parameters to base members.
-rw-r--r--src/codegen/mod.rs9
-rw-r--r--tests/expectations/tests/issue-1514.rs36
-rw-r--r--tests/headers/issue-1514.hpp9
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 {
+ };
+};