Skip to content

Commit d6db91c

Browse files
committed
Special-case Vararg handling when contained in an NTuple.
1 parent 24a1a7c commit d6db91c

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

src/jltypes.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2248,7 +2248,26 @@ static jl_value_t *inst_tuple_w_(jl_value_t *t, jl_typeenv_t *env, jl_typestack_
22482248
int i;
22492249
for (i = 0; i < ntp; i++) {
22502250
jl_value_t *elt = jl_svecref(tp, i);
2251-
jl_value_t *pi = inst_type_w_(elt, env, stack, check);
2251+
jl_value_t *pi = NULL;
2252+
if (jl_is_vararg(elt)) {
2253+
// special-case Vararg when contained in Tuple: normally we disallow non-type T,
2254+
// but NTuple{2,N} should work for StaticArrays.jl (see JuliaLang/julia#51244).
2255+
jl_vararg_t *va = (jl_vararg_t*)elt;
2256+
jl_value_t *T = NULL;
2257+
if (va->T) {
2258+
T = inst_type_w_(va->T, env, stack, check);
2259+
if (!jl_is_type(T) && !jl_is_typevar(T)) {
2260+
// temporarily swap out Vararg{T} for Vararg{Any}
2261+
va->T = (jl_value_t*) jl_any_type;
2262+
} else
2263+
T = NULL;
2264+
}
2265+
pi = inst_type_w_(elt, env, stack, check);
2266+
if (T)
2267+
((jl_vararg_t*)pi)->T = T;
2268+
} else {
2269+
pi = inst_type_w_(elt, env, stack, check);
2270+
}
22522271
iparams[i] = pi;
22532272
if (ip_heap)
22542273
jl_gc_wb(ip_heap, pi);

test/core.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8097,3 +8097,13 @@ end
80978097
let lin = Core.LineInfoNode(Base, first(methods(convert)), :foo, Int32(5), Int32(0))
80988098
@test convert(LineNumberNode, lin) == LineNumberNode(5, :foo)
80998099
end
8100+
8101+
# JuliaLang/julia#51228: bad Varargs should be disallowed
8102+
let
8103+
@test_throws TypeError Vararg{2,2}
8104+
# ... but should still be allowed inside of a Tuple
8105+
@test_broken Tuple{Vararg{2,2}} === Tuple{2,2}
8106+
# ... because it's used for the NTuple definition
8107+
@test NTuple{2,2} === Tuple{2,2}
8108+
# ... which is used by e.g. StaticArrays.jl
8109+
end

0 commit comments

Comments
 (0)