From 86e83bcf91beb2b4db759d7f8e0a76f515f06e10 Mon Sep 17 00:00:00 2001 From: Jeff Bezanson Date: Tue, 7 May 2019 15:48:28 -0400 Subject: [PATCH] fix #31899, type intersection involving Int in upper bound --- src/subtype.c | 7 ++++++- test/subtype.jl | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/subtype.c b/src/subtype.c index c257bcae89393..84868a302022a 100644 --- a/src/subtype.c +++ b/src/subtype.c @@ -980,6 +980,8 @@ static int subtype(jl_value_t *x, jl_value_t *y, jl_stenv_t *e, int param) return var_gt((jl_tvar_t*)y, x, e, param); if (y == (jl_value_t*)jl_any_type && !jl_has_free_typevars(x)) return 1; + if (x == jl_bottom_type && !jl_has_free_typevars(y)) + return 1; jl_value_t *ux = jl_unwrap_unionall(x); jl_value_t *uy = jl_unwrap_unionall(y); if ((x != ux || y != uy) && y != (jl_value_t*)jl_any_type && jl_is_datatype(ux) && jl_is_datatype(uy) && @@ -1779,7 +1781,10 @@ static jl_value_t *finish_unionall(jl_value_t *res JL_MAYBE_UNROOTED, jl_varbind jl_tvar_t *newvar = vb->var; JL_GC_PUSH2(&res, &newvar); // try to reduce var to a single value - if (obviously_egal(vb->lb, vb->ub)) { + if (jl_is_long(vb->ub) && jl_is_typevar(vb->lb)) { + varval = vb->ub; + } + else if (obviously_egal(vb->lb, vb->ub)) { // given x<:T<:x, substitute x for T varval = vb->ub; } diff --git a/test/subtype.jl b/test/subtype.jl index d766c49079e1e..acd253fa035f0 100644 --- a/test/subtype.jl +++ b/test/subtype.jl @@ -1509,3 +1509,23 @@ end # issue #26083 @testintersect(Base.RefValue{<:Tuple}, Ref{Tuple{M}} where M, Base.RefValue{Tuple{M}} where M) + +# issue #31899 +struct SA{N,L} +end +@testintersect(Tuple{Type{SA{Int, L} where L}, Type{SA{Int, Int8}}}, + Tuple{Type{<:SA{N, L}}, Type{<:SA{N, L}}} where {N,L}, + Union{}) +@testintersect(Tuple{Type{SA{2, L} where L}, Type{SA{2, 16}}}, + Tuple{Type{<:SA{N, L}}, Type{<:SA{N, L}}} where {L,N}, + Union{}) +@testintersect(Tuple{Type{SA{2, L} where L}, Type{SA{2, 16}}}, + Tuple{Type{<:SA{N, L}}, Type{<:SA{N, L}}} where {N,L}, + Union{}) +@testintersect(Tuple{Type{SA{2, L}}, Type{SA{2, L}}} where L, + Tuple{Type{<:SA{N, L}}, Type{<:SA{N, L}}} where {N,L}, + Tuple{Type{SA{2, L}}, Type{SA{2, L}}} where L) +@testintersect(Tuple{Type{SA{2, L}}, Type{SA{2, 16}}} where L, + Tuple{Type{<:SA{N, L}}, Type{<:SA{N, L}}} where {N,L}, + # TODO: this could be narrower + Tuple{Type{SA{2, L}}, Type{SA{2, 16}}} where L)