diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2016-12-15 17:48:15 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2016-12-15 17:48:15 +0100 |
commit | 59987f142bbd97e44437532a640eb66c4d3a3e52 (patch) | |
tree | 4703f41c6d2a20b58b9415f60486474d7007e843 /libbindgen/src/codegen/mod.rs | |
parent | 31bd2d3a1ffa47e15b0701761966fc836c9da99d (diff) |
codegen: Properly mangle nested anonymous enums with duplicated variants.
Diffstat (limited to 'libbindgen/src/codegen/mod.rs')
-rw-r--r-- | libbindgen/src/codegen/mod.rs | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/libbindgen/src/codegen/mod.rs b/libbindgen/src/codegen/mod.rs index 9ab264c6..2f18036a 100644 --- a/libbindgen/src/codegen/mod.rs +++ b/libbindgen/src/codegen/mod.rs @@ -1660,11 +1660,21 @@ impl CodeGenerator for Enum { match seen_values.entry(variant.val()) { Entry::Occupied(ref entry) => { if is_rust_enum { - let existing_variant_name = entry.get(); let variant_name = ctx.rust_mangle(variant.name()); + let mangled_name = if is_toplevel || enum_ty.name().is_some() { + variant_name + } else { + let parent_name = parent_canonical_name.as_ref() + .unwrap(); + + Cow::Owned( + format!("{}_{}", parent_name, variant_name)) + }; + + let existing_variant_name = entry.get(); add_constant(enum_ty, &name, - &*variant_name, + &*mangled_name, existing_variant_name, enum_rust_ty.clone(), result); @@ -1688,8 +1698,6 @@ impl CodeGenerator for Enum { // If it's an unnamed enum, we also generate a constant so // it can be properly accessed. if is_rust_enum && enum_ty.name().is_none() { - // NB: if we want to do this for other kind of nested - // enums we can probably mangle the name. let mangled_name = if is_toplevel { variant_name.clone() } else { |