@@ -393,6 +393,7 @@ and meet_head_of_kind_value env (head1 : TG.head_of_kind_value)
393
393
let element_kind = meet_array_element_kinds element_kind1 element_kind2 in
394
394
let < * contents, env_extension =
395
395
meet_array_contents env array_contents1 array_contents2
396
+ ~meet_element_kind: element_kind
396
397
in
397
398
let < * length, env_extension' = meet env length1 length2 in
398
399
(* CR-someday vlaviron: If the element kind is Bottom, we could meet the
@@ -410,7 +411,8 @@ and meet_head_of_kind_value env (head1 : TG.head_of_kind_value)
410
411
Bottom
411
412
412
413
and meet_array_contents env (array_contents1 : TG.array_contents Or_unknown.t )
413
- (array_contents2 : TG.array_contents Or_unknown.t ) =
414
+ (array_contents2 : TG.array_contents Or_unknown.t )
415
+ ~(meet_element_kind : _ Or_unknown_or_bottom.t ) =
414
416
meet_unknown
415
417
(fun env (array_contents1 : TG.array_contents )
416
418
(array_contents2 : TG.array_contents ) :
@@ -429,7 +431,20 @@ and meet_array_contents env (array_contents1 : TG.array_contents Or_unknown.t)
429
431
let < * fields_rev, env_extension' =
430
432
fields_rev_and_env_extension
431
433
in
432
- let < * field, env_extension = meet env field1 field2 in
434
+ let < * field, env_extension =
435
+ match meet_element_kind with
436
+ | Bottom -> Bottom
437
+ | Unknown ->
438
+ (* vlaviron: If the meet of the kinds is Unknown, then both
439
+ inputs had Unknown kinds. I don't see how we could end up
440
+ with an array type where the contents are known but we
441
+ don't know the kind, but in that case we wouldn't be able
442
+ to call meet because the two sides may have different
443
+ kinds. So we'll just return the first input, which is
444
+ guaranteed to be a correct approximation of the meet. *)
445
+ Ok (field1, TEE. empty)
446
+ | Ok _ -> meet env field1 field2
447
+ in
433
448
let < + env_extension =
434
449
meet_env_extension env env_extension env_extension'
435
450
in
@@ -1186,7 +1201,10 @@ and join_head_of_kind_value env (head1 : TG.head_of_kind_value)
1186
1201
} ) ->
1187
1202
let alloc_mode = join_alloc_mode alloc_mode1 alloc_mode2 in
1188
1203
let element_kind = join_array_element_kinds element_kind1 element_kind2 in
1189
- let contents = join_array_contents env array_contents1 array_contents2 in
1204
+ let contents =
1205
+ join_array_contents env array_contents1 array_contents2
1206
+ ~joined_element_kind: element_kind
1207
+ in
1190
1208
let > + length = join env length1 length2 in
1191
1209
TG.Head_of_kind_value. create_array_with_contents ~element_kind ~length
1192
1210
contents alloc_mode
@@ -1196,7 +1214,8 @@ and join_head_of_kind_value env (head1 : TG.head_of_kind_value)
1196
1214
Unknown
1197
1215
1198
1216
and join_array_contents env (array_contents1 : TG.array_contents Or_unknown.t )
1199
- (array_contents2 : TG.array_contents Or_unknown.t ) =
1217
+ (array_contents2 : TG.array_contents Or_unknown.t )
1218
+ ~(joined_element_kind : _ Or_unknown_or_bottom.t ) =
1200
1219
join_unknown
1201
1220
(fun env (array_contents1 : TG.array_contents )
1202
1221
(array_contents2 : TG.array_contents ) : TG. array_contents Or_unknown. t ->
@@ -1211,7 +1230,11 @@ and join_array_contents env (array_contents1 : TG.array_contents Or_unknown.t)
1211
1230
List. fold_left2
1212
1231
(fun (fields_rev : _ Or_unknown.t ) field1 field2 : _ Or_unknown. t ->
1213
1232
let > * fields_rev = fields_rev in
1214
- let > + field = join env field1 field2 in
1233
+ let > + field =
1234
+ match joined_element_kind with
1235
+ | Bottom | Unknown -> Or_unknown. Unknown
1236
+ | Ok _ -> join env field1 field2
1237
+ in
1215
1238
field :: fields_rev)
1216
1239
(Or_unknown. Known [] ) fields1 fields2
1217
1240
in
0 commit comments