Skip to content

Commit f3d5fc2

Browse files
authored
flambda-backend: Add Jkind.sort to Tpat_array (#1971)
* add Jkind.sort to Tpat_array * fix chamelon * update cr comment * print sort * move case to minimize merge conflict * ocaml 5 minus fix * add assert
1 parent 06b27e8 commit f3d5fc2

13 files changed

+60
-54
lines changed

lambda/matching.ml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ end = struct
317317
| `Record (fields, closed) ->
318318
let alpha_field env (lid, l, p) = (lid, l, alpha_pat env p) in
319319
`Record (List.map (alpha_field env) fields, closed)
320-
| `Array (am, ps) -> `Array (am, List.map (alpha_pat env) ps)
320+
| `Array (am, arg_sort, ps) -> `Array (am, arg_sort, List.map (alpha_pat env) ps)
321321
| `Lazy p -> `Lazy (alpha_pat env p)
322322
in
323323
{ p with pat_desc }
@@ -468,7 +468,7 @@ let matcher discr (p : Simple.pattern) rem =
468468
| Variant _, (Constant _ | Construct _ | Lazy | Array _ | Record _ | Tuple _)
469469
->
470470
no ()
471-
| Array (am1, n1), Array (am2, n2) -> yesif (am1 = am2 && n1 = n2)
471+
| Array (am1, _, n1), Array (am2, _, n2) -> yesif (am1 = am2 && n1 = n2)
472472
| Array _, (Constant _ | Construct _ | Variant _ | Lazy | Record _ | Tuple _)
473473
->
474474
no ()
@@ -2322,19 +2322,19 @@ let divide_record all_labels ~scopes head ctx pm =
23222322
(* Matching against an array pattern *)
23232323

23242324
let get_key_array = function
2325-
| { pat_desc = Tpat_array (_, patl) } -> List.length patl
2325+
| { pat_desc = Tpat_array (_, _, patl) } -> List.length patl
23262326
| _ -> assert false
23272327

23282328
let get_pat_args_array p rem =
23292329
match p with
2330-
| { pat_desc = Tpat_array (_, patl) } -> patl @ rem
2330+
| { pat_desc = Tpat_array (_, _, patl) } -> patl @ rem
23312331
| _ -> assert false
23322332

23332333
let get_expr_args_array ~scopes kind head (arg, _mut, _sort, _layout) rem =
2334-
let am, len =
2334+
let am, arg_sort, len =
23352335
let open Patterns.Head in
23362336
match head.pat_desc with
2337-
| Array (am, len) -> am, len
2337+
| Array (am, arg_sort, len) -> am, arg_sort, len
23382338
| _ -> assert false
23392339
in
23402340
let loc = head_loc ~scopes head in
@@ -2353,7 +2353,7 @@ let get_expr_args_array ~scopes kind head (arg, _mut, _sort, _layout) rem =
23532353
(match am with
23542354
| Mutable -> StrictOpt
23552355
| Immutable -> Alias),
2356-
Jkind.Sort.for_array_get_result,
2356+
arg_sort,
23572357
result_layout)
23582358
:: make_args (pos + 1)
23592359
in

typing/parmatch.ml

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ let all_coherent column =
143143
| Tuple l1, Tuple l2 -> l1 = l2
144144
| Record (lbl1 :: _), Record (lbl2 :: _) ->
145145
Array.length lbl1.lbl_all = Array.length lbl2.lbl_all
146-
| Array (am1, _), Array (am2, _) -> am1 = am2
146+
| Array (am1, _, _), Array (am2, _, _) -> am1 = am2
147147
| Any, _
148148
| _, Any
149149
| Record [], Record []
@@ -302,7 +302,7 @@ module Compat
302302
| Tpat_record (l1,_),Tpat_record (l2,_) ->
303303
let ps,qs = records_args l1 l2 in
304304
compats ps qs
305-
| Tpat_array (am1, ps), Tpat_array (am2, qs) ->
305+
| Tpat_array (am1, _, ps), Tpat_array (am2, _, qs) ->
306306
am1 = am2 &&
307307
List.length ps = List.length qs &&
308308
compats ps qs
@@ -365,7 +365,7 @@ let simple_match d h =
365365
| Lazy, Lazy -> true
366366
| Record _, Record _ -> true
367367
| Tuple len1, Tuple len2 -> len1 = len2
368-
| Array (am1, len1), Array (am2, len2) -> am1 = am2 && len1 = len2
368+
| Array (am1, _, len1), Array (am2, _, len2) -> am1 = am2 && len1 = len2
369369
| _, Any -> true
370370
| _, _ -> false
371371

@@ -405,7 +405,7 @@ let simple_match_args discr head args =
405405
| Variant { has_arg = true }
406406
| Lazy -> [Patterns.omega]
407407
| Record lbls -> omega_list lbls
408-
| Array (_, len)
408+
| Array (_, _, len)
409409
| Tuple len -> Patterns.omegas len
410410
| Variant { has_arg = false }
411411
| Any
@@ -529,10 +529,10 @@ let do_set_args ~erase_mutable q r = match q with
529529
make_pat (Tpat_lazy arg) q.pat_type q.pat_env::rest
530530
| _ -> fatal_error "Parmatch.do_set_args (lazy)"
531531
end
532-
| {pat_desc = Tpat_array (am, omegas)} ->
532+
| {pat_desc = Tpat_array (am, arg_sort, omegas)} ->
533533
let args,rest = read_args omegas r in
534534
make_pat
535-
(Tpat_array (am, args)) q.pat_type q.pat_env::
535+
(Tpat_array (am, arg_sort, args)) q.pat_type q.pat_env::
536536
rest
537537
| {pat_desc=Tpat_constant _|Tpat_any} ->
538538
q::r (* case any is used in matching.ml *)
@@ -1044,17 +1044,17 @@ let build_other ext env =
10441044
| _ -> assert false)
10451045
(function f -> Tpat_constant(Const_float (string_of_float f)))
10461046
0.0 (fun f -> f +. 1.0) d env
1047-
| Array (am, _) ->
1047+
| Array (am, arg_sort, _) ->
10481048
let all_lengths =
10491049
List.map
10501050
(fun (p,_) -> match p.pat_desc with
1051-
| Array (am', len) when am = am' -> len
1051+
| Array (am', _, len) when am = am' -> len
10521052
| _ -> assert false)
10531053
env in
10541054
let rec try_arrays l =
10551055
if List.mem l all_lengths then try_arrays (l+1)
10561056
else
1057-
make_pat (Tpat_array (am, omegas l))
1057+
make_pat (Tpat_array (am, arg_sort, omegas l))
10581058
d.pat_type d.pat_env in
10591059
try_arrays 0
10601060
| _ -> Patterns.omega
@@ -1064,7 +1064,7 @@ let rec has_instance p = match p.pat_desc with
10641064
| Tpat_any | Tpat_var _ | Tpat_constant _ | Tpat_variant (_,None,_) -> true
10651065
| Tpat_alias (p,_,_,_,_) | Tpat_variant (_,Some p,_) -> has_instance p
10661066
| Tpat_or (p1,p2,_) -> has_instance p1 || has_instance p2
1067-
| Tpat_construct (_,_,ps, _) | Tpat_tuple ps | Tpat_array (_, ps) ->
1067+
| Tpat_construct (_,_,ps, _) | Tpat_tuple ps | Tpat_array (_, _, ps) ->
10681068
has_instances ps
10691069
| Tpat_record (lps,_) -> has_instances (List.map (fun (_,_,x) -> x) lps)
10701070
| Tpat_lazy p
@@ -1712,7 +1712,7 @@ let rec le_pat p q =
17121712
| Tpat_record (l1,_), Tpat_record (l2,_) ->
17131713
let ps,qs = records_args l1 l2 in
17141714
le_pats ps qs
1715-
| Tpat_array(am1, ps), Tpat_array(am2, qs) ->
1715+
| Tpat_array(am1, _, ps), Tpat_array(am2, _, qs) ->
17161716
am1 = am2 && List.length ps = List.length qs && le_pats ps qs
17171717
(* In all other cases, enumeration is performed *)
17181718
| _,_ -> not (satisfiable [[p]] [q])
@@ -1766,10 +1766,10 @@ let rec lub p q = match p.pat_desc,q.pat_desc with
17661766
let rs = record_lubs l1 l2 in
17671767
make_pat (Tpat_record (rs, closed))
17681768
p.pat_type p.pat_env
1769-
| Tpat_array (am1, ps), Tpat_array (am2, qs)
1769+
| Tpat_array (am1, arg_sort, ps), Tpat_array (am2, _, qs)
17701770
when am1 = am2 && List.length ps = List.length qs ->
17711771
let rs = lubs ps qs in
1772-
make_pat (Tpat_array (am1, rs))
1772+
make_pat (Tpat_array (am1, arg_sort, rs))
17731773
p.pat_type p.pat_env
17741774
| _,_ ->
17751775
raise Empty
@@ -1939,7 +1939,7 @@ let rec collect_paths_from_pat r p = match p.pat_desc with
19391939
(if extendable_path path then add_path path r else r)
19401940
ps
19411941
| Tpat_any|Tpat_var _|Tpat_constant _| Tpat_variant (_,None,_) -> r
1942-
| Tpat_tuple ps | Tpat_array (_, ps)
1942+
| Tpat_tuple ps | Tpat_array (_, _, ps)
19431943
| Tpat_construct (_, {cstr_tag=Extension _}, ps, _)->
19441944
List.fold_left collect_paths_from_pat r ps
19451945
| Tpat_record (lps,_) ->
@@ -2067,7 +2067,7 @@ let inactive ~partial pat =
20672067
| Total -> begin
20682068
let rec loop pat =
20692069
match pat.pat_desc with
2070-
| Tpat_lazy _ | Tpat_array (Mutable, _) ->
2070+
| Tpat_lazy _ | Tpat_array (Mutable, _, _) ->
20712071
false
20722072
| Tpat_any | Tpat_var _ | Tpat_variant (_, None, _) ->
20732073
true
@@ -2078,7 +2078,7 @@ let inactive ~partial pat =
20782078
| Const_int32 _ | Const_int64 _ | Const_nativeint _ -> true
20792079
end
20802080
| Tpat_tuple ps | Tpat_construct (_, _, ps, _)
2081-
| Tpat_array (Immutable, ps) ->
2081+
| Tpat_array (Immutable, _, ps) ->
20822082
List.for_all (fun p -> loop p) ps
20832083
| Tpat_alias (p,_,_,_,_) | Tpat_variant (_, Some p, _) ->
20842084
loop p

typing/patterns.ml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ module Simple = struct
5858
| `Variant of label * pattern option * row_desc ref
5959
| `Record of
6060
(Longident.t loc * label_description * pattern) list * closed_flag
61-
| `Array of mutable_flag * pattern list
61+
| `Array of mutable_flag * Jkind.sort * pattern list
6262
| `Lazy of pattern
6363
]
6464

@@ -101,7 +101,7 @@ module General = struct
101101
`Variant (cstr, arg, row_desc)
102102
| Tpat_record (fields, closed) ->
103103
`Record (fields, closed)
104-
| Tpat_array (am,ps) -> `Array (am, ps)
104+
| Tpat_array (am, arg_sort, ps) -> `Array (am, arg_sort, ps)
105105
| Tpat_or (p, q, row_desc) -> `Or (p, q, row_desc)
106106
| Tpat_lazy p -> `Lazy p
107107

@@ -120,7 +120,7 @@ module General = struct
120120
Tpat_variant (cstr, arg, row_desc)
121121
| `Record (fields, closed) ->
122122
Tpat_record (fields, closed)
123-
| `Array (am, ps) -> Tpat_array (am, ps)
123+
| `Array (am, arg_sort, ps) -> Tpat_array (am, arg_sort, ps)
124124
| `Or (p, q, row_desc) -> Tpat_or (p, q, row_desc)
125125
| `Lazy p -> Tpat_lazy p
126126

@@ -147,7 +147,7 @@ module Head : sig
147147
{ tag: label; has_arg: bool;
148148
cstr_row: row_desc ref;
149149
type_row : unit -> row_desc; }
150-
| Array of mutable_flag * int
150+
| Array of mutable_flag * Jkind.sort * int
151151
| Lazy
152152

153153
type t = desc pattern_data
@@ -174,7 +174,7 @@ end = struct
174174
type_row : unit -> row_desc; }
175175
(* the row of the type may evolve if [close_variant] is called,
176176
hence the (unit -> ...) delay *)
177-
| Array of mutable_flag * int
177+
| Array of mutable_flag * Jkind.sort * int
178178
| Lazy
179179

180180
type t = desc pattern_data
@@ -199,8 +199,8 @@ end = struct
199199
| _ -> assert false
200200
in
201201
Variant {tag; has_arg; cstr_row; type_row}, pats
202-
| `Array (am, args) ->
203-
Array (am, List.length args), args
202+
| `Array (am, arg_sort, args) ->
203+
Array (am, arg_sort, List.length args), args
204204
| `Record (largs, _) ->
205205
let lbls = List.map (fun (_,lbl,_) -> lbl) largs in
206206
let pats = List.map (fun (_,_,pat) -> pat) largs in
@@ -216,7 +216,7 @@ end = struct
216216
| Any -> 0
217217
| Constant _ -> 0
218218
| Construct c -> c.cstr_arity
219-
| Tuple n | Array (_, n) -> n
219+
| Tuple n | Array (_, _, n) -> n
220220
| Record l -> List.length l
221221
| Variant { has_arg; _ } -> if has_arg then 1 else 0
222222
| Lazy -> 1
@@ -229,7 +229,7 @@ end = struct
229229
| Lazy -> Tpat_lazy omega
230230
| Constant c -> Tpat_constant c
231231
| Tuple n -> Tpat_tuple (omegas n)
232-
| Array (am, n) -> Tpat_array (am, omegas n)
232+
| Array (am, arg_sort, n) -> Tpat_array (am, arg_sort, omegas n)
233233
| Construct c ->
234234
let lid_loc = mkloc (Longident.Lident c.cstr_name) in
235235
Tpat_construct (lid_loc, c, omegas c.cstr_arity, None)

typing/patterns.mli

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ module Simple : sig
4646
| `Variant of label * pattern option * row_desc ref
4747
| `Record of
4848
(Longident.t loc * label_description * pattern) list * closed_flag
49-
| `Array of mutable_flag * pattern list
49+
| `Array of mutable_flag * Jkind.sort * pattern list
5050
| `Lazy of pattern
5151
]
5252
type pattern = view pattern_data
@@ -89,7 +89,7 @@ module Head : sig
8989
type_row : unit -> row_desc; }
9090
(* the row of the type may evolve if [close_variant] is called,
9191
hence the (unit -> ...) delay *)
92-
| Array of mutable_flag * int
92+
| Array of mutable_flag * Jkind.sort * int
9393
| Lazy
9494

9595
type t = desc pattern_data

typing/printpat.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ let rec pretty_val : type k . _ -> k general_pattern -> _ = fun ppf v ->
9494
fprintf ppf "@[{%a%t}@]"
9595
pretty_lvals filtered_lvs elision_mark
9696
end
97-
| Tpat_array (am, vs) ->
97+
| Tpat_array (am, _arg_sort, vs) ->
9898
let punct = match am with
9999
| Mutable -> '|'
100100
| Immutable -> ':'

typing/printtyped.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,9 @@ and pattern : type k . _ -> _ -> k general_pattern -> unit = fun i ppf x ->
290290
| Tpat_record (l, _c) ->
291291
line i ppf "Tpat_record\n";
292292
list i longident_x_pattern ppf l;
293-
| Tpat_array (am, l) ->
293+
| Tpat_array (am, arg_sort, l) ->
294294
line i ppf "Tpat_array %a\n" fmt_mutable_flag am;
295+
line i ppf "%a\n" Jkind.Sort.format arg_sort;
295296
list i pattern ppf l;
296297
| Tpat_lazy p ->
297298
line i ppf "Tpat_lazy\n";

typing/tast_iterator.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ let pat
250250
| Tpat_variant (_, po, _) -> Option.iter (sub.pat sub) po
251251
| Tpat_record (l, _) ->
252252
List.iter (fun (lid, _, i) -> iter_loc sub lid; sub.pat sub i) l
253-
| Tpat_array (_, l) -> List.iter (sub.pat sub) l
253+
| Tpat_array (_, _, l) -> List.iter (sub.pat sub) l
254254
| Tpat_alias (p, _, s, _, _) -> sub.pat sub p; iter_loc sub s
255255
| Tpat_lazy p -> sub.pat sub p
256256
| Tpat_value p -> sub.pat sub (p :> pattern)

typing/tast_mapper.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ let pat
307307
Tpat_variant (l, Option.map (sub.pat sub) po, rd)
308308
| Tpat_record (l, closed) ->
309309
Tpat_record (List.map (tuple3 (map_loc sub) id (sub.pat sub)) l, closed)
310-
| Tpat_array (am, l) -> Tpat_array (am, List.map (sub.pat sub) l)
310+
| Tpat_array (am, arg_sort, l) -> Tpat_array (am, arg_sort, List.map (sub.pat sub) l)
311311
| Tpat_alias (p, id, s, uid, m) ->
312312
Tpat_alias (sub.pat sub p, id, map_loc sub s, uid, m)
313313
| Tpat_lazy p -> Tpat_lazy (sub.pat sub p)

typing/typecore.ml

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,12 +1485,16 @@ let solve_Ppat_array ~refine loc env mutability expected_ty =
14851485
| Immutable -> Predef.type_iarray
14861486
| Mutable -> Predef.type_array
14871487
in
1488-
(* CR layouts v4: in the future we'll have arrays of other jkinds *)
1489-
let ty_elt = newgenvar (Jkind.value ~why:Array_element) in
1488+
(* CR layouts v4: The code below is written this way to make it easier to update
1489+
when we generalize array to contain non-value jkinds. When that happens,
1490+
change the next two lines to use [Jkind.of_new_sort_var]. *)
1491+
let jkind = Jkind.value ~why:Array_element in
1492+
let arg_sort = Jkind.sort_of_jkind jkind in
1493+
let ty_elt = newgenvar jkind in
14901494
let expected_ty = generic_instance expected_ty in
14911495
unify_pat_types ~refine
14921496
loc env (type_some_array ty_elt) expected_ty;
1493-
ty_elt
1497+
ty_elt, arg_sort
14941498

14951499
let solve_Ppat_lazy ~refine loc env expected_ty =
14961500
let nv = newgenvar (Jkind.value ~why:Lazy_expression) in
@@ -2279,15 +2283,15 @@ and type_pat_aux
22792283
keep them in sync, at the cost of a worse diff with upstream; it
22802284
shouldn't be too bad. We can inline this when we upstream this code and
22812285
combine the two array pattern constructors. *)
2282-
let ty_elt = solve_Ppat_array ~refine loc env mutability expected_ty in
2286+
let ty_elt, arg_sort = solve_Ppat_array ~refine loc env mutability expected_ty in
22832287
let alloc_mode =
22842288
match mutability with
22852289
| Mutable -> simple_pat_mode Value.legacy
22862290
| Immutable -> alloc_mode
22872291
in
22882292
let pl = List.map (fun p -> type_pat ~alloc_mode tps Value p ty_elt) spl in
22892293
rvp {
2290-
pat_desc = Tpat_array (mutability, pl);
2294+
pat_desc = Tpat_array (mutability, arg_sort, pl);
22912295
pat_loc = loc; pat_extra=[];
22922296
pat_type = instance expected_ty;
22932297
pat_attributes;
@@ -3061,10 +3065,11 @@ let rec check_counter_example_pat
30613065
in
30623066
map_fold_cont type_label_pat fields
30633067
(fun fields -> mkp k (Tpat_record (fields, closed)))
3064-
| Tpat_array (mut, tpl) ->
3065-
let ty_elt = solve_Ppat_array ~refine loc env mut expected_ty in
3068+
| Tpat_array (mut, original_arg_sort, tpl) ->
3069+
let ty_elt, arg_sort = solve_Ppat_array ~refine loc env mut expected_ty in
3070+
assert (Jkind.Sort.equate original_arg_sort arg_sort);
30663071
map_fold_cont (fun p -> check_rec p ty_elt) tpl
3067-
(fun pl -> mkp k (Tpat_array (mut, pl)))
3072+
(fun pl -> mkp k (Tpat_array (mut, arg_sort, pl)))
30683073
| Tpat_or(tp1, tp2, _) ->
30693074
(* We are in counter-example mode, but try to avoid backtracking *)
30703075
let must_split =

typing/typedtree.ml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ and 'k pattern_desc =
7979
closed_flag ->
8080
value pattern_desc
8181
| Tpat_array :
82-
mutable_flag * value general_pattern list -> value pattern_desc
82+
mutable_flag * Jkind.sort * value general_pattern list -> value pattern_desc
8383
| Tpat_lazy : value general_pattern -> value pattern_desc
8484
(* computation patterns *)
8585
| Tpat_value : tpat_value_argument -> computation pattern_desc
@@ -782,7 +782,7 @@ let shallow_iter_pattern_desc
782782
| Tpat_variant(_, pat, _) -> Option.iter f.f pat
783783
| Tpat_record (lbl_pat_list, _) ->
784784
List.iter (fun (_, _, pat) -> f.f pat) lbl_pat_list
785-
| Tpat_array (_, patl) -> List.iter f.f patl
785+
| Tpat_array (_, _, patl) -> List.iter f.f patl
786786
| Tpat_lazy p -> f.f p
787787
| Tpat_any
788788
| Tpat_var _
@@ -804,8 +804,8 @@ let shallow_map_pattern_desc
804804
Tpat_record (List.map (fun (lid, l,p) -> lid, l, f.f p) lpats, closed)
805805
| Tpat_construct (lid, c, pats, ty) ->
806806
Tpat_construct (lid, c, List.map f.f pats, ty)
807-
| Tpat_array (am, pats) ->
808-
Tpat_array (am, List.map f.f pats)
807+
| Tpat_array (am, arg_sort, pats) ->
808+
Tpat_array (am, arg_sort, List.map f.f pats)
809809
| Tpat_lazy p1 -> Tpat_lazy (f.f p1)
810810
| Tpat_variant (x1, Some p1, x2) ->
811811
Tpat_variant (x1, Some (f.f p1), x2)
@@ -914,7 +914,7 @@ let iter_pattern_full ~both_sides_of_or f sort pat =
914914
| Tpat_tuple patl -> List.iter (loop f Jkind.Sort.value) patl
915915
(* CR layouts v5: tuple case to change when we allow non-values in
916916
tuples *)
917-
| Tpat_array (_, patl) -> List.iter (loop f Jkind.Sort.value) patl
917+
| Tpat_array (_, arg_sort, patl) -> List.iter (loop f arg_sort) patl
918918
| Tpat_lazy p | Tpat_exception p -> loop f Jkind.Sort.value p
919919
(* Cases without variables: *)
920920
| Tpat_any | Tpat_constant _ -> ()

0 commit comments

Comments
 (0)