Skip to content

Commit bb62a53

Browse files
N5N3KristofferC
authored andcommitted
Subtype: bug fix for bounds with deeper covariant var (#50832)
fix #50716. (cherry picked from commit ebae716)
1 parent 67dffc4 commit bb62a53

File tree

4 files changed

+15
-13
lines changed

4 files changed

+15
-13
lines changed

base/namedtuple.jl

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -180,16 +180,15 @@ nextind(@nospecialize(t::NamedTuple), i::Integer) = Int(i)+1
180180
convert(::Type{NT}, nt::NT) where {names, NT<:NamedTuple{names}} = nt
181181
convert(::Type{NT}, nt::NT) where {names, T<:Tuple, NT<:NamedTuple{names,T}} = nt
182182

183-
function convert(::Type{NT}, nt::NamedTuple{names}) where {names, T<:Tuple, NT<:NamedTuple{names,T}}
184-
if !@isdefined T
185-
# 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
186-
# _tuple_error(NT, nt)
187-
T1 = Tuple{ntuple(i -> fieldtype(NT, i), Val(length(names)))...}
188-
NT1 = NamedTuple{names, T1}
189-
else
190-
T1 = T
191-
NT1 = NT
192-
end
183+
function convert(::Type{NamedTuple{names,T}}, nt::NamedTuple{names}) where {names,T<:Tuple}
184+
NamedTuple{names,T}(T(nt))::NamedTuple{names,T}
185+
end
186+
187+
function convert(::Type{NT}, nt::NamedTuple{names}) where {names, NT<:NamedTuple{names}}
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}
193192
return NT1(T1(nt))::NT1::NT
194193
end
195194

src/subtype.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -951,8 +951,8 @@ static int subtype_unionall(jl_value_t *t, jl_unionall_t *u, jl_stenv_t *e, int8
951951
jl_value_t *vl = btemp->lb;
952952
// TODO: this takes a significant amount of time
953953
if (btemp->depth0 != vb.depth0 &&
954-
((vu != (jl_value_t*)vb.var && btemp->var->ub != vu && var_occurs_invariant(vu, vb.var)) ||
955-
(vl != (jl_value_t*)vb.var && btemp->var->lb != vl && var_occurs_invariant(vl, vb.var)))) {
954+
((vu != (jl_value_t*)vb.var && btemp->var->ub != vu && var_occurs_inside(vu, vb.var, 0, 0)) ||
955+
(vl != (jl_value_t*)vb.var && btemp->var->lb != vl && var_occurs_inside(vl, vb.var, 0, 0)))) {
956956
ans = 0; break;
957957
}
958958
btemp = btemp->prev;

stdlib/LinearAlgebra/src/bidiag.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ Matrix(A::Bidiagonal{T}) where {T} = Matrix{promote_type(T, typeof(zero(T)))}(A)
201201
Array(A::Bidiagonal) = Matrix(A)
202202
promote_rule(::Type{Matrix{T}}, ::Type{<:Bidiagonal{S}}) where {T,S} =
203203
@isdefined(T) && @isdefined(S) ? Matrix{promote_type(T,S)} : Matrix
204-
promote_rule(::Type{Matrix}, ::Type{<:Bidiagonal}) = Matrix
204+
promote_rule(::Type{<:Matrix}, ::Type{<:Bidiagonal}) = Matrix
205205

206206
#Converting from Bidiagonal to Tridiagonal
207207
function Tridiagonal{T}(A::Bidiagonal) where T

test/subtype.jl

Lines changed: 3 additions & 0 deletions
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)