@@ -2520,7 +2520,7 @@ static int type_morespecific_(jl_value_t *a, jl_value_t *b, int invariant, jl_ty
2520
2520
}
2521
2521
}
2522
2522
assert (jl_nparams (tta ) == jl_nparams (ttb ));
2523
- int ascore = 0 , bscore = 0 , ascore1 = 0 , bscore1 = 0 ;
2523
+ int ascore = 0 , bscore = 0 , ascore1 = 0 , bscore1 = 0 , adiag = 0 , bdiag = 0 ;
2524
2524
for (size_t i = 0 ; i < jl_nparams (tta ); i ++ ) {
2525
2525
jl_value_t * apara = jl_tparam (tta ,i );
2526
2526
jl_value_t * bpara = jl_tparam (ttb ,i );
@@ -2529,15 +2529,29 @@ static int type_morespecific_(jl_value_t *a, jl_value_t *b, int invariant, jl_ty
2529
2529
else if (type_morespecific_ (bpara , apara , 1 , env ))
2530
2530
bscore += 1 ;
2531
2531
if (jl_is_typevar (bpara ) && !jl_is_typevar (apara ) && !jl_is_type (apara ))
2532
- ascore1 + = 1 ;
2532
+ ascore1 = 1 ;
2533
2533
else if (jl_is_typevar (apara ) && !jl_is_typevar (bpara ) && !jl_is_type (bpara ))
2534
- bscore1 += 1 ;
2534
+ bscore1 = 1 ;
2535
+ if (!adiag && jl_is_typevar (apara )) {
2536
+ for (int j = i + 1 ; j < jl_nparams (tta ); j ++ ) {
2537
+ if (jl_has_typevar (jl_tparam (tta ,j ), (jl_tvar_t * )apara )) {
2538
+ adiag = 1 ; break ;
2539
+ }
2540
+ }
2541
+ }
2542
+ if (!bdiag && jl_is_typevar (bpara )) {
2543
+ for (int j = i + 1 ; j < jl_nparams (ttb ); j ++ ) {
2544
+ if (jl_has_typevar (jl_tparam (ttb ,j ), (jl_tvar_t * )bpara )) {
2545
+ bdiag = 1 ; break ;
2546
+ }
2547
+ }
2548
+ }
2535
2549
}
2536
- if (bscore1 == 0 && ascore1 > 0 )
2550
+ if (ascore1 > bscore1 )
2537
2551
return 1 ;
2538
- if (ascore1 == 0 && bscore1 > 0 )
2552
+ if (bscore1 > ascore1 || bscore > ascore || bdiag > adiag )
2539
2553
return 0 ;
2540
- return ascore > bscore ;
2554
+ return ascore > bscore || adiag > bdiag ;
2541
2555
}
2542
2556
else if (invariant ) {
2543
2557
return 0 ;
0 commit comments