diff options
-rw-r--r-- | libbindgen/src/codegen/mod.rs | 16 | ||||
-rw-r--r-- | libbindgen/tests/expectations/tests/anon_enum_trait.rs | 47 | ||||
-rw-r--r-- | libbindgen/tests/headers/anon_enum_trait.hpp | 22 |
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, + }; +}; |