Skip to content

Commit ebae716

Browse files
authored
Subtype: bug fix for bounds with deeper covariant var (#50832)
fix #50716.
1 parent 744aa79 commit ebae716

File tree

4 files changed

+15
-13
lines changed

4 files changed

+15
-13
lines changed

base/namedtuple.jl

+9-10
Original file line numberDiff line numberDiff line change
@@ -183,16 +183,15 @@ nextind(@nospecialize(t::NamedTuple), i::Integer) = Int(i)+1
183183
convert(::Type{NT}, nt::NT) where {names, NT<:NamedTuple{names}} = nt
184184
convert(::Type{NT}, nt::NT) where {names, T<:Tuple, NT<:NamedTuple{names,T}} = nt
185185

186-
function convert(::Type{NT}, nt::NamedTuple{names}) where {names, T<:Tuple, NT<:NamedTuple{names,T}}
187-
if !@isdefined T
188-
# converting abstract NT to an abstract Tuple type, to a concrete NT1, is not straightforward, so this could just be an error, but we define it anyways
189-
# _tuple_error(NT, nt)
190-
T1 = Tuple{ntuple(i -> fieldtype(NT, i), Val(length(names)))...}
191-
NT1 = NamedTuple{names, T1}
192-
else
193-
T1 = T
194-
NT1 = NT
195-
end
186+
function convert(::Type{NamedTuple{names,T}}, nt::NamedTuple{names}) where {names,T<:Tuple}
187+
NamedTuple{names,T}(T(nt))::NamedTuple{names,T}
188+
end
189+
190+
function convert(::Type{NT}, nt::NamedTuple{names}) where {names, NT<:NamedTuple{names}}
191+
# converting abstract NT to an abstract Tuple type, to a concrete NT1, is not straightforward, so this could just be an error, but we define it anyways
192+
# _tuple_error(NT, nt)
193+
T1 = Tuple{ntuple(i -> fieldtype(NT, i), Val(length(names)))...}
194+
NT1 = NamedTuple{names, T1}
196195
return NT1(T1(nt))::NT1::NT
197196
end
198197

src/subtype.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -941,8 +941,8 @@ static int subtype_unionall(jl_value_t *t, jl_unionall_t *u, jl_stenv_t *e, int8
941941
jl_value_t *vl = btemp->lb;
942942
// TODO: this takes a significant amount of time
943943
if (btemp->depth0 != vb.depth0 &&
944-
((vu != (jl_value_t*)vb.var && btemp->var->ub != vu && var_occurs_invariant(vu, vb.var)) ||
945-
(vl != (jl_value_t*)vb.var && btemp->var->lb != vl && var_occurs_invariant(vl, vb.var)))) {
944+
((vu != (jl_value_t*)vb.var && btemp->var->ub != vu && var_occurs_inside(vu, vb.var, 0, 0)) ||
945+
(vl != (jl_value_t*)vb.var && btemp->var->lb != vl && var_occurs_inside(vl, vb.var, 0, 0)))) {
946946
ans = 0; break;
947947
}
948948
btemp = btemp->prev;

stdlib/LinearAlgebra/src/bidiag.jl

+1-1
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ Matrix(A::Bidiagonal{T}) where {T} = Matrix{promote_type(T, typeof(zero(T)))}(A)
214214
Array(A::Bidiagonal) = Matrix(A)
215215
promote_rule(::Type{Matrix{T}}, ::Type{<:Bidiagonal{S}}) where {T,S} =
216216
@isdefined(T) && @isdefined(S) ? Matrix{promote_type(T,S)} : Matrix
217-
promote_rule(::Type{Matrix}, ::Type{<:Bidiagonal}) = Matrix
217+
promote_rule(::Type{<:Matrix}, ::Type{<:Bidiagonal}) = Matrix
218218

219219
#Converting from Bidiagonal to Tridiagonal
220220
function Tridiagonal{T}(A::Bidiagonal) where T

test/subtype.jl

+3
Original file line numberDiff line numberDiff line change
@@ -1436,6 +1436,9 @@ struct A23764_2{T, N, S} <: AbstractArray{Union{Ref{T}, S}, N}; end
14361436
@test Tuple{A23764_2{T, 1, Nothing} where T} <: Tuple{AbstractArray{T,N}} where {T,N}
14371437
@test Tuple{A23764_2{T, 1, Nothing} where T} <: Tuple{AbstractArray{T,N} where {T,N}}
14381438

1439+
# issue #50716
1440+
@test !<:(Ref{Vector{Tuple{K}} where K}, Ref{<:Vector{K}} where K)
1441+
14391442
# issue #26131
14401443
@test !(Vector{Vector{Number}} <: Vector{Union{Vector{Number}, Vector{S}}} where S<:Integer)
14411444

0 commit comments

Comments
 (0)