Fix and test passing Vec by value from Rust to C
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index e7eece0..e0f3cc7 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -207,7 +207,7 @@
             }
             Type::RustBox(_) => quote!(::std::boxed::Box::into_raw(#var)),
             Type::UniquePtr(_) => quote!(::cxx::UniquePtr::into_raw(#var)),
-            Type::RustVec(_) => quote!(::cxx::private::RustVec::from(#var)),
+            Type::RustVec(_) => quote!(#var.as_mut_ptr() as *mut ::cxx::private::RustVec<_>),
             Type::Ref(ty) => match &ty.inner {
                 Type::Ident(ident) if ident == RustString => {
                     quote!(::cxx::private::RustString::from_ref(#var))
diff --git a/tests/ffi/lib.rs b/tests/ffi/lib.rs
index d66bcc0..fca9808 100644
--- a/tests/ffi/lib.rs
+++ b/tests/ffi/lib.rs
@@ -49,8 +49,9 @@
         fn c_take_unique_ptr_vector_f64(v: UniquePtr<CxxVector<f64>>);
         fn c_take_unique_ptr_vector_shared(v: UniquePtr<CxxVector<Shared>>);
         fn c_take_ref_vector(v: &CxxVector<u8>);
-        fn c_take_vec_u8(v: &Vec<u8>);
-        fn c_take_vec_shared(v: &Vec<Shared>);
+        fn c_take_rust_vec(v: Vec<u8>);
+        fn c_take_rust_vec_shared(v: Vec<Shared>);
+        fn c_take_ref_rust_vec(v: &Vec<u8>);
         fn c_take_callback(callback: fn(String) -> usize);
 
         fn c_try_return_void() -> Result<()>;
diff --git a/tests/ffi/tests.cc b/tests/ffi/tests.cc
index 805e9b9..c0b5888 100644
--- a/tests/ffi/tests.cc
+++ b/tests/ffi/tests.cc
@@ -187,14 +187,9 @@
   }
 }
 
-void c_take_vec_u8(const rust::Vec<uint8_t> &v) {
-  uint8_t sum = std::accumulate(v.begin(), v.end(), 0);
-  if (sum == 200) {
-    cxx_test_suite_set_correct();
-  }
-}
+void c_take_rust_vec(rust::Vec<uint8_t> v) { c_take_ref_rust_vec(v); }
 
-void c_take_vec_shared(const rust::Vec<Shared> &v) {
+void c_take_rust_vec_shared(rust::Vec<Shared> v) {
   uint32_t sum = 0;
   for (auto i : v) {
     sum += i.z;
@@ -204,6 +199,13 @@
   }
 }
 
+void c_take_ref_rust_vec(const rust::Vec<uint8_t> &v) {
+  uint8_t sum = std::accumulate(v.begin(), v.end(), 0);
+  if (sum == 200) {
+    cxx_test_suite_set_correct();
+  }
+}
+
 void c_take_callback(rust::Fn<size_t(rust::String)> callback) {
   callback("2020");
 }
diff --git a/tests/ffi/tests.h b/tests/ffi/tests.h
index 81125f8..1d617ab 100644
--- a/tests/ffi/tests.h
+++ b/tests/ffi/tests.h
@@ -53,8 +53,9 @@
 void c_take_unique_ptr_vector_f64(std::unique_ptr<std::vector<double>> v);
 void c_take_unique_ptr_vector_shared(std::unique_ptr<std::vector<Shared>> v);
 void c_take_ref_vector(const std::vector<uint8_t> &v);
-void c_take_vec_u8(const rust::Vec<uint8_t> &v);
-void c_take_vec_shared(const rust::Vec<Shared> &v);
+void c_take_rust_vec(rust::Vec<uint8_t> v);
+void c_take_rust_vec_shared(rust::Vec<Shared> v);
+void c_take_ref_rust_vec(const rust::Vec<uint8_t> &v);
 void c_take_callback(rust::Fn<size_t(rust::String)> callback);
 
 void c_try_return_void();
diff --git a/tests/test.rs b/tests/test.rs
index 771fe9b..07c23bd 100644
--- a/tests/test.rs
+++ b/tests/test.rs
@@ -92,11 +92,14 @@
         ffi::c_return_unique_ptr_vector_shared()
     ));
     check!(ffi::c_take_ref_vector(&ffi::c_return_unique_ptr_vector_u8()));
-    check!(ffi::c_take_vec_u8(&[86_u8, 75_u8, 30_u8, 9_u8].to_vec()));
-    check!(ffi::c_take_vec_shared(&vec![
+    check!(ffi::c_take_rust_vec([86_u8, 75_u8, 30_u8, 9_u8].to_vec()));
+    check!(ffi::c_take_rust_vec_shared(vec![
         ffi::Shared { z: 1010 },
         ffi::Shared { z: 1011 }
     ]));
+    check!(ffi::c_take_ref_rust_vec(
+        &[86_u8, 75_u8, 30_u8, 9_u8].to_vec()
+    ));
 }
 
 #[test]