@@ -2510,6 +2510,7 @@ static jl_value_t *finish_unionall(jl_value_t *res JL_MAYBE_UNROOTED, jl_varbind
2510
2510
else if (!(oldval && jl_is_typevar (oldval ) && jl_is_long (varval )))
2511
2511
e -> envout [e -> envidx ] = fix_inferred_var_bound (vb -> var , varval );
2512
2512
}
2513
+ vb -> var = newvar ;
2513
2514
2514
2515
JL_GC_POP ();
2515
2516
return res ;
@@ -2587,21 +2588,35 @@ static jl_value_t *intersect_unionall(jl_value_t *t, jl_unionall_t *u, jl_stenv_
2587
2588
res = intersect_unionall_ (t , u , e , R , param , & vb );
2588
2589
if (res != jl_bottom_type ) {
2589
2590
if (vb .concrete || vb .occurs_inv > 1 || u -> var -> lb != jl_bottom_type || (vb .occurs_inv && vb .occurs_cov )) {
2591
+ jl_value_t * u2 = (jl_value_t * )u ;
2592
+ JL_GC_PUSH1 (& u2 );
2593
+ // This step maintains variable bounds from the previous intersect_unionall_ call.
2594
+ // So, if we needed to rename the variable, make sure `u` uses the same variable
2595
+ // so we know it actually refers to the same type in the environment.
2596
+ // This is a bit of a hack to fix #39698.
2597
+ if (vb .var != u -> var ) {
2598
+ u2 = jl_instantiate_unionall (u , (jl_value_t * )vb .var );
2599
+ u2 = (jl_value_t * )jl_type_unionall (vb .var , u2 );
2600
+ assert (jl_is_unionall (u2 ));
2601
+ }
2590
2602
restore_env (e , NULL , & se );
2591
2603
vb .occurs_cov = vb .occurs_inv = 0 ;
2592
2604
vb .constraintkind = 3 ;
2593
- res = intersect_unionall_ (t , u , e , R , param , & vb );
2605
+ res = intersect_unionall_ (t , (jl_unionall_t * )u2 , e , R , param , & vb );
2606
+ JL_GC_POP ();
2594
2607
}
2595
2608
else if (vb .occurs_cov ) {
2596
2609
save_env (e , & save2 , & se2 );
2597
2610
restore_env (e , save , & se );
2598
2611
vb .occurs_cov = vb .occurs_inv = 0 ;
2612
+ vb .var = u -> var ;
2599
2613
vb .lb = u -> var -> lb ; vb .ub = u -> var -> ub ;
2600
2614
vb .constraintkind = 1 ;
2601
2615
res2 = intersect_unionall_ (t , u , e , R , param , & vb );
2602
2616
if (res2 == jl_bottom_type ) {
2603
2617
restore_env (e , save , & se );
2604
2618
vb .occurs_cov = vb .occurs_inv = 0 ;
2619
+ vb .var = u -> var ;
2605
2620
vb .lb = u -> var -> lb ; vb .ub = u -> var -> ub ;
2606
2621
vb .constraintkind = 2 ;
2607
2622
res2 = intersect_unionall_ (t , u , e , R , param , & vb );
0 commit comments