Skip to content

Commit

Permalink
subtype: replace leaf-bound typevars if they would result in Tuple{Un…
Browse files Browse the repository at this point in the history
…ion{}} otherwise (#49393)

This was a primary motivation for #49111. Previously, we'd see some
some method specializations such as `convert(::Type{T}, ::T) where
T<:Float64` (apparently from inference of some tuple convert
specializations), which were not necessary to have.
  • Loading branch information
vtjnash authored Apr 20, 2023
1 parent d8fb5e7 commit c237c0a
Showing 1 changed file with 3 additions and 4 deletions.
7 changes: 3 additions & 4 deletions src/subtype.c
Original file line number Diff line number Diff line change
Expand Up @@ -2774,10 +2774,9 @@ static jl_value_t *finish_unionall(jl_value_t *res JL_MAYBE_UNROOTED, jl_varbind
// given x<:T<:x, substitute x for T
varval = vb->ub;
}
// TODO: `vb.occurs_cov == 1` here allows substituting Tuple{<:X} => Tuple{X},
// which is valid but changes some ambiguity errors so we don't need to do it yet.
else if ((/*vb->occurs_cov == 1 || */is_leaf_bound(vb->ub)) &&
!var_occurs_invariant(u->body, u->var, 0)) {
// TODO: `vb.occurs_cov == 1`, we could also substitute Tuple{<:X} => Tuple{X},
// but it may change some ambiguity errors so we don't need to do it yet.
else if (vb->occurs_cov && is_leaf_bound(vb->ub) && !jl_has_free_typevars(vb->ub)) {
// replace T<:x with x in covariant position when possible
varval = vb->ub;
}
Expand Down

0 comments on commit c237c0a

Please sign in to comment.