@@ -274,8 +274,8 @@ impl<'a, 'ctx> Ctx<'a> {
274274 ) ) ;
275275 }
276276 let trait_handle = builder. alloc ( "tmp_traitv" , & trait_pltype. borrow ( ) , self , None ) ;
277- for ( name , f ) in & t . fields {
278- let mthd = st. find_method ( self , name) . unwrap ( ) ;
277+ for f in t . list_trait_fields ( ) . iter ( ) {
278+ let mthd = st. find_method ( self , & f . name ) . unwrap ( ) ;
279279 let fnhandle = builder. get_or_insert_fn_handle ( & mthd, self ) ;
280280 let targetftp = f. typenode . get_type ( self , builder) . unwrap ( ) ;
281281 let casted = builder. bitcast ( self , fnhandle, & targetftp. borrow ( ) , "fncast_tmp" ) ;
@@ -1012,9 +1012,12 @@ impl<'a, 'ctx> Ctx<'a> {
10121012 need_up_cast : false ,
10131013 } ;
10141014 }
1015- } else if !self
1016- . eq ( lg. trait_impl . as_ref ( ) . unwrap ( ) . clone ( ) , r. clone ( ) )
1017- . eq
1015+ } else if lg
1016+ . trait_impl
1017+ . as_ref ( )
1018+ . unwrap ( )
1019+ . iter ( )
1020+ . any ( |lt| !self . eq ( lt. clone ( ) , r. clone ( ) ) . eq )
10181021 {
10191022 return EqRes {
10201023 eq : false ,
@@ -1031,6 +1034,12 @@ impl<'a, 'ctx> Ctx<'a> {
10311034 unreachable ! ( )
10321035 }
10331036 if l != r {
1037+ if matches ! ( & * l. borrow( ) , PLType :: Union ( _) ) {
1038+ return EqRes {
1039+ eq : true ,
1040+ need_up_cast : true ,
1041+ } ;
1042+ }
10341043 let trait_pltype = l;
10351044 let st_pltype = self . auto_deref_tp ( r) ;
10361045 if let ( PLType :: Trait ( t) , PLType :: Struct ( st) ) =
@@ -1040,11 +1049,6 @@ impl<'a, 'ctx> Ctx<'a> {
10401049 eq : st. implements_trait ( t, & self . plmod ) ,
10411050 need_up_cast : true ,
10421051 } ;
1043- } else if let PLType :: Union ( _) = & * trait_pltype. borrow ( ) {
1044- return EqRes {
1045- eq : true ,
1046- need_up_cast : true ,
1047- } ;
10481052 }
10491053 return EqRes {
10501054 eq : false ,
0 commit comments