Skip to content

Commit 91b25aa

Browse files
committed
fix specificity A{B,B,C} < A{B,C,D}
1 parent ed270c4 commit 91b25aa

File tree

1 file changed

+20
-6
lines changed

1 file changed

+20
-6
lines changed

src/subtype.c

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2513,7 +2513,7 @@ static int type_morespecific_(jl_value_t *a, jl_value_t *b, int invariant, jl_ty
25132513
}
25142514
}
25152515
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;
25172517
for(size_t i=0; i < jl_nparams(tta); i++) {
25182518
jl_value_t *apara = jl_tparam(tta,i);
25192519
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
25222522
else if (type_morespecific_(bpara, apara, 1, env))
25232523
bscore += 1;
25242524
if (jl_is_typevar(bpara) && !jl_is_typevar(apara) && !jl_is_type(apara))
2525-
ascore1 += 1;
2525+
ascore1 = 1;
25262526
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+
}
25282542
}
2529-
if (bscore1 == 0 && ascore1 > 0)
2543+
if (ascore1 > bscore1)
25302544
return 1;
2531-
if (ascore1 == 0 && bscore1 > 0)
2545+
if (bscore1 > ascore1 || bscore > ascore || bdiag > adiag)
25322546
return 0;
2533-
return ascore > bscore;
2547+
return ascore > bscore || adiag > bdiag;
25342548
}
25352549
else if (invariant) {
25362550
return 0;

0 commit comments

Comments
 (0)