summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2018-01-22 10:11:21 +0100
committerEmilio Cobos Álvarez <emilio@crisal.io>2018-01-22 10:11:21 +0100
commita79b404c9dc08aed6dbe7bf07c20647666e9f65d (patch)
tree58aa716a127d75f6e00ec2c1fe24df04d80b3ce8
parent8fa15cc9b93bffdb93ac05c374eca25157bcf281 (diff)
codegen: Try to reasonably handle enum : bool.
Just use the repr name we generate, since we generate constants for that. It's not worth trying to guess the actual type to use IMO. Bindings lose a bit of portability I guess, but that's really a lost bet already, so instead of special-casing bool and map constants, let's use a consistent representation everywhere. Fixes #1145
-rw-r--r--src/codegen/mod.rs11
-rw-r--r--tests/expectations/tests/bitfield-enum-basic.rs10
-rw-r--r--tests/expectations/tests/constify-all-enums.rs4
-rw-r--r--tests/expectations/tests/constify-module-enums-basic.rs4
-rw-r--r--tests/expectations/tests/constify-module-enums-namespace.rs4
-rw-r--r--tests/expectations/tests/constify-module-enums-shadow-name.rs4
-rw-r--r--tests/expectations/tests/constify-module-enums-simple-alias.rs4
-rw-r--r--tests/expectations/tests/constify-module-enums-simple-nonamespace.rs4
-rw-r--r--tests/expectations/tests/constify-module-enums-types.rs12
-rw-r--r--tests/expectations/tests/empty-enum.rs12
-rw-r--r--tests/expectations/tests/enum_explicit_type.rs5
-rw-r--r--tests/expectations/tests/enum_explicit_type_constants.rs21
-rw-r--r--tests/expectations/tests/prepend_enum_name.rs4
-rw-r--r--tests/headers/enum_explicit_type.hpp4
-rw-r--r--tests/headers/enum_explicit_type_constants.hpp5
15 files changed, 61 insertions, 47 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs
index 5641b84d..43a2ec09 100644
--- a/src/codegen/mod.rs
+++ b/src/codegen/mod.rs
@@ -2486,13 +2486,10 @@ impl CodeGenerator for Enum {
});
}
- let repr =
- self.repr()
- .and_then(|repr| repr.try_to_rust_ty_or_opaque(ctx, &()).ok())
- .unwrap_or_else(|| {
- let repr_name = ctx.rust_ident_raw(repr_name);
- quote! { #repr_name }
- });
+ let repr = {
+ let repr_name = ctx.rust_ident_raw(repr_name);
+ quote! { #repr_name }
+ };
let mut builder = EnumBuilder::new(
&name,
diff --git a/tests/expectations/tests/bitfield-enum-basic.rs b/tests/expectations/tests/bitfield-enum-basic.rs
index 84362d12..091dc70b 100644
--- a/tests/expectations/tests/bitfield-enum-basic.rs
+++ b/tests/expectations/tests/bitfield-enum-basic.rs
@@ -1,9 +1,7 @@
/* automatically generated by rust-bindgen */
-
#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
-
pub const Foo_Bar: Foo = Foo(2);
pub const Foo_Baz: Foo = Foo(4);
pub const Foo_Duplicated: Foo = Foo(4);
@@ -36,7 +34,7 @@ impl ::std::ops::BitAndAssign for Foo {
}
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub struct Foo(pub ::std::os::raw::c_int);
+pub struct Foo(pub i32);
pub const Buz_Bar: Buz = Buz(2);
pub const Buz_Baz: Buz = Buz(4);
pub const Buz_Duplicated: Buz = Buz(4);
@@ -69,7 +67,7 @@ impl ::std::ops::BitAndAssign for Buz {
}
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub struct Buz(pub ::std::os::raw::c_schar);
+pub struct Buz(pub i8);
pub const NS_FOO: _bindgen_ty_1 = _bindgen_ty_1(1);
pub const NS_BAR: _bindgen_ty_1 = _bindgen_ty_1(2);
impl ::std::ops::BitOr<_bindgen_ty_1> for _bindgen_ty_1 {
@@ -100,7 +98,7 @@ impl ::std::ops::BitAndAssign for _bindgen_ty_1 {
}
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub struct _bindgen_ty_1(pub ::std::os::raw::c_uint);
+pub struct _bindgen_ty_1(pub u32);
#[repr(C)]
#[derive(Debug, Default, Copy, Clone)]
pub struct Dummy {
@@ -136,7 +134,7 @@ impl ::std::ops::BitAndAssign for Dummy__bindgen_ty_1 {
}
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
-pub struct Dummy__bindgen_ty_1(pub ::std::os::raw::c_uint);
+pub struct Dummy__bindgen_ty_1(pub u32);
#[test]
fn bindgen_test_layout_Dummy() {
assert_eq!(
diff --git a/tests/expectations/tests/constify-all-enums.rs b/tests/expectations/tests/constify-all-enums.rs
index 1d518b54..b2e1e974 100644
--- a/tests/expectations/tests/constify-all-enums.rs
+++ b/tests/expectations/tests/constify-all-enums.rs
@@ -1,13 +1,11 @@
/* automatically generated by rust-bindgen */
-
#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
-
pub const foo_THIS: foo = 0;
pub const foo_SHOULD_BE: foo = 1;
pub const foo_A_CONSTANT: foo = 2;
-pub type foo = ::std::os::raw::c_uint;
+pub type foo = u32;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct bar {
diff --git a/tests/expectations/tests/constify-module-enums-basic.rs b/tests/expectations/tests/constify-module-enums-basic.rs
index f8f45f18..342e5ba5 100644
--- a/tests/expectations/tests/constify-module-enums-basic.rs
+++ b/tests/expectations/tests/constify-module-enums-basic.rs
@@ -1,11 +1,9 @@
/* automatically generated by rust-bindgen */
-
#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
-
pub mod foo {
- pub type Type = ::std::os::raw::c_uint;
+ pub type Type = u32;
pub const THIS: Type = 0;
pub const SHOULD_BE: Type = 1;
pub const A_CONSTANT: Type = 2;
diff --git a/tests/expectations/tests/constify-module-enums-namespace.rs b/tests/expectations/tests/constify-module-enums-namespace.rs
index a69044e2..7f1c134d 100644
--- a/tests/expectations/tests/constify-module-enums-namespace.rs
+++ b/tests/expectations/tests/constify-module-enums-namespace.rs
@@ -1,9 +1,7 @@
/* automatically generated by rust-bindgen */
-
#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
-
#[allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
pub mod root {
#[allow(unused_imports)]
@@ -15,7 +13,7 @@ pub mod root {
#[allow(unused_imports)]
use self::super::super::super::root;
pub mod foo {
- pub type Type = ::std::os::raw::c_uint;
+ pub type Type = u32;
pub const THIS: Type = 0;
pub const SHOULD_BE: Type = 1;
pub const A_CONSTANT: Type = 2;
diff --git a/tests/expectations/tests/constify-module-enums-shadow-name.rs b/tests/expectations/tests/constify-module-enums-shadow-name.rs
index b7da1cc3..96428717 100644
--- a/tests/expectations/tests/constify-module-enums-shadow-name.rs
+++ b/tests/expectations/tests/constify-module-enums-shadow-name.rs
@@ -1,11 +1,9 @@
/* automatically generated by rust-bindgen */
-
#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
-
pub mod foo {
- pub type Type = ::std::os::raw::c_uint;
+ pub type Type = u32;
pub const Type: Type = 0;
pub const Type_: Type = 1;
pub const Type1: Type = 2;
diff --git a/tests/expectations/tests/constify-module-enums-simple-alias.rs b/tests/expectations/tests/constify-module-enums-simple-alias.rs
index 89b3ead9..70c881b9 100644
--- a/tests/expectations/tests/constify-module-enums-simple-alias.rs
+++ b/tests/expectations/tests/constify-module-enums-simple-alias.rs
@@ -1,11 +1,9 @@
/* automatically generated by rust-bindgen */
-
#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
-
pub mod Foo {
- pub type Type = ::std::os::raw::c_int;
+ pub type Type = i32;
pub const Variant1: Type = 0;
pub const Variant2: Type = 1;
pub const Variant3: Type = 2;
diff --git a/tests/expectations/tests/constify-module-enums-simple-nonamespace.rs b/tests/expectations/tests/constify-module-enums-simple-nonamespace.rs
index b85edbae..ee15b57b 100644
--- a/tests/expectations/tests/constify-module-enums-simple-nonamespace.rs
+++ b/tests/expectations/tests/constify-module-enums-simple-nonamespace.rs
@@ -1,11 +1,9 @@
/* automatically generated by rust-bindgen */
-
#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
-
pub mod one_Foo {
- pub type Type = ::std::os::raw::c_int;
+ pub type Type = i32;
pub const Variant1: Type = 0;
pub const Variant2: Type = 1;
}
diff --git a/tests/expectations/tests/constify-module-enums-types.rs b/tests/expectations/tests/constify-module-enums-types.rs
index 8849cc38..155839be 100644
--- a/tests/expectations/tests/constify-module-enums-types.rs
+++ b/tests/expectations/tests/constify-module-enums-types.rs
@@ -1,11 +1,9 @@
/* automatically generated by rust-bindgen */
-
#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
-
pub mod foo {
- pub type Type = ::std::os::raw::c_uint;
+ pub type Type = u32;
pub const THIS: Type = 0;
pub const SHOULD_BE: Type = 1;
pub const A_CONSTANT: Type = 2;
@@ -13,20 +11,20 @@ pub mod foo {
pub const AND_ALSO_THIS: Type = 42;
}
pub mod anon_enum {
- pub type Type = ::std::os::raw::c_uint;
+ pub type Type = u32;
pub const Variant1: Type = 0;
pub const Variant2: Type = 1;
pub const Variant3: Type = 2;
}
pub mod ns1_foo {
- pub type Type = ::std::os::raw::c_uint;
+ pub type Type = u32;
pub const THIS: Type = 0;
pub const SHOULD_BE: Type = 1;
pub const A_CONSTANT: Type = 2;
pub const ALSO_THIS: Type = 42;
}
pub mod ns2_Foo {
- pub type Type = ::std::os::raw::c_int;
+ pub type Type = i32;
pub const Variant1: Type = 0;
pub const Variant2: Type = 1;
}
@@ -202,7 +200,7 @@ impl Default for Baz {
}
}
pub mod one_Foo {
- pub type Type = ::std::os::raw::c_int;
+ pub type Type = i32;
pub const Variant1: Type = 0;
pub const Variant2: Type = 1;
}
diff --git a/tests/expectations/tests/empty-enum.rs b/tests/expectations/tests/empty-enum.rs
index 99ffc27e..473a508a 100644
--- a/tests/expectations/tests/empty-enum.rs
+++ b/tests/expectations/tests/empty-enum.rs
@@ -2,30 +2,30 @@
#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
-pub type EmptyConstified = ::std::os::raw::c_uint;
+pub type EmptyConstified = u32;
#[repr(u32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum EmptyRustified {
__bindgen_cannot_repr_c_on_empty_enum = 0,
}
pub mod EmptyModule {
- pub type Type = ::std::os::raw::c_uint;
+ pub type Type = u32;
}
#[repr(i8)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum EmptyClassRustified {
__bindgen_cannot_repr_c_on_empty_enum = 0,
}
-pub type EmptyClassConstified = ::std::os::raw::c_char;
+pub type EmptyClassConstified = i8;
pub mod EmptyClassModule {
- pub type Type = ::std::os::raw::c_char;
+ pub type Type = i8;
}
#[repr(i8)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum ForwardClassRustified {
__bindgen_cannot_repr_c_on_empty_enum = 0,
}
-pub type ForwardClassConstified = ::std::os::raw::c_char;
+pub type ForwardClassConstified = i8;
pub mod ForwardClassModule {
- pub type Type = ::std::os::raw::c_char;
+ pub type Type = i8;
}
diff --git a/tests/expectations/tests/enum_explicit_type.rs b/tests/expectations/tests/enum_explicit_type.rs
index 17f135b3..a5ec4a57 100644
--- a/tests/expectations/tests/enum_explicit_type.rs
+++ b/tests/expectations/tests/enum_explicit_type.rs
@@ -35,3 +35,8 @@ pub enum MuchLongLong {
pub enum MuchULongLong {
MuchHigh = 4294967296,
}
+#[repr(u8)]
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+pub enum BoolEnumsAreFun {
+ Value = 1,
+}
diff --git a/tests/expectations/tests/enum_explicit_type_constants.rs b/tests/expectations/tests/enum_explicit_type_constants.rs
new file mode 100644
index 00000000..cd1a9229
--- /dev/null
+++ b/tests/expectations/tests/enum_explicit_type_constants.rs
@@ -0,0 +1,21 @@
+/* automatically generated by rust-bindgen */
+
+#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
+
+pub const Foo_Bar: Foo = 0;
+pub const Foo_Qux: Foo = 1;
+pub type Foo = u8;
+pub const Neg_MinusOne: Neg = -1;
+pub const Neg_One: Neg = 1;
+pub type Neg = i8;
+pub const Bigger_Much: Bigger = 255;
+pub const Bigger_Larger: Bigger = 256;
+pub type Bigger = u16;
+pub const MuchLong_MuchLow: MuchLong = -4294967296;
+pub type MuchLong = i64;
+pub const MuchLongLong_I64_MIN: MuchLongLong = -9223372036854775808;
+pub type MuchLongLong = i64;
+pub const MuchULongLong_MuchHigh: MuchULongLong = 4294967296;
+pub type MuchULongLong = u64;
+pub const BoolEnumsAreFun_Value: BoolEnumsAreFun = 1;
+pub type BoolEnumsAreFun = u8;
diff --git a/tests/expectations/tests/prepend_enum_name.rs b/tests/expectations/tests/prepend_enum_name.rs
index c409e54a..96c7b617 100644
--- a/tests/expectations/tests/prepend_enum_name.rs
+++ b/tests/expectations/tests/prepend_enum_name.rs
@@ -1,9 +1,7 @@
/* automatically generated by rust-bindgen */
-
#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]
-
pub const FOO_BAR: foo = 0;
pub const FOO_BAZ: foo = 1;
-pub type foo = ::std::os::raw::c_uint;
+pub type foo = u32;
diff --git a/tests/headers/enum_explicit_type.hpp b/tests/headers/enum_explicit_type.hpp
index e611de74..3cb93138 100644
--- a/tests/headers/enum_explicit_type.hpp
+++ b/tests/headers/enum_explicit_type.hpp
@@ -26,3 +26,7 @@ enum MuchLongLong: long long {
enum MuchULongLong: unsigned long long {
MuchHigh = 4294967296,
};
+
+enum BoolEnumsAreFun: bool {
+ Value = true,
+};
diff --git a/tests/headers/enum_explicit_type_constants.hpp b/tests/headers/enum_explicit_type_constants.hpp
new file mode 100644
index 00000000..7deab369
--- /dev/null
+++ b/tests/headers/enum_explicit_type_constants.hpp
@@ -0,0 +1,5 @@
+// bindgen-flags: -- -std=c++11
+//
+// This test is much like enum_explicit_type, but without --rustified-enum.
+
+#include "enum_explicit_type.hpp"