Skip to content

Commit 4dd91fa

Browse files
authored
Properly handle non-normalized vararg tuples in tuple_type_tail (#31746)
In preparation for #31681 in particular, but the problem exists on master as well, we just tend to not encounter non-normalized tuple types that often.
1 parent 9d10ebf commit 4dd91fa

File tree

2 files changed

+6
-1
lines changed

2 files changed

+6
-1
lines changed

base/essentials.jl

+3-1
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,9 @@ function tuple_type_tail(T::Type)
212212
else
213213
T.name === Tuple.name || throw(MethodError(tuple_type_tail, (T,)))
214214
if isvatuple(T) && length(T.parameters) == 1
215-
return T
215+
va = T.parameters[1]
216+
(isa(va, DataType) && isa(va.parameters[2], Int)) || return T
217+
return Tuple{Vararg{va.parameters[1], va.parameters[2]-1}}
216218
end
217219
return Tuple{argtail(T.parameters...)...}
218220
end

test/tuple.jl

+3
Original file line numberDiff line numberDiff line change
@@ -448,3 +448,6 @@ end
448448
@test map(p->getproperty(ttest, p), propertynames(ttest)) == ttest
449449
@test_throws ErrorException setproperty!(ttest, 1, :d)
450450
end
451+
452+
# tuple_type_tail on non-normalized vararg tuple
453+
@test Base.tuple_type_tail(Tuple{Vararg{T, 3}} where T<:Real) == Tuple{Vararg{T, 2}} where T<:Real

0 commit comments

Comments
 (0)