diff --git a/src/jltypes.c b/src/jltypes.c index d0449ecdc6166..e75328809ed0a 100644 --- a/src/jltypes.c +++ b/src/jltypes.c @@ -754,6 +754,20 @@ static jl_value_t *intersect_typevar(jl_tvar_t *a, jl_value_t *b, break; } } + for(i=0; i < eqc->n; i+=2) { + if (eqc->data[i] == b && !jl_is_typevar(eqc->data[i+1])) { + if (jl_types_equal((jl_value_t*)a, eqc->data[i+1])) { + JL_GC_POP(); + return (jl_value_t*)a; + } + jl_value_t *ti = jl_type_intersection((jl_value_t*)a, eqc->data[i+1]); + if (ti == (jl_value_t*)jl_bottom_type) { + JL_GC_POP(); + return ti; + } + break; + } + } } extend((jl_value_t*)a, b, penv); if (jl_is_typevar(b)) { diff --git a/test/core.jl b/test/core.jl index 7239aa6f39194..df5316a9c69b1 100644 --- a/test/core.jl +++ b/test/core.jl @@ -2847,3 +2847,9 @@ type B11136 end let T = TypeVar(:T, true), TB = TypeVar(:T, B11136, true) testintersect(Tuple{T, T}, Tuple{A11136, TB}, Bottom) end + +# issue #11367 +abstract Foo11367 +let T1 = TypeVar(:T1, true), T2 = TypeVar(:T2, Foo11367, true) + testintersect(Tuple{T1, T1}, Tuple{Type{BigInt}, T2}, Bottom) +end