summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libbindgen/src/codegen/mod.rs16
-rw-r--r--libbindgen/tests/expectations/tests/anon_enum_trait.rs47
-rw-r--r--libbindgen/tests/headers/anon_enum_trait.hpp22
3 files changed, 81 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 {
diff --git a/libbindgen/tests/expectations/tests/anon_enum_trait.rs b/libbindgen/tests/expectations/tests/anon_enum_trait.rs
new file mode 100644
index 00000000..8198bc15
--- /dev/null
+++ b/libbindgen/tests/expectations/tests/anon_enum_trait.rs
@@ -0,0 +1,47 @@
+/* automatically generated by rust-bindgen */
+
+
+#![allow(non_snake_case)]
+
+
+#[repr(C)]
+#[derive(Debug, Copy, Clone)]
+pub struct DataType<_Tp> {
+ pub _address: u8,
+ pub _phantom_0: ::std::marker::PhantomData<_Tp>,
+}
+pub type DataType_value_type<_Tp> = _Tp;
+pub type DataType_work_type<_Tp> = DataType_value_type<_Tp>;
+pub type DataType_channel_type<_Tp> = DataType_value_type<_Tp>;
+pub type DataType_vec_type<_Tp> = DataType_value_type<_Tp>;
+pub const DataType_generic_type: DataType__bindgen_ty_1 =
+ DataType__bindgen_ty_1::generic_type;
+pub const DataType_depth: DataType__bindgen_ty_1 =
+ DataType__bindgen_ty_1::generic_type;
+pub const DataType_channels: DataType__bindgen_ty_1 =
+ DataType__bindgen_ty_1::generic_type;
+pub const DataType_fmt: DataType__bindgen_ty_1 =
+ DataType__bindgen_ty_1::generic_type;
+pub const DataType_type_: DataType__bindgen_ty_1 =
+ DataType__bindgen_ty_1::generic_type;
+#[repr(i32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum DataType__bindgen_ty_1 { generic_type = 0, }
+#[repr(C)]
+#[derive(Debug, Copy)]
+pub struct Foo {
+ pub _address: u8,
+}
+pub const Foo_Bar: Foo__bindgen_ty_1 = Foo__bindgen_ty_1::Bar;
+pub const Foo_Baz: Foo__bindgen_ty_1 = Foo__bindgen_ty_1::Bar;
+#[repr(u32)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum Foo__bindgen_ty_1 { Bar = 0, }
+#[test]
+fn bindgen_test_layout_Foo() {
+ assert_eq!(::std::mem::size_of::<Foo>() , 1usize);
+ assert_eq!(::std::mem::align_of::<Foo>() , 1usize);
+}
+impl Clone for Foo {
+ fn clone(&self) -> Self { *self }
+}
diff --git a/libbindgen/tests/headers/anon_enum_trait.hpp b/libbindgen/tests/headers/anon_enum_trait.hpp
new file mode 100644
index 00000000..e1ec394c
--- /dev/null
+++ b/libbindgen/tests/headers/anon_enum_trait.hpp
@@ -0,0 +1,22 @@
+
+template<typename _Tp>
+class DataType {
+public:
+ typedef _Tp value_type;
+ typedef value_type work_type;
+ typedef value_type channel_type;
+ typedef value_type vec_type;
+ enum { generic_type = 1,
+ depth = -1,
+ channels = 1,
+ fmt = 0,
+ type = -1,
+ };
+};
+
+struct Foo {
+ enum {
+ Bar = 0,
+ Baz = 0,
+ };
+};