@@ -53,7 +53,7 @@ fn expand(ffi: Module, doc: Doc, attrs: OtherAttrs, apis: &[Api], types: &Types)
53
53
for api in apis {
54
54
if let Api :: RustType ( ety) = api {
55
55
expanded. extend ( expand_rust_type_import ( ety) ) ;
56
- hidden. extend ( expand_rust_type_assert_unpin ( ety) ) ;
56
+ hidden. extend ( expand_rust_type_assert_unpin ( ety, types ) ) ;
57
57
}
58
58
}
59
59
@@ -70,15 +70,15 @@ fn expand(ffi: Module, doc: Doc, attrs: OtherAttrs, apis: &[Api], types: &Types)
70
70
let ident = & ety. name . rust ;
71
71
if !types. structs . contains_key ( ident) && !types. enums . contains_key ( ident) {
72
72
expanded. extend ( expand_cxx_type ( ety) ) ;
73
- hidden. extend ( expand_cxx_type_assert_pinned ( ety) ) ;
73
+ hidden. extend ( expand_cxx_type_assert_pinned ( ety, types ) ) ;
74
74
}
75
75
}
76
76
Api :: CxxFunction ( efn) => {
77
77
expanded. extend ( expand_cxx_function_shim ( efn, types) ) ;
78
78
}
79
79
Api :: RustType ( ety) => {
80
80
expanded. extend ( expand_rust_type_impl ( ety) ) ;
81
- hidden. extend ( expand_rust_type_layout ( ety) ) ;
81
+ hidden. extend ( expand_rust_type_layout ( ety, types ) ) ;
82
82
}
83
83
Api :: RustFunction ( efn) => hidden. extend ( expand_rust_function_shim ( efn, types) ) ,
84
84
Api :: TypeAlias ( alias) => {
@@ -396,10 +396,13 @@ fn expand_cxx_type(ety: &ExternType) -> TokenStream {
396
396
}
397
397
}
398
398
399
- fn expand_cxx_type_assert_pinned ( ety : & ExternType ) -> TokenStream {
399
+ fn expand_cxx_type_assert_pinned ( ety : & ExternType , types : & Types ) -> TokenStream {
400
400
let ident = & ety. name . rust ;
401
401
let infer = Token ! [ _] ( ident. span ( ) ) ;
402
402
403
+ let resolve = types. resolve ( ident) ;
404
+ let lifetimes = resolve. generics . to_underscore_lifetimes ( ) ;
405
+
403
406
quote ! {
404
407
let _: fn ( ) = {
405
408
// Derived from https://github.com/nvzqz/static-assertions-rs.
@@ -424,7 +427,7 @@ fn expand_cxx_type_assert_pinned(ety: &ExternType) -> TokenStream {
424
427
// `_` can be resolved and this can compile. Fails to compile if
425
428
// user has added a manual Unpin impl for their opaque C++ type as
426
429
// then `__AmbiguousIfImpl<__Invalid>` also exists.
427
- <#ident as __AmbiguousIfImpl<#infer>>:: infer
430
+ <#ident #lifetimes as __AmbiguousIfImpl<#infer>>:: infer
428
431
} ;
429
432
}
430
433
}
@@ -833,21 +836,25 @@ fn expand_rust_type_impl(ety: &ExternType) -> TokenStream {
833
836
impls
834
837
}
835
838
836
- fn expand_rust_type_assert_unpin ( ety : & ExternType ) -> TokenStream {
839
+ fn expand_rust_type_assert_unpin ( ety : & ExternType , types : & Types ) -> TokenStream {
837
840
let ident = & ety. name . rust ;
838
841
let begin_span = Token ! [ :: ] ( ety. type_token . span ) ;
839
842
let unpin = quote_spanned ! { ety. semi_token. span=>
840
843
#begin_span cxx:: core:: marker:: Unpin
841
844
} ;
845
+
846
+ let resolve = types. resolve ( ident) ;
847
+ let lifetimes = resolve. generics . to_underscore_lifetimes ( ) ;
848
+
842
849
quote_spanned ! { ident. span( ) =>
843
850
let _ = {
844
851
fn __AssertUnpin<T : ?:: cxx:: core:: marker:: Sized + #unpin>( ) { }
845
- __AssertUnpin:: <#ident>
852
+ __AssertUnpin:: <#ident #lifetimes >
846
853
} ;
847
854
}
848
855
}
849
856
850
- fn expand_rust_type_layout ( ety : & ExternType ) -> TokenStream {
857
+ fn expand_rust_type_layout ( ety : & ExternType , types : & Types ) -> TokenStream {
851
858
// Rustc will render as follows if not sized:
852
859
//
853
860
// type TheirType;
@@ -868,6 +875,9 @@ fn expand_rust_type_layout(ety: &ExternType) -> TokenStream {
868
875
let local_sizeof = format_ident ! ( "__sizeof_{}" , ety. name. rust) ;
869
876
let local_alignof = format_ident ! ( "__alignof_{}" , ety. name. rust) ;
870
877
878
+ let resolve = types. resolve ( ident) ;
879
+ let lifetimes = resolve. generics . to_underscore_lifetimes ( ) ;
880
+
871
881
quote_spanned ! { ident. span( ) =>
872
882
{
873
883
#[ doc( hidden) ]
@@ -877,12 +887,12 @@ fn expand_rust_type_layout(ety: &ExternType) -> TokenStream {
877
887
#[ doc( hidden) ]
878
888
#[ export_name = #link_sizeof]
879
889
extern "C" fn #local_sizeof( ) -> usize {
880
- __AssertSized:: <#ident>( ) . size( )
890
+ __AssertSized:: <#ident #lifetimes >( ) . size( )
881
891
}
882
892
#[ doc( hidden) ]
883
893
#[ export_name = #link_alignof]
884
894
extern "C" fn #local_alignof( ) -> usize {
885
- __AssertSized:: <#ident>( ) . align( )
895
+ __AssertSized:: <#ident #lifetimes >( ) . align( )
886
896
}
887
897
}
888
898
}
0 commit comments