summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gen.rs18
-rw-r--r--tests/headers/class_with_inner_struct.hpp9
2 files changed, 16 insertions, 11 deletions
diff --git a/src/gen.rs b/src/gen.rs
index 25f0724e..343bc8f5 100644
--- a/src/gen.rs
+++ b/src/gen.rs
@@ -1022,24 +1022,20 @@ fn cstruct_to_rs(ctx: &mut GenCtx, name: &str, ci: CompInfo) -> Vec<P<ast::Item>
}
}
- if let Some(rc_c) = opt_rc_c {
- if rc_c.borrow().name.is_empty() {
+ if let Some(mut rc_c) = opt_rc_c {
+ let name_is_empty = rc_c.borrow().name.is_empty();
+
+ if name_is_empty {
let c = rc_c.borrow();
unnamed += 1;
let field_name = format!("_bindgen_data_{}_", unnamed);
fields.push(mk_blob_field(ctx, &field_name, c.layout));
methods.extend(gen_comp_methods(ctx, &field_name, 0, c.kind, &c.members, &mut extra).into_iter());
} else {
+ // Mangled name to deal with multiple definitions of the same inner type
+ let mangled_name = [name, &*rc_c.borrow().name].join("_").to_owned();
+ rc_c.borrow_mut().name = mangled_name;
let name = comp_name(&ctx, rc_c.borrow().kind, &rc_c.borrow().name);
- fields.push(respan(ctx.span, ast::StructField_ {
- kind: ast::NamedField(
- ctx.ext_cx.ident_of(&name),
- ast::Visibility::Public,
- ),
- id: ast::DUMMY_NODE_ID,
- ty: P(cty_to_rs(ctx, &TComp(rc_c.clone()), true, true)),
- attrs: mk_doc_attr(ctx, &rc_c.borrow().comment)
- }));
extra.extend(comp_to_rs(ctx, &name, rc_c.borrow().clone()).into_iter());
}
}
diff --git a/tests/headers/class_with_inner_struct.hpp b/tests/headers/class_with_inner_struct.hpp
new file mode 100644
index 00000000..40199ccc
--- /dev/null
+++ b/tests/headers/class_with_inner_struct.hpp
@@ -0,0 +1,9 @@
+class A {
+ unsigned c;
+ struct Segment { int begin, end; };
+};
+
+class B {
+ unsigned d;
+ struct Segment { int begin, end; };
+};