Fix issue with indirect return for C++ member function w/no args
diff --git a/gen/src/write.rs b/gen/src/write.rs
index c06fce9..2cf9faf 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -424,7 +424,7 @@
}
let indirect_return = indirect_return(efn, types);
if indirect_return {
- if !efn.args.is_empty() {
+ if !efn.args.is_empty() || efn.receiver.is_some() {
write!(out, ", ");
}
write_indirect_return_type_space(out, efn.ret.as_ref().unwrap());
diff --git a/src/exception.rs b/src/exception.rs
index 125e484..e16916a 100644
--- a/src/exception.rs
+++ b/src/exception.rs
@@ -1,7 +1,7 @@
use std::fmt::{self, Debug, Display};
/// Exception thrown from an `extern "C"` function.
-#[derive(Debug)]
+#[derive(Debug, PartialEq)]
pub struct Exception {
pub(crate) what: Box<str>,
}
diff --git a/tests/ffi/lib.rs b/tests/ffi/lib.rs
index d4e96fc..51716e0 100644
--- a/tests/ffi/lib.rs
+++ b/tests/ffi/lib.rs
@@ -83,6 +83,8 @@
fn set(self: &mut C, n: usize) -> usize;
fn get2(&self) -> usize;
fn set2(&mut self, n: usize) -> usize;
+ fn set_succeed(&mut self, n: usize) -> Result<usize>;
+ fn get_fail(&mut self) -> Result<usize>;
}
extern "C" {
diff --git a/tests/ffi/tests.cc b/tests/ffi/tests.cc
index af7a4a0..677a55d 100644
--- a/tests/ffi/tests.cc
+++ b/tests/ffi/tests.cc
@@ -28,6 +28,10 @@
return this->n;
}
+size_t C::set_succeed(size_t n) { return this->set2(n); }
+
+size_t C::get_fail() { throw std::runtime_error("unimplemented"); }
+
const std::vector<uint8_t> &C::get_v() const { return this->v; }
size_t c_return_primitive() { return 2020; }
diff --git a/tests/ffi/tests.h b/tests/ffi/tests.h
index 1173a0a..c1a08d2 100644
--- a/tests/ffi/tests.h
+++ b/tests/ffi/tests.h
@@ -16,6 +16,8 @@
size_t set(size_t n);
size_t get2() const;
size_t set2(size_t n);
+ size_t set_succeed(size_t n);
+ size_t get_fail();
const std::vector<uint8_t> &get_v() const;
private:
diff --git a/tests/test.rs b/tests/test.rs
index 91bd25e..836e2d3 100644
--- a/tests/test.rs
+++ b/tests/test.rs
@@ -157,7 +157,9 @@
assert_eq!(2021, unique_ptr.set(2021));
assert_eq!(2021, unique_ptr.get());
assert_eq!(old_value, unique_ptr.set2(old_value));
- assert_eq!(old_value, unique_ptr.get2())
+ assert_eq!(old_value, unique_ptr.get2());
+ assert_eq!(Ok(2022), unique_ptr.set_succeed(2022));
+ assert!(unique_ptr.get_fail().is_err());
}
#[test]