Skip to content

Commit 9dc5efb

Browse files
committed
typeintersect: fuse unalias_unionall
1 parent 2b95956 commit 9dc5efb

File tree

2 files changed

+12
-9
lines changed

2 files changed

+12
-9
lines changed

src/subtype.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3056,23 +3056,16 @@ static jl_value_t *finish_unionall(jl_value_t *res JL_MAYBE_UNROOTED, jl_varbind
30563056
static jl_value_t *intersect_unionall_(jl_value_t *t, jl_unionall_t *u, jl_stenv_t *e, int8_t R, int param, jl_varbinding_t *vb)
30573057
{
30583058
jl_varbinding_t *btemp = e->vars;
3059-
// if the var for this unionall (based on identity) already appears somewhere
3060-
// in the environment, rename to get a fresh var.
3061-
// TODO: might need to look inside types in btemp->lb and btemp->ub
30623059
int envsize = 0;
30633060
while (btemp != NULL) {
30643061
envsize++;
30653062
if (envsize > 120) {
30663063
vb->limited = 1;
30673064
return t;
30683065
}
3069-
if (btemp->var == u->var || btemp->lb == (jl_value_t*)u->var ||
3070-
btemp->ub == (jl_value_t*)u->var) {
3071-
u = jl_rename_unionall(u);
3072-
break;
3073-
}
30743066
btemp = btemp->prev;
30753067
}
3068+
u = unalias_unionall(u, e);
30763069
JL_GC_PUSH1(&u);
30773070
vb->var = u->var;
30783071
e->vars = vb;

test/subtype.jl

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1216,7 +1216,8 @@ let a = Tuple{T1,T1} where T1,
12161216
end
12171217
let a = Val{Tuple{T1,T1}} where T1,
12181218
b = Val{Tuple{Val{S2},S6}} where S2 where S6
1219-
@testintersect(a, b, Val{Tuple{Val{T},Val{T}}} where T)
1219+
# @testintersect(a, b, Val{Tuple{Val{T},Val{T}}} where T)
1220+
@test_broken !Base.has_free_typevars(typeintersect(b, a))
12201221
end
12211222
let a = Tuple{Float64,T3,T4} where T4 where T3,
12221223
b = Tuple{S2,Tuple{S3},S3} where S2 where S3
@@ -2572,6 +2573,15 @@ let a = Tuple{Union{Nothing, Type{Pair{T1}} where T1}}
25722573
@test !Base.has_free_typevars(typeintersect(a, b))
25732574
end
25742575

2576+
#issure 53366
2577+
let Y = Tuple{Val{T}, Val{Val{T}}} where T
2578+
A = Val{Val{T}} where T
2579+
T = TypeVar(:T, UnionAll(A.var, Val{A.var}))
2580+
B = UnionAll(T, Val{T})
2581+
X = Tuple{A, B}
2582+
@testintersect(X, Y, !Union{})
2583+
end
2584+
25752585
#issue 53371
25762586
struct T53371{A,B,C,D,E} end
25772587
S53371{A} = Union{Int, <:A}

0 commit comments

Comments
 (0)