@@ -1878,32 +1878,40 @@ mod unify {
1878
1878
ufind:: grow( cx. vb. sets, uint:: max( set_a, set_b) + 1 u) ;
1879
1879
auto root_a = ufind:: find( cx. vb. sets, set_a) ;
1880
1880
auto root_b = ufind:: find( cx. vb. sets, set_b) ;
1881
- ufind:: union ( cx. vb. sets, set_a, set_b) ;
1882
- auto root_c = ufind:: find( cx. vb. sets, set_a) ;
1881
+
1882
+ auto replace_type = bind fn ( & @ctxt cx, t t, uint set_a, uint set_b) {
1883
+ ufind:: union ( cx. vb. sets, set_a, set_b) ;
1884
+ let uint root_c = ufind:: find( cx. vb. sets, set_a) ;
1885
+ smallintmap:: insert[ t] ( cx. vb. types, root_c, t) ;
1886
+ } ( _, _, set_a, set_b) ;
1887
+
1883
1888
alt ( smallintmap:: find[ t] ( cx. vb. types, root_a) ) {
1884
1889
case ( none[ t] ) {
1885
1890
alt ( smallintmap:: find[ t] ( cx. vb. types, root_b) ) {
1886
- case ( none[ t] ) { ret unres_ok; }
1891
+ case ( none[ t] ) {
1892
+ ufind:: union ( cx. vb. sets, set_a, set_b) ;
1893
+ ret unres_ok; }
1887
1894
case ( some[ t] ( ?t_b) ) {
1888
- smallintmap :: insert [ t ] ( cx. vb . types , root_c , t_b) ;
1895
+ replace_type ( cx, t_b) ;
1889
1896
ret unres_ok;
1890
1897
}
1891
1898
}
1892
1899
}
1893
1900
case ( some[ t] ( ?t_a) ) {
1894
1901
alt ( smallintmap:: find[ t] ( cx. vb. types, root_b) ) {
1895
1902
case ( none[ t] ) {
1896
- smallintmap :: insert [ t ] ( cx. vb . types , root_c , t_a) ;
1903
+ replace_type ( cx, t_a) ;
1897
1904
ret unres_ok;
1898
1905
}
1899
1906
case ( some[ t] ( ?t_b) ) {
1900
1907
alt ( unify_step( cx, t_a, t_b) ) {
1901
1908
case ( ures_ok( ?t_c) ) {
1902
- smallintmap:: insert[ t] ( cx. vb. types, root_c,
1903
- t_c) ;
1909
+ replace_type( cx, t_c) ;
1904
1910
ret unres_ok;
1905
1911
}
1906
- case ( ures_err( ?terr) ) { ret unres_err( terr) ; }
1912
+ case ( ures_err( ?terr) ) {
1913
+ ret unres_err( terr) ;
1914
+ }
1907
1915
}
1908
1916
}
1909
1917
}
0 commit comments