autocxx: Generate impls for abstract types too
Backport of https://github.com/google/autocxx/pull/1137.
Change-Id: I80e69a93880adf3f907078a55fbdb4e99f15ff2b
Signed-off-by: Brian Silverman <bsilver16384@gmail.com>
diff --git a/third_party/autocxx/engine/src/conversion/codegen_rs/mod.rs b/third_party/autocxx/engine/src/conversion/codegen_rs/mod.rs
index 5dd4cbb..9bea2e0 100644
--- a/third_party/autocxx/engine/src/conversion/codegen_rs/mod.rs
+++ b/third_party/autocxx/engine/src/conversion/codegen_rs/mod.rs
@@ -1042,6 +1042,7 @@
extern_c_mod_items: vec![
self.generate_cxxbridge_type(name, false, doc_attrs)
],
+ bridge_items: create_impl_items(&id, movable, destroyable, self.config),
bindgen_mod_items,
materializations,
..Default::default()
diff --git a/third_party/autocxx/integration-tests/tests/integration_test.rs b/third_party/autocxx/integration-tests/tests/integration_test.rs
index 16c792b8..75319c9 100644
--- a/third_party/autocxx/integration-tests/tests/integration_test.rs
+++ b/third_party/autocxx/integration-tests/tests/integration_test.rs
@@ -9430,6 +9430,43 @@
}
#[test]
+fn test_abstract_up_multiple_bridge() {
+ let hdr = indoc! {"
+ #include <memory>
+ class A {
+ public:
+ virtual void foo() const = 0;
+ virtual ~A() {}
+ };
+ class B : public A {
+ public:
+ void foo() const {}
+ };
+ inline std::unique_ptr<A> get_a() { return std::make_unique<B>(); }
+ "};
+ let hexathorpe = Token);
+ let rs = quote! {
+ autocxx::include_cpp! {
+ #hexathorpe include "input.h"
+ safety!(unsafe_ffi)
+ generate!("A")
+ }
+ autocxx::include_cpp! {
+ #hexathorpe include "input.h"
+ safety!(unsafe_ffi)
+ name!(ffi2)
+ extern_cpp_type!("A", crate::ffi::A)
+ generate!("get_a")
+ }
+ fn main() {
+ let a = ffi2::get_a();
+ a.foo();
+ }
+ };
+ do_run_test_manual("", hdr, rs, None, None).unwrap();
+}
+
+#[test]
fn test_abstract_private() {
let hdr = indoc! {"
#include <memory>