Skip to content

Commit 050cbc7

Browse files
committed
fix specificity A{B,B,C} < A{B,C,D}
1 parent b50f8a6 commit 050cbc7

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
@@ -2520,7 +2520,7 @@ static int type_morespecific_(jl_value_t *a, jl_value_t *b, int invariant, jl_ty
25202520
}
25212521
}
25222522
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;
25242524
for(size_t i=0; i < jl_nparams(tta); i++) {
25252525
jl_value_t *apara = jl_tparam(tta,i);
25262526
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
25292529
else if (type_morespecific_(bpara, apara, 1, env))
25302530
bscore += 1;
25312531
if (jl_is_typevar(bpara) && !jl_is_typevar(apara) && !jl_is_type(apara))
2532-
ascore1 += 1;
2532+
ascore1 = 1;
25332533
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+
}
25352549
}
2536-
if (bscore1 == 0 && ascore1 > 0)
2550+
if (ascore1 > bscore1)
25372551
return 1;
2538-
if (ascore1 == 0 && bscore1 > 0)
2552+
if (bscore1 > ascore1 || bscore > ascore || bdiag > adiag)
25392553
return 0;
2540-
return ascore > bscore;
2554+
return ascore > bscore || adiag > bdiag;
25412555
}
25422556
else if (invariant) {
25432557
return 0;

0 commit comments

Comments
 (0)