typeintersect: convert union of tuples to tuple of unions (#27573)
* Resolve an ambiguity for `\`
Resolve the ambiguity between
`(\)(::Union{QR,QRCompactWY,QRPivoted},::AbstractVecOrMat)` and
`(\)(::Factorization, ::Diagonal)` by defining
`(\)(::Union{QR,QRCompactWY,QRPivoted}, ::Diagonal)` to `invoke` the
former.
* Resolve an ambiguity for `BroadcastStyle`
Resolve the ambiguity between
`BroadcastStyle(::SPVM, ::AbstractArrayStyle{0})` and
`BroadcastStyle(::AbstractArrayStyle{M}, ::DefaultArrayStyle{N})` by
defining `BroadcastStyle(::SPVM, ::DefaultArrayStyle{0})` equivalent to
the former.
* Resolve an ambiguity for `\`
Resolve the ambiguity between
`(\)(::Factorization{T}, ::VecOrMat{Complex{T}}) where T<:BlasReal` and
`(\)(::QRSparse, ::StridedVecOrMat)` by widening
`(\)(::QRSparse{Float64}, ::VecOrMat{Complex{Float64}})` to
`(\)(::QRSparse{T}, ::VecOrMat{Complex{T}}) where T<:BlasReal`.
* Only prevent typeintersect from returning a Union if both arguments are Tuples
* Convert a union of tuples to a tuple of unions in typeintersect
This may potentially widen the result, but is better than just returning
the second argument instead.