Pass improper ctype references by void pointer
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index c86dc91..c0e71e1 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -287,6 +287,10 @@
                     None => quote!(::cxx::private::RustVec::from_ref(#var)),
                     Some(_) => quote!(::cxx::private::RustVec::from_mut(#var)),
                 },
+                inner if types.is_considered_improper_ctype(inner) => match ty.mutability {
+                    None => quote!(#var as *const #inner as *const ::std::ffi::c_void),
+                    Some(_) => quote!(#var as *mut #inner as *mut ::std::ffi::c_void),
+                },
                 _ => quote!(#var),
             },
             Type::Str(_) => quote!(::cxx::private::RustStr::from(#var)),
@@ -376,6 +380,10 @@
                         None => quote!(#call.as_vec()),
                         Some(_) => quote!(#call.as_mut_vec()),
                     },
+                    inner if types.is_considered_improper_ctype(inner) => {
+                        let mutability = ty.mutability;
+                        quote!(&#mutability *#call.cast())
+                    }
                     _ => call,
                 },
                 Type::Str(_) => quote!(#call.as_str()),
@@ -545,6 +553,10 @@
                     None => quote!(#ident.as_vec()),
                     Some(_) => quote!(#ident.as_mut_vec()),
                 },
+                inner if types.is_considered_improper_ctype(inner) => {
+                    let mutability = ty.mutability;
+                    quote!(&#mutability *#ident.cast())
+                }
                 _ => quote!(#ident),
             },
             Type::Str(_) => quote!(#ident.as_str()),
@@ -593,6 +605,10 @@
                 None => Some(quote!(::cxx::private::RustVec::from_ref)),
                 Some(_) => Some(quote!(::cxx::private::RustVec::from_mut)),
             },
+            inner if types.is_considered_improper_ctype(inner) => match ty.mutability {
+                None => Some(quote!((|v| v as *const #inner as *const ::std::ffi::c_void))),
+                Some(_) => Some(quote!((|v| v as *mut #inner as *mut ::std::ffi::c_void))),
+            },
             _ => None,
         },
         Type::Str(_) => Some(quote!(::cxx::private::RustStr::from)),
@@ -960,6 +976,10 @@
                     let inner = expand_extern_type(&ty.inner, types);
                     quote!(&#mutability ::cxx::private::RustVec<#inner>)
                 }
+                inner if types.is_considered_improper_ctype(inner) => match mutability {
+                    None => quote!(*const ::std::ffi::c_void),
+                    Some(_) => quote!(*#mutability ::std::ffi::c_void),
+                },
                 _ => quote!(#ty),
             }
         }