Fix and test returning Vec by reference from C to Rust
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index d27c15c..e7eece0 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -287,6 +287,7 @@
                 Type::Ident(ident) if ident == RustString => {
                     Some(quote!(#call.map(|r| r.as_string())))
                 }
+                Type::RustVec(_) => Some(quote!(#call.map(|r| r.as_vec()))),
                 _ => None,
             },
             Type::Str(_) => Some(quote!(#call.map(|r| r.as_str()))),
@@ -301,6 +302,7 @@
             Type::UniquePtr(_) => Some(quote!(::cxx::UniquePtr::from_raw(#call))),
             Type::Ref(ty) => match &ty.inner {
                 Type::Ident(ident) if ident == RustString => Some(quote!(#call.as_string())),
+                Type::RustVec(_) => Some(quote!(#call.as_vec())),
                 _ => None,
             },
             Type::Str(_) => Some(quote!(#call.as_str())),
diff --git a/tests/ffi/lib.rs b/tests/ffi/lib.rs
index 6e636d8..d66bcc0 100644
--- a/tests/ffi/lib.rs
+++ b/tests/ffi/lib.rs
@@ -33,6 +33,7 @@
         fn c_return_unique_ptr_vector_opaque() -> UniquePtr<CxxVector<C>>;
         fn c_return_ref_vector(c: &C) -> &CxxVector<u8>;
         fn c_return_rust_vec() -> Vec<u8>;
+        fn c_return_ref_rust_vec(c: &C) -> &Vec<u8>;
 
         fn c_take_primitive(n: usize);
         fn c_take_shared(shared: Shared);
@@ -62,6 +63,7 @@
         fn c_try_return_rust_string() -> Result<String>;
         fn c_try_return_unique_ptr_string() -> Result<UniquePtr<CxxString>>;
         fn c_try_return_rust_vec() -> Result<Vec<u8>>;
+        fn c_try_return_ref_rust_vec(c: &C) -> Result<&Vec<u8>>;
 
         fn get(self: &C) -> usize;
         fn set(self: &mut C, n: usize) -> usize;
diff --git a/tests/ffi/tests.cc b/tests/ffi/tests.cc
index 8ea3d06..805e9b9 100644
--- a/tests/ffi/tests.cc
+++ b/tests/ffi/tests.cc
@@ -97,6 +97,11 @@
   throw std::runtime_error("unimplemented");
 }
 
+const rust::Vec<uint8_t> &c_return_ref_rust_vec(const C &c) {
+  (void)c;
+  throw std::runtime_error("unimplemented");
+}
+
 void c_take_primitive(size_t n) {
   if (n == 2020) {
     cxx_test_suite_set_correct();
@@ -227,6 +232,11 @@
   throw std::runtime_error("unimplemented");
 }
 
+const rust::Vec<uint8_t> &c_try_return_ref_rust_vec(const C &c) {
+  (void)c;
+  throw std::runtime_error("unimplemented");
+}
+
 extern "C" C *cxx_test_suite_get_unique_ptr() noexcept {
   return std::unique_ptr<C>(new C{2020}).release();
 }
diff --git a/tests/ffi/tests.h b/tests/ffi/tests.h
index 22fed58..81125f8 100644
--- a/tests/ffi/tests.h
+++ b/tests/ffi/tests.h
@@ -37,6 +37,7 @@
 std::unique_ptr<std::vector<C>> c_return_unique_ptr_vector_opaque();
 const std::vector<uint8_t> &c_return_ref_vector(const C &c);
 rust::Vec<uint8_t> c_return_rust_vec();
+const rust::Vec<uint8_t> &c_return_ref_rust_vec(const C &c);
 
 void c_take_primitive(size_t n);
 void c_take_shared(Shared shared);
@@ -66,5 +67,6 @@
 rust::String c_try_return_rust_string();
 std::unique_ptr<std::string> c_try_return_unique_ptr_string();
 rust::Vec<uint8_t> c_try_return_rust_vec();
+const rust::Vec<uint8_t> &c_try_return_ref_rust_vec(const C &c);
 
 } // namespace tests