1
1
mod impl_debug;
2
+ mod impl_partialeq;
2
3
mod error;
3
4
mod helpers;
4
5
pub mod struct_layout;
@@ -13,7 +14,7 @@ use ir::comp::{Base, Bitfield, BitfieldUnit, CompInfo, CompKind, Field,
13
14
use ir:: context:: { BindgenContext , ItemId } ;
14
15
use ir:: derive:: { CanDeriveCopy , CanDeriveDebug , CanDeriveDefault ,
15
16
CanDeriveHash , CanDerivePartialOrd , CanDeriveOrd ,
16
- CanDerivePartialEq , CanDeriveEq } ;
17
+ CanDerivePartialEq , CanDeriveEq , CannotDeriveReason } ;
17
18
use ir:: dot;
18
19
use ir:: enum_ty:: { Enum , EnumVariant , EnumVariantValue } ;
19
20
use ir:: function:: { Abi , Function , FunctionSig } ;
@@ -1419,6 +1420,7 @@ impl CodeGenerator for CompInfo {
1419
1420
let mut needs_clone_impl = false ;
1420
1421
let mut needs_default_impl = false ;
1421
1422
let mut needs_debug_impl = false ;
1423
+ let mut needs_partialeq_impl = false ;
1422
1424
if let Some ( comment) = item. comment ( ctx) {
1423
1425
attributes. push ( attributes:: doc ( comment) ) ;
1424
1426
}
@@ -1474,6 +1476,14 @@ impl CodeGenerator for CompInfo {
1474
1476
1475
1477
if item. can_derive_partialeq ( ctx) {
1476
1478
derives. push ( "PartialEq" ) ;
1479
+ } else {
1480
+ needs_partialeq_impl =
1481
+ ctx. options ( ) . derive_partialeq &&
1482
+ ctx. options ( ) . impl_partialeq &&
1483
+ ctx. lookup_item_id_can_derive_partialeq_or_partialord ( item. id ( ) )
1484
+ . map_or ( true , |x| {
1485
+ x == CannotDeriveReason :: ArrayTooLarge
1486
+ } ) ;
1477
1487
}
1478
1488
1479
1489
if item. can_derive_eq ( ctx) {
@@ -1666,33 +1676,34 @@ impl CodeGenerator for CompInfo {
1666
1676
}
1667
1677
}
1668
1678
1669
- let mut generics = quote ! { } ;
1679
+ let mut generic_param_names = vec ! [ ] ;
1670
1680
1671
1681
if let Some ( ref params) = used_template_params {
1672
- if !params. is_empty ( ) {
1673
- let mut param_names = vec ! [ ] ;
1674
-
1675
- for ( idx, ty) in params. iter ( ) . enumerate ( ) {
1676
- let param = ctx. resolve_type ( * ty) ;
1677
- let name = param. name ( ) . unwrap ( ) ;
1678
- let ident = ctx. rust_ident ( name) ;
1679
- param_names. push ( ident. clone ( ) ) ;
1682
+ for ( idx, ty) in params. iter ( ) . enumerate ( ) {
1683
+ let param = ctx. resolve_type ( * ty) ;
1684
+ let name = param. name ( ) . unwrap ( ) ;
1685
+ let ident = ctx. rust_ident ( name) ;
1686
+ generic_param_names. push ( ident. clone ( ) ) ;
1680
1687
1681
- let prefix = ctx. trait_prefix ( ) ;
1682
- let field_name = ctx. rust_ident ( format ! ( "_phantom_{}" , idx) ) ;
1683
- fields. push ( quote ! {
1684
- pub #field_name : :: #prefix:: marker:: PhantomData <
1685
- :: #prefix:: cell:: UnsafeCell <#ident>
1686
- > ,
1687
- } ) ;
1688
- }
1689
-
1690
- generics = quote ! {
1691
- < #( #param_names ) , * >
1692
- } ;
1688
+ let prefix = ctx. trait_prefix ( ) ;
1689
+ let field_name = ctx. rust_ident ( format ! ( "_phantom_{}" , idx) ) ;
1690
+ fields. push ( quote ! {
1691
+ pub #field_name : :: #prefix:: marker:: PhantomData <
1692
+ :: #prefix:: cell:: UnsafeCell <#ident>
1693
+ > ,
1694
+ } ) ;
1693
1695
}
1694
1696
}
1695
1697
1698
+ let generics = if !generic_param_names. is_empty ( ) {
1699
+ let generic_param_names = generic_param_names. clone ( ) ;
1700
+ quote ! {
1701
+ < #( #generic_param_names ) , * >
1702
+ }
1703
+ } else {
1704
+ quote ! { }
1705
+ } ;
1706
+
1696
1707
tokens. append ( quote ! {
1697
1708
#generics {
1698
1709
#( #fields ) *
@@ -1896,6 +1907,27 @@ impl CodeGenerator for CompInfo {
1896
1907
} ) ;
1897
1908
}
1898
1909
1910
+ if needs_partialeq_impl {
1911
+ if let Some ( impl_) = impl_partialeq:: gen_partialeq_impl ( ctx, self , item, & ty_for_impl) {
1912
+
1913
+ let partialeq_bounds = if !generic_param_names. is_empty ( ) {
1914
+ let bounds = generic_param_names. iter ( ) . map ( |t| {
1915
+ quote ! { #t: PartialEq }
1916
+ } ) ;
1917
+ quote ! { where #( #bounds ) , * }
1918
+ } else {
1919
+ quote ! { }
1920
+ } ;
1921
+
1922
+ let prefix = ctx. trait_prefix ( ) ;
1923
+ result. push ( quote ! {
1924
+ impl #generics :: #prefix:: cmp:: PartialEq for #ty_for_impl #partialeq_bounds {
1925
+ #impl_
1926
+ }
1927
+ } ) ;
1928
+ }
1929
+ }
1930
+
1899
1931
if !methods. is_empty ( ) {
1900
1932
result. push ( quote ! {
1901
1933
impl #generics #ty_for_impl {
0 commit comments