@@ -1487,26 +1487,36 @@ static int equiv_field_types(jl_value_t *old, jl_value_t *ft)
14871487 return 1 ;
14881488}
14891489
1490- static int references_name (jl_value_t * p , jl_typename_t * name , int affects_layout ) JL_NOTSAFEPOINT
1490+ static int references_name (jl_value_t * p , jl_typename_t * name , int affects_layout , htable_t seen ) JL_NOTSAFEPOINT
14911491{
14921492 if (jl_is_uniontype (p ))
1493- return references_name (((jl_uniontype_t * )p )-> a , name , affects_layout ) ||
1494- references_name (((jl_uniontype_t * )p )-> b , name , affects_layout );
1493+ return references_name (((jl_uniontype_t * )p )-> a , name , affects_layout , seen ) ||
1494+ references_name (((jl_uniontype_t * )p )-> b , name , affects_layout , seen );
14951495 if (jl_is_unionall (p ))
1496- return references_name ((jl_value_t * )((jl_unionall_t * )p )-> var , name , 0 ) ||
1497- references_name (((jl_unionall_t * )p )-> body , name , affects_layout );
1496+ return references_name ((jl_value_t * )((jl_unionall_t * )p )-> var , name , 0 , seen ) ||
1497+ references_name (((jl_unionall_t * )p )-> body , name , affects_layout , seen );
14981498 if (jl_is_typevar (p ))
1499- return references_name (((jl_tvar_t * )p )-> ub , name , 0 ) ||
1500- references_name (((jl_tvar_t * )p )-> lb , name , 0 );
1499+ return references_name (((jl_tvar_t * )p )-> ub , name , 0 , seen ) ||
1500+ references_name (((jl_tvar_t * )p )-> lb , name , 0 , seen );
15011501 if (jl_is_datatype (p )) {
15021502 jl_datatype_t * dp = (jl_datatype_t * )p ;
15031503 if (affects_layout && dp -> name == name )
15041504 return 1 ;
1505- affects_layout = dp -> types == NULL || jl_svec_len (dp -> types ) != 0 ;
1506- size_t i , l = jl_nparams (p );
1507- for (i = 0 ; i < l ; i ++ ) {
1508- if (references_name (jl_tparam (p , i ), name , affects_layout ))
1509- return 1 ;
1505+ jl_svec_t * ft = dp -> types ;
1506+ if (ft && !ptrhash_has (& seen , (void * )p )) {
1507+ ptrhash_put (& seen , (void * )p , (void * )2 );
1508+ size_t i , l = jl_svec_len (ft );
1509+ for (i = 0 ; i < l ; i ++ ) {
1510+ if (references_name (jl_svecref (ft , i ), name , 1 , seen ))
1511+ return 1 ;
1512+ }
1513+ }
1514+ else {
1515+ size_t i , l = jl_nparams (p );
1516+ for (i = 0 ; i < l ; i ++ ) {
1517+ if (references_name (jl_tparam (p , i ), name , 1 , seen ))
1518+ return 1 ;
1519+ }
15101520 }
15111521 }
15121522 return 0 ;
@@ -1542,7 +1552,9 @@ JL_CALLABLE(jl_f__typebody)
15421552 size_t i , nf = jl_svec_len (ft );
15431553 for (i = 0 ; i < nf ; i ++ ) {
15441554 jl_value_t * fld = jl_svecref (ft , i );
1545- if (references_name (fld , dt -> name , 1 )) {
1555+ htable_t seen ;
1556+ htable_new (& seen , 32 );
1557+ if (references_name (fld , dt -> name , 1 , seen )) {
15461558 dt -> name -> mayinlinealloc = 0 ;
15471559 break ;
15481560 }
0 commit comments