@@ -72,33 +72,43 @@ module Make (Index : Product_intf.Index) = struct
72
72
let all_right = ref true in
73
73
let env_extension = ref (TEE. empty () ) in
74
74
let components_by_index =
75
- Index.Map. union (fun _index ty1 ty2 ->
76
- match Type_grammar. meet env ty1 ty2 with
77
- | Ok (meet_result , env_extension' ) ->
78
- begin match TEE. meet env ! env_extension env_extension' with
75
+ Index.Map. merge (fun _index ty1_opt ty2_opt ->
76
+ match ty1_opt, ty2_opt with
77
+ | None , None -> assert false
78
+ | Some ty1 , None ->
79
+ all_right := false ;
80
+ Some ty1
81
+ | None , Some ty2 ->
82
+ all_left := false ;
83
+ Some ty2
84
+ | Some ty1 , Some ty2 ->
85
+ begin match Type_grammar. meet env ty1 ty2 with
86
+ | Ok (meet_result , env_extension' ) ->
87
+ begin match TEE. meet env ! env_extension env_extension' with
88
+ | Bottom ->
89
+ any_bottom := true ;
90
+ Some (Type_grammar. bottom_like ty1)
91
+ | Ok extension ->
92
+ env_extension := extension;
93
+ begin match meet_result with
94
+ | Left_input ->
95
+ all_right := false ;
96
+ Some ty1
97
+ | Right_input ->
98
+ all_left := false ;
99
+ Some ty2
100
+ | Both_inputs ->
101
+ Some ty1
102
+ | New_result ty ->
103
+ all_left := false ;
104
+ all_right := false ;
105
+ Some ty
106
+ end
107
+ end
79
108
| Bottom ->
80
109
any_bottom := true ;
81
110
Some (Type_grammar. bottom_like ty1)
82
- | Ok extension ->
83
- env_extension := extension;
84
- begin match meet_result with
85
- | Left_input ->
86
- all_right := false ;
87
- Some ty1
88
- | Right_input ->
89
- all_left := false ;
90
- Some ty2
91
- | Both_inputs ->
92
- Some ty1
93
- | New_result ty ->
94
- all_left := false ;
95
- all_right := false ;
96
- Some ty
97
- end
98
- end
99
- | Bottom ->
100
- any_bottom := true ;
101
- Some (Type_grammar. bottom_like ty1))
111
+ end )
102
112
components_by_index1
103
113
components_by_index2
104
114
in
@@ -247,7 +257,12 @@ module Int_indexed = struct
247
257
in
248
258
match get_opt fields1, get_opt fields2 with
249
259
| None , None -> assert false
250
- | Some t , None | None , Some t -> t
260
+ | Some t , None ->
261
+ all_right := false ;
262
+ t
263
+ | None , Some t ->
264
+ all_left := false ;
265
+ t
251
266
| Some ty1 , Some ty2 ->
252
267
begin match Type_grammar. meet env ty1 ty2 with
253
268
| Ok (meet_result , env_extension' ) ->
0 commit comments