@@ -279,25 +279,25 @@ int jl_pointer_egal(jl_value_t *t)
279
279
return 0 ;
280
280
}
281
281
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
283
283
{
284
284
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 );
287
287
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 );
290
290
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 );
293
293
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 )
295
296
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 ;
298
298
size_t i , l = jl_nparams (p );
299
299
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 ))
301
301
return 1 ;
302
302
}
303
303
}
@@ -390,7 +390,7 @@ void jl_compute_field_offsets(jl_datatype_t *st)
390
390
size_t i , nf = jl_svec_len (w -> types );
391
391
for (i = 0 ; i < nf ; i ++ ) {
392
392
jl_value_t * fld = jl_svecref (w -> types , i );
393
- if (references_name (fld , w -> name )) {
393
+ if (references_name (fld , w -> name , 1 )) {
394
394
isinlinealloc = 0 ;
395
395
isbitstype = 0 ;
396
396
break ;
0 commit comments