@@ -4138,19 +4138,30 @@ static jl_value_t *intersect_all(jl_value_t *x, jl_value_t *y, jl_stenv_t *e)
41384138 save_env (e , & se , 1 );
41394139 int niter = 0 , total_iter = 0 ;
41404140 is [0 ] = intersect (x , y , e , 0 ); // root
4141- if (is [0 ] != jl_bottom_type )
4141+ if (is [0 ] == jl_bottom_type ) {
4142+ restore_env (e , & se , 1 );
4143+ }
4144+ else if (!e -> emptiness_only && has_next_union_state (e , 1 )) {
41424145 niter = merge_env (e , & me , & se , niter );
4143- restore_env (e , & se , 1 );
4146+ restore_env (e , & se , 1 );
4147+ }
41444148 while (next_union_state (e , 1 )) {
41454149 if (e -> emptiness_only && is [0 ] != jl_bottom_type )
41464150 break ;
41474151 e -> Runions .depth = 0 ;
41484152 e -> Runions .more = 0 ;
41494153
41504154 is [1 ] = intersect (x , y , e , 0 );
4151- if (is [1 ] != jl_bottom_type )
4155+ if (is [1 ] == jl_bottom_type ) {
4156+ restore_env (e , & se , 1 );
4157+ }
4158+ else if (niter > 0 || (!e -> emptiness_only && has_next_union_state (e , 1 ))) {
41524159 niter = merge_env (e , & me , & se , niter );
4153- restore_env (e , & se , 1 );
4160+ restore_env (e , & se , 1 );
4161+ }
4162+ else {
4163+ assert (is [0 ] == jl_bottom_type );
4164+ }
41544165 if (is [0 ] == jl_bottom_type )
41554166 is [0 ] = is [1 ];
41564167 else if (is [1 ] != jl_bottom_type ) {
0 commit comments