summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Finkenauer <tmfinken@gmail.com>2018-03-11 18:26:31 -0400
committerTravis Finkenauer <tmfinken@gmail.com>2018-03-11 18:26:31 -0400
commit7b99b2512921fd7540a0b8f9717c6e38fec376e1 (patch)
treec8223a3ab4f74af1236703a05ec5cedbdd9d4db1
parentf36f4e3e38d5a4f9c712a5bbde68403ce716dab6 (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
-rw-r--r--src/codegen/mod.rs6
-rw-r--r--tests/expectations/tests/libclang-3.9/issue-1198-alias-rust-const-mod-enum.rs16
-rw-r--r--tests/expectations/tests/libclang-3.9/issue-1198-alias-rust-enum.rs18
-rw-r--r--tests/headers/issue-1198-alias-rust-const-mod-enum.h13
-rw-r--r--tests/headers/issue-1198-alias-rust-enum.h14
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