@@ -732,9 +732,9 @@ let rec generalize_expansive env var_level visited ty =
732732 else generalize_expansive env var_level visited t)
733733 variance tyl
734734 | Tpackage (_ , _ , tyl ) -> List. iter (generalize_structure var_level) tyl
735- | Tarrow (_ , t1 , t2 , _ , _ ) ->
736- generalize_structure var_level t1 ;
737- generalize_expansive env var_level visited t2
735+ | Tarrow (arg , ret , _ , _ ) ->
736+ generalize_structure var_level arg.typ ;
737+ generalize_expansive env var_level visited ret
738738 | _ -> iter_type_expr (generalize_expansive env var_level visited) ty)
739739
740740let generalize_expansive env ty =
@@ -1926,11 +1926,11 @@ let rec mcomp type_pairs env t1 t2 =
19261926 TypePairs. add type_pairs (t1', t2') () ;
19271927 match (t1'.desc, t2'.desc) with
19281928 | Tvar _ , Tvar _ -> assert false
1929- | Tarrow (l1, t1, u1, _, _), Tarrow (l2, t2, u2 , _, _)
1930- when Asttypes.Noloc. same_arg_label l1 l2
1931- || not (is_optional l1 || is_optional l2 ) ->
1932- mcomp type_pairs env t1 t2 ;
1933- mcomp type_pairs env u1 u2
1929+ | Tarrow (arg1, ret1, _, _), Tarrow (arg2, ret2 , _, _)
1930+ when Asttypes.Noloc. same_arg_label arg1.lbl arg2.lbl
1931+ || not (is_optional arg1.lbl || is_optional arg2.lbl ) ->
1932+ mcomp type_pairs env arg1.typ arg2.typ ;
1933+ mcomp type_pairs env ret1 ret2
19341934 | Ttuple tl1 , Ttuple tl2 -> mcomp_list type_pairs env tl1 tl2
19351935 | Tconstr (p1 , tl1 , _ ), Tconstr (p2 , tl2 , _ ) ->
19361936 mcomp_type_decl type_pairs env p1 p2 tl1 tl2
@@ -2342,13 +2342,13 @@ and unify3 env t1 t1' t2 t2' =
23422342 | Pattern -> add_type_equality t1' t2');
23432343 try
23442344 (match (d1, d2) with
2345- | Tarrow (l1, t1, u1, c1, a1), Tarrow (l2, t2, u2 , c2, a2)
2345+ | Tarrow (arg1, ret1, c1, a1), Tarrow (arg2, ret2 , c2, a2)
23462346 when a1 = a2
2347- && (Asttypes.Noloc. same_arg_label l1 l2
2348- || ( ! umode = Pattern && not (is_optional l1 || is_optional l2))
2349- ) -> (
2350- unify env t1 t2 ;
2351- unify env u1 u2 ;
2347+ && (Asttypes.Noloc. same_arg_label arg1.lbl arg2.lbl
2348+ || ! umode = Pattern
2349+ && not (is_optional arg1.lbl || is_optional arg2.lbl) ) -> (
2350+ unify env arg1.typ arg2.typ ;
2351+ unify env ret1 ret2 ;
23522352 match (commu_repr c1, commu_repr c2) with
23532353 | Clink r , c2 -> set_commu r c2
23542354 | c1 , Clink r -> set_commu r c1
@@ -2796,10 +2796,11 @@ let filter_arrow ~env ~arity t l =
27962796 | Tvar _ ->
27972797 let lv = t.level in
27982798 let t1 = newvar2 lv and t2 = newvar2 lv in
2799- let t' = newty2 lv (Tarrow (l, t1 , t2, Cok , arity)) in
2799+ let t' = newty2 lv (Tarrow ({lbl = l; typ = t1} , t2, Cok , arity)) in
28002800 link_type t t';
28012801 (t1, t2)
2802- | Tarrow (l' , t1 , t2 , _ , _ ) when Asttypes.Noloc. same_arg_label l l' -> (t1, t2)
2802+ | Tarrow (arg , ret , _ , _ ) when Asttypes.Noloc. same_arg_label l arg.lbl ->
2803+ (arg.typ, ret)
28032804 | _ -> raise (Unify [] )
28042805
28052806(* Used by [filter_method]. *)
@@ -2913,10 +2914,10 @@ let rec moregen inst_nongen type_pairs env t1 t2 =
29132914 | Tvar _ , _ when may_instantiate inst_nongen t1' ->
29142915 moregen_occur env t1'.level t2;
29152916 link_type t1' t2
2916- | Tarrow (l1, t1, u1, _, _), Tarrow (l2, t2, u2 , _, _)
2917- when Asttypes.Noloc. same_arg_label l1 l2 ->
2918- moregen inst_nongen type_pairs env t1 t2 ;
2919- moregen inst_nongen type_pairs env u1 u2
2917+ | Tarrow (arg1, ret1, _, _), Tarrow (arg2, ret2 , _, _)
2918+ when Asttypes.Noloc. same_arg_label arg1.lbl arg2.lbl ->
2919+ moregen inst_nongen type_pairs env arg1.typ arg2.typ ;
2920+ moregen inst_nongen type_pairs env ret1 ret2
29202921 | Ttuple tl1 , Ttuple tl2 ->
29212922 moregen_list inst_nongen type_pairs env tl1 tl2
29222923 | Tconstr (p1, tl1, _), Tconstr (p2, tl2, _) when Path. same p1 p2
@@ -3183,10 +3184,10 @@ let rec eqtype rename type_pairs subst env t1 t2 =
31833184 if List. exists (fun (_ , t ) -> t == t2') ! subst then
31843185 raise (Unify [] );
31853186 subst := (t1', t2') :: ! subst)
3186- | Tarrow (l1, t1, u1, _, _), Tarrow (l2, t2, u2 , _, _)
3187- when Asttypes.Noloc. same_arg_label l1 l2 ->
3188- eqtype rename type_pairs subst env t1 t2 ;
3189- eqtype rename type_pairs subst env u1 u2
3187+ | Tarrow (arg1, ret1, _, _), Tarrow (arg2, ret2 , _, _)
3188+ when Asttypes.Noloc. same_arg_label arg1.lbl arg2.lbl ->
3189+ eqtype rename type_pairs subst env arg1.typ arg2.typ ;
3190+ eqtype rename type_pairs subst env ret1 ret2
31903191 | Ttuple tl1 , Ttuple tl2 ->
31913192 eqtype_list rename type_pairs subst env tl1 tl2
31923193 | Tconstr (p1, tl1, _), Tconstr (p2, tl2, _) when Path. same p1 p2
@@ -3396,14 +3397,14 @@ let rec build_subtype env visited loops posi level t =
33963397 (t', Equiv )
33973398 with Not_found -> (t, Unchanged )
33983399 else (t, Unchanged )
3399- | Tarrow (l , t1 , t2 , _ , a ) ->
3400+ | Tarrow (arg , ret , _ , a ) ->
34003401 if memq_warn t visited then (t, Unchanged )
34013402 else
34023403 let visited = t :: visited in
3403- let t1' , c1 = build_subtype env visited loops (not posi) level t1 in
3404- let t2' , c2 = build_subtype env visited loops posi level t2 in
3404+ let t1, c1 = build_subtype env visited loops (not posi) level arg.typ in
3405+ let t2, c2 = build_subtype env visited loops posi level ret in
34053406 let c = max c1 c2 in
3406- if c > Unchanged then (newty (Tarrow (l, t1' , t2' , Cok , a)), c)
3407+ if c > Unchanged then (newty (Tarrow ({arg with typ = t1} , t2, Cok , a)), c)
34073408 else (t, Unchanged )
34083409 | Ttuple tlist ->
34093410 if memq_warn t visited then (t, Unchanged )
@@ -3596,10 +3597,14 @@ let rec subtype_rec env trace t1 t2 cstrs =
35963597 TypePairs. add subtypes (t1, t2) () ;
35973598 match (t1.desc, t2.desc) with
35983599 | Tvar _ , _ | _ , Tvar _ -> (trace, t1, t2, ! univar_pairs, None ) :: cstrs
3599- | Tarrow (l1, t1, u1, _, _), Tarrow (l2, t2, u2, _, _)
3600- when Asttypes.Noloc. same_arg_label l1 l2 ->
3601- let cstrs = subtype_rec env ((t2, t1) :: trace) t2 t1 cstrs in
3602- subtype_rec env ((u1, u2) :: trace) u1 u2 cstrs
3600+ | Tarrow (arg1, ret1, _, _), Tarrow (arg2, ret2, _, _)
3601+ when Asttypes.Noloc. same_arg_label arg1.lbl arg2.lbl ->
3602+ let cstrs =
3603+ subtype_rec env
3604+ ((arg2.typ, arg1.typ) :: trace)
3605+ arg2.typ arg1.typ cstrs
3606+ in
3607+ subtype_rec env ((ret1, ret2) :: trace) ret1 ret2 cstrs
36033608 | Ttuple tl1 , Ttuple tl2 ->
36043609 (* TODO(subtype-errors) Tuple as context *)
36053610 subtype_list env trace tl1 tl2 cstrs
@@ -4074,7 +4079,7 @@ let unalias ty =
40744079(* Return the arity (as for curried functions) of the given type. *)
40754080let rec arity ty =
40764081 match (repr ty).desc with
4077- | Tarrow (_ , _t1 , t2 , _ , _ ) -> 1 + arity t2
4082+ | Tarrow (_ , ret , _ , _ ) -> 1 + arity ret
40784083 | _ -> 0
40794084
40804085(* Check whether an abbreviation expands to itself. *)
@@ -4440,5 +4445,5 @@ let maybe_pointer_type env typ =
44404445
44414446let get_arity env typ =
44424447 match (expand_head env typ).desc with
4443- | Tarrow (_ , _ , _ , _ , arity ) -> arity
4448+ | Tarrow (_ , _ , _ , arity ) -> arity
44444449 | _ -> None
0 commit comments