@@ -3018,7 +3018,8 @@ static jl_value_t *finish_unionall(jl_value_t *res JL_MAYBE_UNROOTED, jl_varbind
3018
3018
}
3019
3019
3020
3020
if (vb -> innervars != NULL ) {
3021
- for (size_t i = 0 ; i < jl_array_nrows (vb -> innervars ); i ++ ) {
3021
+ size_t len = jl_array_nrows (vb -> innervars ), count = 0 ;
3022
+ for (size_t i = 0 ; i < len ; i ++ ) {
3022
3023
jl_tvar_t * var = (jl_tvar_t * )jl_array_ptr_ref (vb -> innervars , i );
3023
3024
// the `btemp->prev` walk is only giving a sort of post-order guarantee (since we are
3024
3025
// iterating 2 trees at once), so once we set `wrap`, there might remain other branches
@@ -3033,10 +3034,38 @@ static jl_value_t *finish_unionall(jl_value_t *res JL_MAYBE_UNROOTED, jl_varbind
3033
3034
if (wrap -> innervars == NULL )
3034
3035
wrap -> innervars = jl_alloc_array_1d (jl_array_any_type , 0 );
3035
3036
jl_array_ptr_1d_push (wrap -> innervars , (jl_value_t * )var );
3037
+ jl_array_ptr_set (vb -> innervars , i , (jl_value_t * )NULL );
3036
3038
}
3037
- else if (res != jl_bottom_type ) {
3038
- if (jl_has_typevar (res , var ))
3039
- res = jl_type_unionall ((jl_tvar_t * )var , res );
3039
+ }
3040
+ for (size_t i = 0 ; i < len ; i ++ ) {
3041
+ jl_tvar_t * var = (jl_tvar_t * )jl_array_ptr_ref (vb -> innervars , i );
3042
+ if (var ) count ++ ;
3043
+ if (count < i + 1 )
3044
+ jl_array_ptr_set (vb -> innervars , count - 1 , (jl_value_t * )var );
3045
+ }
3046
+ if (count != len )
3047
+ jl_array_del_end (vb -> innervars , len - count );
3048
+ if (res != jl_bottom_type ) {
3049
+ while (count > 1 ) {
3050
+ int changed = 0 ;
3051
+ for (size_t i = 0 ; i < count - 1 ; i ++ ) {
3052
+ jl_tvar_t * vari = (jl_tvar_t * )jl_array_ptr_ref (vb -> innervars , i );
3053
+ for (size_t j = i + 1 ; j < count ; j ++ ) {
3054
+ jl_tvar_t * varj = (jl_tvar_t * )jl_array_ptr_ref (vb -> innervars , j );
3055
+ if (jl_has_typevar (varj -> lb , vari ) || jl_has_typevar (varj -> ub , vari )) {
3056
+ jl_array_ptr_set (vb -> innervars , j , (jl_value_t * )vari );
3057
+ jl_array_ptr_set (vb -> innervars , i , (jl_value_t * )varj );
3058
+ changed = 1 ;
3059
+ break ;
3060
+ }
3061
+ }
3062
+ if (changed ) break ;
3063
+ }
3064
+ if (!changed ) break ;
3065
+ }
3066
+ for (size_t i = 0 ; i < count ; i ++ ) {
3067
+ jl_tvar_t * var = (jl_tvar_t * )jl_array_ptr_ref (vb -> innervars , i );
3068
+ res = jl_type_unionall (var , res );
3040
3069
}
3041
3070
}
3042
3071
}
0 commit comments