summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJean-Philippe DUFRAIGNE <j.dufraigne@gmail.com>2016-11-08 20:19:13 +0000
committerJean-Philippe DUFRAIGNE <j.dufraigne@gmail.com>2016-11-11 21:17:08 +0000
commitb5d879ae4a88068e96b9fc701e55cd64e2a9ba39 (patch)
tree1cdb16fcf0ebdc0c43a841521cdb565df9553c89 /tests
parent08f56c3fc4b204313918f9dbbce935ace4365f43 (diff)
Use __BindegenComplex for C Complex Fix #72
C complex only exists for floating point types. C Complex are built in types long double _Complex is not supported. Long double would be an f128, runing generated binding test produces: assertion failed: `(left == right)` (left: `16`, right: `32`)', tests/expectations/tests/complex.rs:72 We test global long double _Complex because it does not require layout tests. Handle all the different way a complex can be present in BindgenContext calling generated_bindegen_complex to indicate that __BindgenContext will need to be added.
Diffstat (limited to 'tests')
-rw-r--r--tests/expectations/tests/complex.rs76
-rw-r--r--tests/expectations/tests/complex_global.rs24
-rw-r--r--tests/expectations/tests/convert-floats.rs10
-rw-r--r--tests/headers/complex.h23
-rw-r--r--tests/headers/complex_global.h3
-rw-r--r--tests/headers/convert-floats.h2
-rw-r--r--tests/headers/whitelist_basic.hpp1
7 files changed, 80 insertions, 59 deletions
diff --git a/tests/expectations/tests/complex.rs b/tests/expectations/tests/complex.rs
index e11a049e..f2a97952 100644
--- a/tests/expectations/tests/complex.rs
+++ b/tests/expectations/tests/complex.rs
@@ -4,81 +4,61 @@
#![allow(non_snake_case)]
+#[derive(PartialEq, Copy, Clone, Hash, Debug, Default)]
#[repr(C)]
-#[derive(Debug, Copy)]
-pub struct Testdouble {
- pub mMember: [f64; 2usize],
-}
-#[test]
-fn bindgen_test_layout_Testdouble() {
- assert_eq!(::std::mem::size_of::<Testdouble>() , 16usize);
- assert_eq!(::std::mem::align_of::<Testdouble>() , 8usize);
-}
-impl Clone for Testdouble {
- fn clone(&self) -> Self { *self }
-}
-#[repr(C)]
-#[derive(Debug, Copy)]
-pub struct TestdoublePtr {
- pub mMember: *mut [f64; 2usize],
-}
-#[test]
-fn bindgen_test_layout_TestdoublePtr() {
- assert_eq!(::std::mem::size_of::<TestdoublePtr>() , 8usize);
- assert_eq!(::std::mem::align_of::<TestdoublePtr>() , 8usize);
-}
-impl Clone for TestdoublePtr {
- fn clone(&self) -> Self { *self }
+pub struct __BindgenComplex<T> {
+ pub re: T,
+ pub im: T,
}
#[repr(C)]
#[derive(Debug, Copy)]
-pub struct Testfloat {
- pub mMember: [f32; 2usize],
+pub struct TestDouble {
+ pub mMember: __BindgenComplex<f64>,
}
#[test]
-fn bindgen_test_layout_Testfloat() {
- assert_eq!(::std::mem::size_of::<Testfloat>() , 8usize);
- assert_eq!(::std::mem::align_of::<Testfloat>() , 4usize);
+fn bindgen_test_layout_TestDouble() {
+ assert_eq!(::std::mem::size_of::<TestDouble>() , 16usize);
+ assert_eq!(::std::mem::align_of::<TestDouble>() , 8usize);
}
-impl Clone for Testfloat {
+impl Clone for TestDouble {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy)]
-pub struct TestfloatPtr {
- pub mMember: *mut [f32; 2usize],
+pub struct TestDoublePtr {
+ pub mMember: *mut __BindgenComplex<f64>,
}
#[test]
-fn bindgen_test_layout_TestfloatPtr() {
- assert_eq!(::std::mem::size_of::<TestfloatPtr>() , 8usize);
- assert_eq!(::std::mem::align_of::<TestfloatPtr>() , 8usize);
+fn bindgen_test_layout_TestDoublePtr() {
+ assert_eq!(::std::mem::size_of::<TestDoublePtr>() , 8usize);
+ assert_eq!(::std::mem::align_of::<TestDoublePtr>() , 8usize);
}
-impl Clone for TestfloatPtr {
+impl Clone for TestDoublePtr {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy)]
-pub struct Testint {
- pub mMember: [::std::os::raw::c_int; 2usize],
+pub struct TestFloat {
+ pub mMember: __BindgenComplex<f32>,
}
#[test]
-fn bindgen_test_layout_Testint() {
- assert_eq!(::std::mem::size_of::<Testint>() , 8usize);
- assert_eq!(::std::mem::align_of::<Testint>() , 4usize);
+fn bindgen_test_layout_TestFloat() {
+ assert_eq!(::std::mem::size_of::<TestFloat>() , 8usize);
+ assert_eq!(::std::mem::align_of::<TestFloat>() , 4usize);
}
-impl Clone for Testint {
+impl Clone for TestFloat {
fn clone(&self) -> Self { *self }
}
#[repr(C)]
#[derive(Debug, Copy)]
-pub struct TestintPtr {
- pub mMember: *mut [::std::os::raw::c_int; 2usize],
+pub struct TestFloatPtr {
+ pub mMember: *mut __BindgenComplex<f32>,
}
#[test]
-fn bindgen_test_layout_TestintPtr() {
- assert_eq!(::std::mem::size_of::<TestintPtr>() , 8usize);
- assert_eq!(::std::mem::align_of::<TestintPtr>() , 8usize);
+fn bindgen_test_layout_TestFloatPtr() {
+ assert_eq!(::std::mem::size_of::<TestFloatPtr>() , 8usize);
+ assert_eq!(::std::mem::align_of::<TestFloatPtr>() , 8usize);
}
-impl Clone for TestintPtr {
+impl Clone for TestFloatPtr {
fn clone(&self) -> Self { *self }
}
diff --git a/tests/expectations/tests/complex_global.rs b/tests/expectations/tests/complex_global.rs
new file mode 100644
index 00000000..badc4d1f
--- /dev/null
+++ b/tests/expectations/tests/complex_global.rs
@@ -0,0 +1,24 @@
+/* automatically generated by rust-bindgen */
+
+
+#![allow(non_snake_case)]
+
+
+#[derive(PartialEq, Copy, Clone, Hash, Debug, Default)]
+#[repr(C)]
+pub struct __BindgenComplex<T> {
+ pub re: T,
+ pub im: T,
+}
+extern "C" {
+ #[link_name = "globalValueFloat"]
+ pub static mut globalValueFloat: __BindgenComplex<f32>;
+}
+extern "C" {
+ #[link_name = "globalValueDouble"]
+ pub static mut globalValueDouble: __BindgenComplex<f64>;
+}
+extern "C" {
+ #[link_name = "globalValueLongDouble"]
+ pub static mut globalValueLongDouble: __BindgenComplex<f64>;
+}
diff --git a/tests/expectations/tests/convert-floats.rs b/tests/expectations/tests/convert-floats.rs
index ed5bcdcd..5cd38c13 100644
--- a/tests/expectations/tests/convert-floats.rs
+++ b/tests/expectations/tests/convert-floats.rs
@@ -4,6 +4,12 @@
#![allow(non_snake_case)]
+#[derive(PartialEq, Copy, Clone, Hash, Debug, Default)]
+#[repr(C)]
+pub struct __BindgenComplex<T> {
+ pub re: T,
+ pub im: T,
+}
#[repr(C)]
#[derive(Debug, Copy)]
pub struct foo {
@@ -11,10 +17,12 @@ pub struct foo {
pub baz: ::std::os::raw::c_float,
pub bazz: ::std::os::raw::c_double,
pub bazzz: *mut ::std::os::raw::c_double,
+ pub complexFloat: __BindgenComplex<::std::os::raw::c_float>,
+ pub complexDouble: __BindgenComplex<::std::os::raw::c_double>,
}
#[test]
fn bindgen_test_layout_foo() {
- assert_eq!(::std::mem::size_of::<foo>() , 24usize);
+ assert_eq!(::std::mem::size_of::<foo>() , 48usize);
assert_eq!(::std::mem::align_of::<foo>() , 8usize);
}
impl Clone for foo {
diff --git a/tests/headers/complex.h b/tests/headers/complex.h
index ad7af59f..04877a4e 100644
--- a/tests/headers/complex.h
+++ b/tests/headers/complex.h
@@ -1,13 +1,16 @@
-#define COMPLEX_TEST(ty_) \
- struct Test##ty_ { \
- ty_ _Complex mMember; \
- \
- }; \
- struct Test##ty_##Ptr { \
- ty_ _Complex* mMember; \
+#define COMPLEX_TEST(ty_, name_) \
+ struct Test##name_ { \
+ ty_ _Complex mMember; \
+ \
+ }; \
+ struct Test##name_##Ptr { \
+ ty_ _Complex* mMember; \
};
-COMPLEX_TEST(double)
-COMPLEX_TEST(float)
-COMPLEX_TEST(int)
+COMPLEX_TEST(double, Double)
+COMPLEX_TEST(float, Float)
+
+// FIXME: 128-byte-aligned in some machines
+// which we can't support right now in Rust.
+// COMPLEX_TEST(long double, LongDouble)
diff --git a/tests/headers/complex_global.h b/tests/headers/complex_global.h
new file mode 100644
index 00000000..d9f9fb01
--- /dev/null
+++ b/tests/headers/complex_global.h
@@ -0,0 +1,3 @@
+float _Complex globalValueFloat;
+double _Complex globalValueDouble;
+long double _Complex globalValueLongDouble;
diff --git a/tests/headers/convert-floats.h b/tests/headers/convert-floats.h
index 0e0ebd33..08d9fe0b 100644
--- a/tests/headers/convert-floats.h
+++ b/tests/headers/convert-floats.h
@@ -4,4 +4,6 @@ struct foo {
float bar, baz;
double bazz;
long double* bazzz;
+ float _Complex complexFloat;
+ double _Complex complexDouble;
};
diff --git a/tests/headers/whitelist_basic.hpp b/tests/headers/whitelist_basic.hpp
index 661528ba..8424f75a 100644
--- a/tests/headers/whitelist_basic.hpp
+++ b/tests/headers/whitelist_basic.hpp
@@ -12,4 +12,5 @@ class WhitelistMe {
struct DontWhitelistMe {
void* foo;
+ double _Complex noComplexGenerated;
};