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