From b19ba88d9fe1ba18573049fd0f6aa574ce0870b7 Mon Sep 17 00:00:00 2001 From: Jarrett Revels Date: Tue, 8 May 2018 11:17:50 -0400 Subject: [PATCH] fix isvatuple to properly handle UnionAlls (#27018) * fix isvatuple to properly handle UnionAlls * add tests for #27018 --- base/essentials.jl | 10 +++++++++- test/core.jl | 10 ++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/base/essentials.jl b/base/essentials.jl index 793a276827e14..8e2c019d4d14d 100644 --- a/base/essentials.jl +++ b/base/essentials.jl @@ -207,7 +207,15 @@ function isvarargtype(@nospecialize(t)) return isa(t, DataType) && (t::DataType).name === _va_typename end -isvatuple(t::DataType) = (n = length(t.parameters); n > 0 && isvarargtype(t.parameters[n])) +function isvatuple(@nospecialize(t)) + t = unwrap_unionall(t) + if isa(t, DataType) + n = length(t.parameters) + return n > 0 && isvarargtype(t.parameters[n]) + end + return false +end + function unwrapva(@nospecialize(t)) # NOTE: this returns a related type, but it's NOT a subtype of the original tuple t2 = unwrap_unionall(t) diff --git a/test/core.jl b/test/core.jl index 668221ed7bf0b..fb05c73b3a711 100644 --- a/test/core.jl +++ b/test/core.jl @@ -6051,3 +6051,13 @@ g2_23206(::Tuple{Type{Int}}) = 1 let x26739 = Int[1] @test eval(:(identity.($x26739))) == x26739 end + +# issue #27018 +@test Base.isvatuple(Tuple{Float64,Vararg{Int}}) +@test Base.isvatuple(Tuple{T,Vararg{Int}} where T) +@test Base.isvatuple(Tuple{Int,Int,Vararg{Int,N}} where N) +@test Base.isvatuple(Tuple{T,S,Vararg{T}} where T<:S where S) +@test Base.isvatuple(Tuple{T,S,Vararg{T,3}} where T<:S where S) +@test !Base.isvatuple(Tuple{Float64,Vararg{Int,1}}) +@test !Base.isvatuple(Tuple{T,Vararg{Int,2}} where T) +@test !Base.isvatuple(Tuple{Int,Int,Vararg{Int,2}})