Skip to content

Commit 1001087

Browse files
authored
fix #31496, type intersection bug in restoring environment (#31669)
1 parent b08f120 commit 1001087

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

src/subtype.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2445,11 +2445,22 @@ static jl_value_t *intersect_all(jl_value_t *x, jl_value_t *y, jl_stenv_t *e)
24452445
e->Runions.more = 0;
24462446
memset(e->Runions.stack, 0, sizeof(e->Runions.stack));
24472447
jl_value_t **is;
2448-
JL_GC_PUSHARGS(is, 2);
2448+
JL_GC_PUSHARGS(is, 3);
2449+
jl_value_t **saved = &is[2];
2450+
jl_savedenv_t se;
2451+
save_env(e, saved, &se);
24492452
int lastset = 0, niter = 0, total_iter = 0;
24502453
jl_value_t *ii = intersect(x, y, e, 0);
2454+
if (ii == jl_bottom_type) {
2455+
restore_env(e, *saved, &se);
2456+
}
2457+
else {
2458+
free(se.buf);
2459+
save_env(e, saved, &se);
2460+
}
24512461
while (e->Runions.more) {
24522462
if (e->emptiness_only && ii != jl_bottom_type) {
2463+
free(se.buf);
24532464
JL_GC_POP();
24542465
return ii;
24552466
}
@@ -2463,6 +2474,13 @@ static jl_value_t *intersect_all(jl_value_t *x, jl_value_t *y, jl_stenv_t *e)
24632474

24642475
is[0] = ii;
24652476
is[1] = intersect(x, y, e, 0);
2477+
if (is[1] == jl_bottom_type) {
2478+
restore_env(e, *saved, &se);
2479+
}
2480+
else {
2481+
free(se.buf);
2482+
save_env(e, saved, &se);
2483+
}
24662484
if (is[0] == jl_bottom_type)
24672485
ii = is[1];
24682486
else if (is[1] == jl_bottom_type)
@@ -2474,10 +2492,12 @@ static jl_value_t *intersect_all(jl_value_t *x, jl_value_t *y, jl_stenv_t *e)
24742492
}
24752493
total_iter++;
24762494
if (niter > 3 || total_iter > 400000) {
2495+
free(se.buf);
24772496
JL_GC_POP();
24782497
return y;
24792498
}
24802499
}
2500+
free(se.buf);
24812501
JL_GC_POP();
24822502
return ii;
24832503
}

test/subtype.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,3 +1464,10 @@ end
14641464
@testintersect(Tuple{Type{Val{T}},Integer,T} where T>:Integer,
14651465
Tuple{Type,Int,Int},
14661466
Tuple{Type{Val{T}},Int,Int} where T>:Integer)
1467+
1468+
# issue #31496
1469+
CovType{T} = Union{AbstractArray{T,2},
1470+
Vector{UpperTriangular{T,Matrix{T}}}}
1471+
@testintersect(Pair{<:Any, <:AbstractMatrix},
1472+
Pair{T, <:CovType{T}} where T<:AbstractFloat,
1473+
Pair{T,S} where S<:AbstractArray{T,2} where T<:AbstractFloat)

0 commit comments

Comments
 (0)