Skip to content

Commit 1a8d57a

Browse files
JeffBezansonstaticfloat
authored andcommitted
fix a bug in circular type detection (#35275)
1 parent c1f63c4 commit 1a8d57a

File tree

2 files changed

+19
-12
lines changed

2 files changed

+19
-12
lines changed

src/datatype.c

+12-12
Original file line numberDiff line numberDiff line change
@@ -279,25 +279,25 @@ int jl_pointer_egal(jl_value_t *t)
279279
return 0;
280280
}
281281

282-
static int references_name(jl_value_t *p, jl_typename_t *name) JL_NOTSAFEPOINT
282+
static int references_name(jl_value_t *p, jl_typename_t *name, int affects_layout) JL_NOTSAFEPOINT
283283
{
284284
if (jl_is_uniontype(p))
285-
return references_name(((jl_uniontype_t*)p)->a, name) ||
286-
references_name(((jl_uniontype_t*)p)->b, name);
285+
return references_name(((jl_uniontype_t*)p)->a, name, affects_layout) ||
286+
references_name(((jl_uniontype_t*)p)->b, name, affects_layout);
287287
if (jl_is_unionall(p))
288-
return references_name((jl_value_t*)((jl_unionall_t*)p)->var, name) ||
289-
references_name(((jl_unionall_t*)p)->body, name);
288+
return references_name((jl_value_t*)((jl_unionall_t*)p)->var, name, 0) ||
289+
references_name(((jl_unionall_t*)p)->body, name, affects_layout);
290290
if (jl_is_typevar(p))
291-
return references_name(((jl_tvar_t*)p)->ub, name) ||
292-
references_name(((jl_tvar_t*)p)->lb, name);
291+
return references_name(((jl_tvar_t*)p)->ub, name, 0) ||
292+
references_name(((jl_tvar_t*)p)->lb, name, 0);
293293
if (jl_is_datatype(p)) {
294-
if (((jl_datatype_t*)p)->name == name)
294+
jl_datatype_t *dp = (jl_datatype_t*)p;
295+
if (affects_layout && dp->name == name)
295296
return 1;
296-
if (((jl_datatype_t*)p)->layout && jl_datatype_nfields(p) == 0)
297-
return 0;
297+
affects_layout = dp->types == NULL || jl_svec_len(dp->types) != 0;
298298
size_t i, l = jl_nparams(p);
299299
for (i = 0; i < l; i++) {
300-
if (references_name(jl_tparam(p, i), name))
300+
if (references_name(jl_tparam(p, i), name, affects_layout))
301301
return 1;
302302
}
303303
}
@@ -390,7 +390,7 @@ void jl_compute_field_offsets(jl_datatype_t *st)
390390
size_t i, nf = jl_svec_len(w->types);
391391
for (i = 0; i < nf; i++) {
392392
jl_value_t *fld = jl_svecref(w->types, i);
393-
if (references_name(fld, w->name)) {
393+
if (references_name(fld, w->name, 1)) {
394394
isinlinealloc = 0;
395395
isbitstype = 0;
396396
break;

test/core.jl

+7
Original file line numberDiff line numberDiff line change
@@ -7191,3 +7191,10 @@ end
71917191
@test_throws ErrorException f34482()
71927192
@test_throws TypeError g34482()
71937193
@test_throws TypeError h34482()
7194+
7195+
struct NFANode34126
7196+
edges::Vector{Tuple{Nothing,NFANode34126}}
7197+
NFANode34126() = new(Tuple{Nothing,NFANode34126}[])
7198+
end
7199+
7200+
@test repr(NFANode34126()) == "$NFANode34126(Tuple{Nothing,$NFANode34126}[])"

0 commit comments

Comments
 (0)