@@ -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) => {
@@ -186,6 +186,7 @@ fn expand_struct(strct: &Struct) -> TokenStream {
186
186
187
187
fn expand_struct_operators ( strct : & Struct ) -> TokenStream {
188
188
let ident = & strct. name . rust ;
189
+ let generics = & strct. generics ;
189
190
let mut operators = TokenStream :: new ( ) ;
190
191
191
192
for derive in & strct. derives {
@@ -198,7 +199,7 @@ fn expand_struct_operators(strct: &Struct) -> TokenStream {
198
199
operators. extend ( quote_spanned ! { span=>
199
200
#[ doc( hidden) ]
200
201
#[ export_name = #link_name]
201
- extern "C" fn #local_name( lhs: & #ident, rhs: & #ident) -> bool {
202
+ extern "C" fn #local_name #generics ( lhs: & #ident #generics , rhs: & #ident #generics ) -> bool {
202
203
let __fn = concat!( "<" , module_path!( ) , #prevent_unwind_label) ;
203
204
:: cxx:: private:: prevent_unwind( __fn, || * lhs == * rhs)
204
205
}
@@ -211,7 +212,7 @@ fn expand_struct_operators(strct: &Struct) -> TokenStream {
211
212
operators. extend ( quote_spanned ! { span=>
212
213
#[ doc( hidden) ]
213
214
#[ export_name = #link_name]
214
- extern "C" fn #local_name( lhs: & #ident, rhs: & #ident) -> bool {
215
+ extern "C" fn #local_name #generics ( lhs: & #ident #generics , rhs: & #ident #generics ) -> bool {
215
216
let __fn = concat!( "<" , module_path!( ) , #prevent_unwind_label) ;
216
217
:: cxx:: private:: prevent_unwind( __fn, || * lhs != * rhs)
217
218
}
@@ -225,7 +226,7 @@ fn expand_struct_operators(strct: &Struct) -> TokenStream {
225
226
operators. extend ( quote_spanned ! { span=>
226
227
#[ doc( hidden) ]
227
228
#[ export_name = #link_name]
228
- extern "C" fn #local_name( lhs: & #ident, rhs: & #ident) -> bool {
229
+ extern "C" fn #local_name #generics ( lhs: & #ident #generics , rhs: & #ident #generics ) -> bool {
229
230
let __fn = concat!( "<" , module_path!( ) , #prevent_unwind_label) ;
230
231
:: cxx:: private:: prevent_unwind( __fn, || * lhs < * rhs)
231
232
}
@@ -237,7 +238,7 @@ fn expand_struct_operators(strct: &Struct) -> TokenStream {
237
238
operators. extend ( quote_spanned ! { span=>
238
239
#[ doc( hidden) ]
239
240
#[ export_name = #link_name]
240
- extern "C" fn #local_name( lhs: & #ident, rhs: & #ident) -> bool {
241
+ extern "C" fn #local_name #generics ( lhs: & #ident #generics , rhs: & #ident #generics ) -> bool {
241
242
let __fn = concat!( "<" , module_path!( ) , #prevent_unwind_label) ;
242
243
:: cxx:: private:: prevent_unwind( __fn, || * lhs <= * rhs)
243
244
}
@@ -250,7 +251,7 @@ fn expand_struct_operators(strct: &Struct) -> TokenStream {
250
251
operators. extend ( quote_spanned ! { span=>
251
252
#[ doc( hidden) ]
252
253
#[ export_name = #link_name]
253
- extern "C" fn #local_name( lhs: & #ident, rhs: & #ident) -> bool {
254
+ extern "C" fn #local_name #generics ( lhs: & #ident #generics , rhs: & #ident #generics ) -> bool {
254
255
let __fn = concat!( "<" , module_path!( ) , #prevent_unwind_label) ;
255
256
:: cxx:: private:: prevent_unwind( __fn, || * lhs > * rhs)
256
257
}
@@ -262,7 +263,7 @@ fn expand_struct_operators(strct: &Struct) -> TokenStream {
262
263
operators. extend ( quote_spanned ! { span=>
263
264
#[ doc( hidden) ]
264
265
#[ export_name = #link_name]
265
- extern "C" fn #local_name( lhs: & #ident, rhs: & #ident) -> bool {
266
+ extern "C" fn #local_name #generics ( lhs: & #ident #generics , rhs: & #ident #generics ) -> bool {
266
267
let __fn = concat!( "<" , module_path!( ) , #prevent_unwind_label) ;
267
268
:: cxx:: private:: prevent_unwind( __fn, || * lhs >= * rhs)
268
269
}
@@ -277,7 +278,7 @@ fn expand_struct_operators(strct: &Struct) -> TokenStream {
277
278
#[ doc( hidden) ]
278
279
#[ export_name = #link_name]
279
280
#[ allow( clippy:: cast_possible_truncation) ]
280
- extern "C" fn #local_name( this: & #ident) -> usize {
281
+ extern "C" fn #local_name #generics ( this: & #ident #generics ) -> usize {
281
282
let __fn = concat!( "<" , module_path!( ) , #prevent_unwind_label) ;
282
283
:: cxx:: private:: prevent_unwind( __fn, || :: cxx:: private:: hash( this) )
283
284
}
@@ -396,10 +397,13 @@ fn expand_cxx_type(ety: &ExternType) -> TokenStream {
396
397
}
397
398
}
398
399
399
- fn expand_cxx_type_assert_pinned ( ety : & ExternType ) -> TokenStream {
400
+ fn expand_cxx_type_assert_pinned ( ety : & ExternType , types : & Types ) -> TokenStream {
400
401
let ident = & ety. name . rust ;
401
402
let infer = Token ! [ _] ( ident. span ( ) ) ;
402
403
404
+ let resolve = types. resolve ( ident) ;
405
+ let lifetimes = resolve. generics . to_underscore_lifetimes ( ) ;
406
+
403
407
quote ! {
404
408
let _: fn ( ) = {
405
409
// Derived from https://github.com/nvzqz/static-assertions-rs.
@@ -424,7 +428,7 @@ fn expand_cxx_type_assert_pinned(ety: &ExternType) -> TokenStream {
424
428
// `_` can be resolved and this can compile. Fails to compile if
425
429
// user has added a manual Unpin impl for their opaque C++ type as
426
430
// then `__AmbiguousIfImpl<__Invalid>` also exists.
427
- <#ident as __AmbiguousIfImpl<#infer>>:: infer
431
+ <#ident #lifetimes as __AmbiguousIfImpl<#infer>>:: infer
428
432
} ;
429
433
}
430
434
}
@@ -833,21 +837,25 @@ fn expand_rust_type_impl(ety: &ExternType) -> TokenStream {
833
837
impls
834
838
}
835
839
836
- fn expand_rust_type_assert_unpin ( ety : & ExternType ) -> TokenStream {
840
+ fn expand_rust_type_assert_unpin ( ety : & ExternType , types : & Types ) -> TokenStream {
837
841
let ident = & ety. name . rust ;
838
842
let begin_span = Token ! [ :: ] ( ety. type_token . span ) ;
839
843
let unpin = quote_spanned ! { ety. semi_token. span=>
840
844
#begin_span cxx:: core:: marker:: Unpin
841
845
} ;
846
+
847
+ let resolve = types. resolve ( ident) ;
848
+ let lifetimes = resolve. generics . to_underscore_lifetimes ( ) ;
849
+
842
850
quote_spanned ! { ident. span( ) =>
843
851
let _ = {
844
852
fn __AssertUnpin<T : ?:: cxx:: core:: marker:: Sized + #unpin>( ) { }
845
- __AssertUnpin:: <#ident>
853
+ __AssertUnpin:: <#ident #lifetimes >
846
854
} ;
847
855
}
848
856
}
849
857
850
- fn expand_rust_type_layout ( ety : & ExternType ) -> TokenStream {
858
+ fn expand_rust_type_layout ( ety : & ExternType , types : & Types ) -> TokenStream {
851
859
// Rustc will render as follows if not sized:
852
860
//
853
861
// type TheirType;
@@ -868,6 +876,9 @@ fn expand_rust_type_layout(ety: &ExternType) -> TokenStream {
868
876
let local_sizeof = format_ident ! ( "__sizeof_{}" , ety. name. rust) ;
869
877
let local_alignof = format_ident ! ( "__alignof_{}" , ety. name. rust) ;
870
878
879
+ let resolve = types. resolve ( ident) ;
880
+ let lifetimes = resolve. generics . to_underscore_lifetimes ( ) ;
881
+
871
882
quote_spanned ! { ident. span( ) =>
872
883
{
873
884
#[ doc( hidden) ]
@@ -877,12 +888,12 @@ fn expand_rust_type_layout(ety: &ExternType) -> TokenStream {
877
888
#[ doc( hidden) ]
878
889
#[ export_name = #link_sizeof]
879
890
extern "C" fn #local_sizeof( ) -> usize {
880
- __AssertSized:: <#ident>( ) . size( )
891
+ __AssertSized:: <#ident #lifetimes >( ) . size( )
881
892
}
882
893
#[ doc( hidden) ]
883
894
#[ export_name = #link_alignof]
884
895
extern "C" fn #local_alignof( ) -> usize {
885
- __AssertSized:: <#ident>( ) . align( )
896
+ __AssertSized:: <#ident #lifetimes >( ) . align( )
886
897
}
887
898
}
888
899
}
@@ -1393,7 +1404,7 @@ fn expand_unique_ptr(
1393
1404
quote_spanned ! { end_span=>
1394
1405
#unsafe_token impl #impl_generics :: cxx:: private:: UniquePtrTarget for #ident #ty_generics {
1395
1406
#[ doc( hidden) ]
1396
- fn __typename( f: & mut :: cxx:: core:: fmt:: Formatter ) -> :: cxx:: core:: fmt:: Result {
1407
+ fn __typename( f: & mut :: cxx:: core:: fmt:: Formatter < ' _> ) -> :: cxx:: core:: fmt:: Result {
1397
1408
f. write_str( #name)
1398
1409
}
1399
1410
#[ doc( hidden) ]
@@ -1485,7 +1496,7 @@ fn expand_shared_ptr(
1485
1496
quote_spanned ! { end_span=>
1486
1497
#unsafe_token impl #impl_generics :: cxx:: private:: SharedPtrTarget for #ident #ty_generics {
1487
1498
#[ doc( hidden) ]
1488
- fn __typename( f: & mut :: cxx:: core:: fmt:: Formatter ) -> :: cxx:: core:: fmt:: Result {
1499
+ fn __typename( f: & mut :: cxx:: core:: fmt:: Formatter < ' _> ) -> :: cxx:: core:: fmt:: Result {
1489
1500
f. write_str( #name)
1490
1501
}
1491
1502
#[ doc( hidden) ]
@@ -1545,7 +1556,7 @@ fn expand_weak_ptr(key: NamedImplKey, types: &Types, explicit_impl: Option<&Impl
1545
1556
quote_spanned ! { end_span=>
1546
1557
#unsafe_token impl #impl_generics :: cxx:: private:: WeakPtrTarget for #ident #ty_generics {
1547
1558
#[ doc( hidden) ]
1548
- fn __typename( f: & mut :: cxx:: core:: fmt:: Formatter ) -> :: cxx:: core:: fmt:: Result {
1559
+ fn __typename( f: & mut :: cxx:: core:: fmt:: Formatter < ' _> ) -> :: cxx:: core:: fmt:: Result {
1549
1560
f. write_str( #name)
1550
1561
}
1551
1562
#[ doc( hidden) ]
@@ -1660,7 +1671,7 @@ fn expand_cxx_vector(
1660
1671
quote_spanned ! { end_span=>
1661
1672
#unsafe_token impl #impl_generics :: cxx:: private:: VectorElement for #elem #ty_generics {
1662
1673
#[ doc( hidden) ]
1663
- fn __typename( f: & mut :: cxx:: core:: fmt:: Formatter ) -> :: cxx:: core:: fmt:: Result {
1674
+ fn __typename( f: & mut :: cxx:: core:: fmt:: Formatter < ' _> ) -> :: cxx:: core:: fmt:: Result {
1664
1675
f. write_str( #name)
1665
1676
}
1666
1677
#[ doc( hidden) ]
0 commit comments