@@ -2129,19 +2129,35 @@ static jl_value_t *intersect_var(jl_tvar_t *b, jl_value_t *a, jl_stenv_t *e, int
21292129 int d = bb -> depth0 ;
21302130 jl_value_t * root = NULL ; jl_savedenv_t se ;
21312131 if (param == 2 ) {
2132- if (!(subtype_in_env_existential (bb -> lb , a , e , 0 , d ) && subtype_in_env_existential (a , bb -> ub , e , 1 , d )))
2133- return jl_bottom_type ;
2134- jl_value_t * ub = a ;
2132+ jl_value_t * ub = NULL ;
2133+ JL_GC_PUSH2 (& ub , & root );
2134+ if (!jl_has_free_typevars (a )) {
2135+ save_env (e , & root , & se );
2136+ int issub = subtype_in_env_existential (bb -> lb , a , e , 0 , d ) && subtype_in_env_existential (a , bb -> ub , e , 1 , d );
2137+ restore_env (e , root , & se );
2138+ free (se .buf );
2139+ if (!issub ) {
2140+ JL_GC_POP ();
2141+ return jl_bottom_type ;
2142+ }
2143+ ub = a ;
2144+ }
2145+ else {
2146+ ub = R ? intersect_aside (a , bb -> ub , e , 1 , d ) : intersect_aside (bb -> ub , a , e , 0 , d );
2147+ // TODO: we should probably check `bb->lb <: ub` here; find a test case for that
2148+ }
21352149 if (ub != (jl_value_t * )b ) {
21362150 if (jl_has_free_typevars (ub )) {
21372151 // constraint X == Ref{X} is unsatisfiable. also check variables set equal to X.
21382152 if (var_occurs_inside (ub , b , 0 , 0 )) {
2153+ JL_GC_POP ();
21392154 return jl_bottom_type ;
21402155 }
21412156 jl_varbinding_t * btemp = e -> vars ;
21422157 while (btemp != NULL ) {
21432158 if (btemp -> lb == (jl_value_t * )b && btemp -> ub == (jl_value_t * )b &&
21442159 var_occurs_inside (ub , btemp -> var , 0 , 0 )) {
2160+ JL_GC_POP ();
21452161 return jl_bottom_type ;
21462162 }
21472163 btemp = btemp -> prev ;
@@ -2150,6 +2166,7 @@ static jl_value_t *intersect_var(jl_tvar_t *b, jl_value_t *a, jl_stenv_t *e, int
21502166 bb -> ub = ub ;
21512167 bb -> lb = ub ;
21522168 }
2169+ JL_GC_POP ();
21532170 return ub ;
21542171 }
21552172 else if (bb -> constraintkind == 0 ) {
0 commit comments