diff options
author | Travis Finkenauer <tmfinken@gmail.com> | 2018-03-11 18:26:31 -0400 |
---|---|---|
committer | Travis Finkenauer <tmfinken@gmail.com> | 2018-03-11 18:26:31 -0400 |
commit | 7b99b2512921fd7540a0b8f9717c6e38fec376e1 (patch) | |
tree | c8223a3ab4f74af1236703a05ec5cedbdd9d4db1 | |
parent | f36f4e3e38d5a4f9c712a5bbde68403ce716dab6 (diff) |
Fix bug when enum matched multiple types
If an enum matched a pattern for rustified enum and constified module
enum, then rust code would fail to compile with "ambiguous associated
type" error. We fix the error by giving constified module enum "higher
precedence".
Fixes issue #1198
5 files changed, 65 insertions, 2 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 1801520a..1a948c05 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2461,12 +2461,14 @@ impl CodeGenerator for Enum { } }; + // ModuleConsts has higher precedence before Rust in order to avoid problems with + // overlapping match patterns let variation = if self.is_bitfield(ctx, item) { EnumVariation::Bitfield - } else if self.is_rustified_enum(ctx, item) { - EnumVariation::Rust } else if self.is_constified_enum_module(ctx, item) { EnumVariation::ModuleConsts + } else if self.is_rustified_enum(ctx, item) { + EnumVariation::Rust } else { // We generate consts by default EnumVariation::Consts diff --git a/tests/expectations/tests/libclang-3.9/issue-1198-alias-rust-const-mod-enum.rs b/tests/expectations/tests/libclang-3.9/issue-1198-alias-rust-const-mod-enum.rs new file mode 100644 index 00000000..ed53fdf9 --- /dev/null +++ b/tests/expectations/tests/libclang-3.9/issue-1198-alias-rust-const-mod-enum.rs @@ -0,0 +1,16 @@ +/* automatically generated by rust-bindgen */ + +#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] + +pub mod MyDupeEnum { + pub type Type = u32; + pub const A: Type = 0; + pub const A_alias: Type = 0; + pub const B: Type = 1; +} +pub mod MyOtherDupeEnum { + pub type Type = u32; + pub const C: Type = 0; + pub const C_alias: Type = 0; + pub const D: Type = 1; +} diff --git a/tests/expectations/tests/libclang-3.9/issue-1198-alias-rust-enum.rs b/tests/expectations/tests/libclang-3.9/issue-1198-alias-rust-enum.rs new file mode 100644 index 00000000..b2902c89 --- /dev/null +++ b/tests/expectations/tests/libclang-3.9/issue-1198-alias-rust-enum.rs @@ -0,0 +1,18 @@ +/* automatically generated by rust-bindgen */ + +#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] + +pub const MyDupeEnum_A_alias: MyDupeEnum = MyDupeEnum::A; +#[repr(u32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum MyDupeEnum { + A = 0, + B = 1, +} +pub const MyOtherDupeEnum_C_alias: MyOtherDupeEnum = MyOtherDupeEnum::C; +#[repr(u32)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub enum MyOtherDupeEnum { + C = 0, + D = 1, +} diff --git a/tests/headers/issue-1198-alias-rust-const-mod-enum.h b/tests/headers/issue-1198-alias-rust-const-mod-enum.h new file mode 100644 index 00000000..944fac31 --- /dev/null +++ b/tests/headers/issue-1198-alias-rust-const-mod-enum.h @@ -0,0 +1,13 @@ +// bindgen-flags: --rustified-enum '.*' --constified-enum-module '.*' + +typedef enum MyDupeEnum { + A = 0, + A_alias = 0, + B, +} MyDupeEnum; + +enum MyOtherDupeEnum { + C = 0, + C_alias = 0, + D, +};
\ No newline at end of file diff --git a/tests/headers/issue-1198-alias-rust-enum.h b/tests/headers/issue-1198-alias-rust-enum.h new file mode 100644 index 00000000..ede44f0a --- /dev/null +++ b/tests/headers/issue-1198-alias-rust-enum.h @@ -0,0 +1,14 @@ +// bindgen-flags: --rustified-enum '.*' + + +typedef enum MyDupeEnum { + A = 0, + A_alias = 0, + B, +} MyDupeEnum; + +enum MyOtherDupeEnum { + C = 0, + C_alias = 0, + D, +};
\ No newline at end of file |