@@ -2129,19 +2129,35 @@ static jl_value_t *intersect_var(jl_tvar_t *b, jl_value_t *a, jl_stenv_t *e, int
2129
2129
int d = bb -> depth0 ;
2130
2130
jl_value_t * root = NULL ; jl_savedenv_t se ;
2131
2131
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
+ }
2135
2149
if (ub != (jl_value_t * )b ) {
2136
2150
if (jl_has_free_typevars (ub )) {
2137
2151
// constraint X == Ref{X} is unsatisfiable. also check variables set equal to X.
2138
2152
if (var_occurs_inside (ub , b , 0 , 0 )) {
2153
+ JL_GC_POP ();
2139
2154
return jl_bottom_type ;
2140
2155
}
2141
2156
jl_varbinding_t * btemp = e -> vars ;
2142
2157
while (btemp != NULL ) {
2143
2158
if (btemp -> lb == (jl_value_t * )b && btemp -> ub == (jl_value_t * )b &&
2144
2159
var_occurs_inside (ub , btemp -> var , 0 , 0 )) {
2160
+ JL_GC_POP ();
2145
2161
return jl_bottom_type ;
2146
2162
}
2147
2163
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
2150
2166
bb -> ub = ub ;
2151
2167
bb -> lb = ub ;
2152
2168
}
2169
+ JL_GC_POP ();
2153
2170
return ub ;
2154
2171
}
2155
2172
else if (bb -> constraintkind == 0 ) {
0 commit comments