Skip to content

Commit e31a8a0

Browse files
committed
WIP: unpack TypeVars before subtyping with Union (fixes #11803, fixes #11015)
1 parent 462ac33 commit e31a8a0

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

src/jltypes.c

+18-17
Original file line numberDiff line numberDiff line change
@@ -2358,6 +2358,24 @@ static int jl_subtype_le(jl_value_t *a, jl_value_t *b, int ta, int invariant)
23582358
return 1;
23592359
}
23602360

2361+
if (jl_is_typevar(a)) {
2362+
if (jl_is_typevar(b)) {
2363+
return
2364+
jl_subtype_le((jl_value_t*)((jl_tvar_t*)a)->ub,
2365+
(jl_value_t*)((jl_tvar_t*)b)->ub, 0, 0) &&
2366+
jl_subtype_le((jl_value_t*)((jl_tvar_t*)b)->lb,
2367+
(jl_value_t*)((jl_tvar_t*)a)->lb, 0, 0);
2368+
}
2369+
if (invariant) {
2370+
return 0;
2371+
}
2372+
return jl_subtype_le((jl_value_t*)((jl_tvar_t*)a)->ub, b, 0, 0);
2373+
}
2374+
if (jl_is_typevar(b)) {
2375+
return jl_subtype_le(a, (jl_value_t*)((jl_tvar_t*)b)->ub, 0, 0) &&
2376+
jl_subtype_le((jl_value_t*)((jl_tvar_t*)b)->lb, a, 0, 0);
2377+
}
2378+
23612379
size_t i;
23622380
if (!ta && jl_is_uniontype(a)) {
23632381
jl_svec_t *ap = ((jl_uniontype_t*)a)->types;
@@ -2477,23 +2495,6 @@ static int jl_subtype_le(jl_value_t *a, jl_value_t *b, int ta, int invariant)
24772495
return 0;
24782496
}
24792497

2480-
if (jl_is_typevar(a)) {
2481-
if (jl_is_typevar(b)) {
2482-
return
2483-
jl_subtype_le((jl_value_t*)((jl_tvar_t*)a)->ub,
2484-
(jl_value_t*)((jl_tvar_t*)b)->ub, 0, 0) &&
2485-
jl_subtype_le((jl_value_t*)((jl_tvar_t*)b)->lb,
2486-
(jl_value_t*)((jl_tvar_t*)a)->lb, 0, 0);
2487-
}
2488-
if (invariant) {
2489-
return 0;
2490-
}
2491-
return jl_subtype_le((jl_value_t*)((jl_tvar_t*)a)->ub, b, 0, 0);
2492-
}
2493-
if (jl_is_typevar(b)) {
2494-
return jl_subtype_le(a, (jl_value_t*)((jl_tvar_t*)b)->ub, 0, 0) &&
2495-
jl_subtype_le((jl_value_t*)((jl_tvar_t*)b)->lb, a, 0, 0);
2496-
}
24972498
if ((jl_datatype_t*)a == jl_any_type) return 0;
24982499

24992500
return jl_egal(a, b);

test/core.jl

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ isnot(x,y) = !is(x,y)
3030
@test !(Type{Bottom} <: Type{Int32})
3131
@test !(Vector{Float64} <: Vector{Union{Float64,Float32}})
3232
testintersect(Vector{Float64}, Vector{Union{Float64,Float32}}, Bottom)
33+
@test TypeVar(:T,Int,true) <: Int
34+
@test TypeVar(:T,Union(Int,Float64),true) <: Union(Int,Float64)
3335

3436
@test !isa(Array,Type{Any})
3537
@test Type{Complex} <: DataType

0 commit comments

Comments
 (0)