From 4e9cd492e6f31a3bfe85e77e7590e3090bc9361c Mon Sep 17 00:00:00 2001 From: Jeff Bezanson Date: Fri, 16 Nov 2018 16:17:30 +0900 Subject: [PATCH] fix #29955, intersection bugs involving triangular constraints (#29986) --- src/jltypes.c | 3 ++- src/subtype.c | 5 ++++- test/subtype.jl | 22 ++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/jltypes.c b/src/jltypes.c index 2748cb4467dd9..b59ba3d3329ce 100644 --- a/src/jltypes.c +++ b/src/jltypes.c @@ -824,7 +824,8 @@ static int within_typevar(jl_value_t *t, jl_value_t *vlb, jl_value_t *vub) else if (!jl_is_type(t)) { return vlb == jl_bottom_type && vub == (jl_value_t*)jl_any_type; } - return jl_subtype(vlb, lb) && jl_subtype(ub, vub); + return ((jl_has_free_typevars(vlb) || jl_subtype(vlb, lb)) && + (jl_has_free_typevars(vub) || jl_subtype(ub, vub))); } typedef struct _jl_typestack_t jl_typestack_t; diff --git a/src/subtype.c b/src/subtype.c index b6e2483cb57c6..2dd5cf1ecf0b3 100644 --- a/src/subtype.c +++ b/src/subtype.c @@ -2008,7 +2008,10 @@ static jl_value_t *intersect(jl_value_t *x, jl_value_t *y, jl_stenv_t *e, int pa return xlb; return jl_bottom_type; } - if (!(subtype_in_env(xlb, yub, e) && subtype_in_env(ylb, xub, e))) + if (R) flip_vars(e); + int ccheck = subtype_in_env(xlb, yub, e) && subtype_in_env(ylb, xub, e); + if (R) flip_vars(e); + if (!ccheck) return jl_bottom_type; jl_value_t *ub=NULL, *lb=NULL; JL_GC_PUSH2(&lb, &ub); diff --git a/test/subtype.jl b/test/subtype.jl index 913d9458695be..c6b0d16904e88 100644 --- a/test/subtype.jl +++ b/test/subtype.jl @@ -1357,3 +1357,25 @@ end @testintersect(Tuple{Vararg{Val{N}, N}} where N, Tuple{Val{2}, Vararg{Val{3}}}, Union{}) + +# issue #29955 +struct M29955{T, TV<:AbstractVector{T}} +end +@testintersect(M29955, + M29955{<:Any,TV} where TV>:Vector{Float64}, + M29955{Float64,TV} where Array{Float64,1}<:TV<:AbstractArray{Float64,1}) + +struct A29955{T, TV<:AbstractVector{T}, TModel<:M29955{T,TV}} +end +@testintersect(Tuple{Type{A29955{Float64,Array{Float64,1},_1}} where _1, + Any}, + Tuple{Type{A29955{T,TV,TM}}, + TM} where {T,TV<:AbstractVector{T},TM<:M29955{T,TV}}, + Tuple{Type{A29955{Float64,Array{Float64,1},TM}}, + TM} where TM<:M29955{Float64,Array{Float64,1}}) +let M = M29955{T,Vector{Float64}} where T + @test M == (M29955{T,Vector{Float64}} where T) + @test M{Float64} == M29955{Float64,Vector{Float64}} + @test_throws TypeError M{Float32} + @test_throws TypeError M{Real} +end