From 08b0b5e67a0976368395515e8a9f700e67758a43 Mon Sep 17 00:00:00 2001 From: Emilio Cobos Álvarez Date: Wed, 23 Mar 2016 02:25:15 +0100 Subject: gen: Mangle inner struct names, and don't generate a field for them The field generation was plain incorrect --- src/gen.rs | 18 +++++++----------- tests/headers/class_with_inner_struct.hpp | 9 +++++++++ 2 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 tests/headers/class_with_inner_struct.hpp 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 } } - 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; }; +}; -- cgit v1.2.3