Test Box returned from C++ to Rust
diff --git a/tests/ffi/lib.rs b/tests/ffi/lib.rs
index 098253a..d1b33c2 100644
--- a/tests/ffi/lib.rs
+++ b/tests/ffi/lib.rs
@@ -13,7 +13,7 @@
fn c_return_primitive() -> usize;
fn c_return_shared() -> Shared;
- //TODO fn c_return_box() -> Box<R>;
+ fn c_return_box() -> Box<R>;
fn c_return_unique_ptr() -> UniquePtr<C>;
fn c_return_ref(shared: &Shared) -> &usize;
fn c_return_str(shared: &Shared) -> &str;
@@ -55,7 +55,7 @@
}
}
-type R = ();
+pub type R = usize;
fn r_return_primitive() -> usize {
2020
diff --git a/tests/ffi/tests.cc b/tests/ffi/tests.cc
index c94e34d..adbf945 100644
--- a/tests/ffi/tests.cc
+++ b/tests/ffi/tests.cc
@@ -2,6 +2,7 @@
#include "tests/ffi/lib.rs"
extern "C" void cxx_test_suite_set_correct();
+extern "C" tests::R *cxx_test_suite_get_box();
namespace tests {
@@ -13,6 +14,10 @@
Shared c_return_shared() { return Shared{2020}; }
+rust::Box<R> c_return_box() {
+ return rust::Box<R>::from_raw(cxx_test_suite_get_box());
+}
+
std::unique_ptr<C> c_return_unique_ptr() {
return std::unique_ptr<C>(new C{2020});
}
diff --git a/tests/test.rs b/tests/test.rs
index 28e5c3b..eb06481 100644
--- a/tests/test.rs
+++ b/tests/test.rs
@@ -25,6 +25,7 @@
assert_eq!(2020, ffi::c_return_primitive());
assert_eq!(2020, ffi::c_return_shared().z);
+ assert_eq!(2020, *ffi::c_return_box());
ffi::c_return_unique_ptr();
assert_eq!(2020, *ffi::c_return_ref(&shared));
assert_eq!("2020", ffi::c_return_str(&shared));
@@ -45,7 +46,7 @@
check!(ffi::c_take_primitive(2020));
check!(ffi::c_take_shared(ffi::Shared { z: 2020 }));
- check!(ffi::c_take_box(Box::new(())));
+ check!(ffi::c_take_box(Box::new(2020)));
check!(ffi::c_take_ref_c(unique_ptr.as_ref().unwrap()));
check!(ffi::c_take_unique_ptr(unique_ptr));
check!(ffi::c_take_str("2020"));
@@ -69,3 +70,8 @@
}
check!(cxx_run_test());
}
+
+#[no_mangle]
+extern "C" fn cxx_test_suite_get_box() -> *mut cxx_test_suite::R {
+ Box::into_raw(Box::new(2020usize))
+}