@@ -4147,6 +4147,17 @@ let find_cltype_for_path env p =
41474147let has_constr_row' env t =
41484148 has_constr_row (expand_abbrev env t)
41494149
4150+ let build_submode posi m =
4151+ if posi then begin
4152+ let m', changed = Btype.Alloc_mode. newvar_below m in
4153+ let c = if changed then Changed else Unchanged in
4154+ m', c
4155+ end else begin
4156+ let m', changed = Btype.Alloc_mode. newvar_above m in
4157+ let c = if changed then Changed else Unchanged in
4158+ m', c
4159+ end
4160+
41504161let rec build_subtype env visited loops posi level t =
41514162 let t = repr t in
41524163 match t.desc with
@@ -4160,14 +4171,19 @@ let rec build_subtype env visited loops posi level t =
41604171 (t, Unchanged )
41614172 else
41624173 (t, Unchanged )
4163- | Tarrow (l , t1 , t2 , _ ) ->
4174+ | Tarrow (( l , a , r ) , t1 , t2 , _ ) ->
41644175 if memq_warn t visited then (t, Unchanged ) else
41654176 let visited = t :: visited in
41664177 let (t1', c1) = build_subtype env visited loops (not posi) level t1 in
41674178 let (t2', c2) = build_subtype env visited loops posi level t2 in
4168- let c = max c1 c2 in
4169- (* FIXME update arrow modes *)
4170- if c > Unchanged then (newty (Tarrow (l, t1', t2', Cok )), c)
4179+ let (a', c3) =
4180+ if level > 2 then build_submode (not posi) a else a, Unchanged
4181+ in
4182+ let (r', c4) =
4183+ if level > 2 then build_submode posi r else r, Unchanged
4184+ in
4185+ let c = max c1 (max c2 (max c3 c4)) in
4186+ if c > Unchanged then (newty (Tarrow ((l,a',r'), t1', t2', Cok )), c)
41714187 else (t, Unchanged )
41724188 | Ttuple tlist ->
41734189 if memq_warn t visited then (t, Unchanged ) else
@@ -4336,6 +4352,11 @@ let subtypes = TypePairs.create 17
43364352let subtype_error env trace =
43374353 raise (Subtype (expand_trace env (List. rev trace), [] ))
43384354
4355+ let subtype_alloc_mode env trace a1 a2 =
4356+ match Btype.Alloc_mode. submode a1 a2 with
4357+ | Ok () -> ()
4358+ | Error () -> subtype_error env trace
4359+
43394360let rec subtype_rec env trace t1 t2 cstrs =
43404361 let t1 = repr t1 in
43414362 let t2 = repr t2 in
@@ -4353,8 +4374,8 @@ let rec subtype_rec env trace t1 t2 cstrs =
43534374 (l1 = l2
43544375 || ! Clflags. classic && not (is_optional l1 || is_optional l2)) ->
43554376 let cstrs = subtype_rec env (Trace. diff t2 t1::trace) t2 t1 cstrs in
4356- unify_alloc_mode a1 a2; (* FIXME *)
4357- unify_alloc_mode r1 r2;
4377+ subtype_alloc_mode env trace a2 a1;
4378+ subtype_alloc_mode env trace r1 r2;
43584379 subtype_rec env (Trace. diff u1 u2::trace) u1 u2 cstrs;
43594380 | (Ttuple tl1 , Ttuple tl2 ) ->
43604381 subtype_list env trace tl1 tl2 cstrs
0 commit comments