@@ -583,8 +583,16 @@ fn expand_extern_shared_struct(ety: &ExternType, ffi: &Module) -> TokenStream {
583583fn expand_cxx_function_decl ( efn : & ExternFn , types : & Types ) -> TokenStream {
584584 let generics = & efn. generics ;
585585 let receiver = efn. receiver ( ) . into_iter ( ) . map ( |receiver| {
586- let receiver_type = receiver. ty ( ) ;
587- quote ! ( _: #receiver_type)
586+ if types. is_considered_improper_ctype ( & receiver. ty ) {
587+ if receiver. mutable {
588+ quote ! ( _: * mut :: cxx:: core:: ffi:: c_void)
589+ } else {
590+ quote ! ( _: * const :: cxx:: core:: ffi:: c_void)
591+ }
592+ } else {
593+ let receiver_type = receiver. ty ( ) ;
594+ quote ! ( _: #receiver_type)
595+ }
588596 } ) ;
589597 let args = efn. args . iter ( ) . map ( |arg| {
590598 let var = & arg. name . rust ;
@@ -650,10 +658,23 @@ fn expand_cxx_function_shim(efn: &ExternFn, types: &Types) -> TokenStream {
650658 expand_return_type ( & efn. ret )
651659 } ;
652660 let indirect_return = indirect_return ( efn, types) ;
653- let receiver_var = efn
654- . receiver ( )
655- . into_iter ( )
656- . map ( |receiver| receiver. var . to_token_stream ( ) ) ;
661+ let receiver_var = efn. receiver ( ) . into_iter ( ) . map ( |receiver| {
662+ if types. is_considered_improper_ctype ( & receiver. ty ) {
663+ let var = receiver. var ;
664+ let ty = & receiver. ty . rust ;
665+ let resolve = types. resolve ( ty) ;
666+ let lifetimes = resolve. generics . to_underscore_lifetimes ( ) ;
667+ if receiver. pinned {
668+ quote ! ( :: cxx:: core:: pin:: Pin :: into_inner_unchecked( #var) as * mut #ty #lifetimes as * mut :: cxx:: core:: ffi:: c_void)
669+ } else if receiver. mutable {
670+ quote ! ( #var as * mut #ty #lifetimes as * mut :: cxx:: core:: ffi:: c_void)
671+ } else {
672+ quote ! ( #var as * const #ty #lifetimes as * const :: cxx:: core:: ffi:: c_void)
673+ }
674+ } else {
675+ receiver. var . to_token_stream ( )
676+ }
677+ } ) ;
657678 let arg_vars = efn. args . iter ( ) . map ( |arg| {
658679 let var = & arg. name . rust ;
659680 let span = var. span ( ) ;
0 commit comments