Skip to content

Commit b29b9b5

Browse files
vtjnashKristofferC
authored andcommitted
handle unbound vars in NTuple fields (#55405)
Comparing objects by `==` will happily answer nonsense for malformed type comparisons, such as `unwrap_unionall(A) == A`. Avoid forming that query. Additionally, need to recourse through Vararg when examining type structure to make decisions. Fix #55076 Fix #55189 (cherry picked from commit 32423a8)
1 parent b7d4aeb commit b29b9b5

File tree

3 files changed

+16
-3
lines changed

3 files changed

+16
-3
lines changed

src/builtins.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2105,6 +2105,12 @@ static int references_name(jl_value_t *p, jl_typename_t *name, int affects_layou
21052105
return references_name(((jl_uniontype_t*)p)->a, name, affects_layout, freevars) ||
21062106
references_name(((jl_uniontype_t*)p)->b, name, affects_layout, freevars);
21072107
}
2108+
if (jl_is_vararg(p)) {
2109+
jl_value_t *T = ((jl_vararg_t*)p)->T;
2110+
jl_value_t *N = ((jl_vararg_t*)p)->N;
2111+
return (T && references_name(T, name, affects_layout, freevars)) ||
2112+
(N && references_name(N, name, affects_layout, freevars));
2113+
}
21082114
if (jl_is_typevar(p))
21092115
return 0; // already checked by unionall, if applicable
21102116
if (jl_is_datatype(p)) {

src/jltypes.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1913,7 +1913,7 @@ static jl_value_t *jl_tupletype_fill(size_t n, jl_value_t *t, int check, int not
19131913
t = normalize_unionalls(t);
19141914
p = t;
19151915
jl_value_t *tw = extract_wrapper(t);
1916-
if (tw && t != tw && jl_types_equal(t, tw))
1916+
if (tw && t != tw && !jl_has_free_typevars(t) && jl_types_equal(t, tw))
19171917
t = tw;
19181918
p = t;
19191919
check = 0; // remember that checks are already done now
@@ -1997,7 +1997,7 @@ static jl_value_t *inst_datatype_inner(jl_datatype_t *dt, jl_svec_t *p, jl_value
19971997
// normalize types equal to wrappers (prepare for Typeofwrapper)
19981998
jl_value_t *tw = extract_wrapper(pi);
19991999
if (tw && tw != pi && (tn != jl_type_typename || jl_typeof(pi) == jl_typeof(tw)) &&
2000-
jl_types_equal(pi, tw)) {
2000+
!jl_has_free_typevars(pi) && jl_types_equal(pi, tw)) {
20012001
iparams[i] = tw;
20022002
if (p) jl_gc_wb(p, tw);
20032003
}
@@ -2669,7 +2669,7 @@ jl_vararg_t *jl_wrap_vararg(jl_value_t *t, jl_value_t *n, int check, int nothrow
26692669
if (valid) {
26702670
t = normalize_unionalls(t);
26712671
jl_value_t *tw = extract_wrapper(t);
2672-
if (tw && t != tw && jl_types_equal(t, tw))
2672+
if (tw && t != tw && !jl_has_free_typevars(t) && jl_types_equal(t, tw))
26732673
t = tw;
26742674
}
26752675
}

test/core.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7477,6 +7477,13 @@ struct A43411{S, T}
74777477
end
74787478
@test isbitstype(A43411{(:a,), Tuple{Int}})
74797479

7480+
# issue #55189
7481+
struct A55189{N}
7482+
children::NTuple{N,A55189{N}}
7483+
end
7484+
@test fieldtype(A55189{2}, 1) === Tuple{A55189{2}, A55189{2}}
7485+
@assert !isbitstype(A55189{2})
7486+
74807487
# issue #44614
74817488
struct T44614_1{T}
74827489
m::T

0 commit comments

Comments
 (0)