diff options
author | Jean-Philippe DUFRAIGNE <j.dufraigne@gmail.com> | 2016-11-08 20:19:13 +0000 |
---|---|---|
committer | Jean-Philippe DUFRAIGNE <j.dufraigne@gmail.com> | 2016-11-11 21:17:08 +0000 |
commit | b5d879ae4a88068e96b9fc701e55cd64e2a9ba39 (patch) | |
tree | 1cdb16fcf0ebdc0c43a841521cdb565df9553c89 /tests | |
parent | 08f56c3fc4b204313918f9dbbce935ace4365f43 (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.rs | 76 | ||||
-rw-r--r-- | tests/expectations/tests/complex_global.rs | 24 | ||||
-rw-r--r-- | tests/expectations/tests/convert-floats.rs | 10 | ||||
-rw-r--r-- | tests/headers/complex.h | 23 | ||||
-rw-r--r-- | tests/headers/complex_global.h | 3 | ||||
-rw-r--r-- | tests/headers/convert-floats.h | 2 | ||||
-rw-r--r-- | tests/headers/whitelist_basic.hpp | 1 |
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; }; |