@@ -216,7 +216,7 @@ let instantiate_macro_type (lev : level) (qtfbl : quantifiability) (pmacty : pol
216
216
| BlockMacroType (pmacparamtys ) -> BlockMacroType (pmacparamtys |> List. map aux)
217
217
218
218
219
- let lift_poly_general (intern_ty : FreeID.t -> BoundID.t option ) (intern_row : FreeRowID.t -> LabelSet.t -> BoundRowID.t option ) (must_be_bound : MustBeBoundID.t -> bool ) (ty : mono_type ) : poly_type_body =
219
+ let lift_poly_general (intern_ty : FreeID.t -> BoundID.t option ) (intern_row : FreeRowID.t -> LabelSet.t -> BoundRowID.t option ) (must_be_bound : MustBeBoundID.t -> bool ) (must_be_bound_row : MustBeBoundRowID.t -> bool ) ( ty : mono_type ) : poly_type_body =
220
220
let rec iter ((rng , tymain ) : mono_type ) =
221
221
match tymain with
222
222
| TypeVariable (tv ) ->
@@ -248,9 +248,9 @@ let lift_poly_general (intern_ty : FreeID.t -> BoundID.t option) (intern_row : F
248
248
(rng, TypeVariable (ptvi))
249
249
end
250
250
251
- | FuncType (optrow , tydom , tycod ) -> (rng, FuncType (generalize_row LabelSet. empty optrow, iter tydom, iter tycod))
251
+ | FuncType (optrow , tydom , tycod ) -> (rng, FuncType (iter_row LabelSet. empty optrow, iter tydom, iter tycod))
252
252
| ProductType (tys ) -> (rng, ProductType (TupleList. map iter tys))
253
- | RecordType (row ) -> (rng, RecordType (generalize_row LabelSet. empty row))
253
+ | RecordType (row ) -> (rng, RecordType (iter_row LabelSet. empty row))
254
254
| DataType (tyargs , tyid ) -> (rng, DataType (List. map iter tyargs, tyid))
255
255
| ListType (tysub ) -> (rng, ListType (iter tysub))
256
256
| RefType (tysub ) -> (rng, RefType (iter tysub))
@@ -260,13 +260,13 @@ let lift_poly_general (intern_ty : FreeID.t -> BoundID.t option) (intern_row : F
260
260
| MathCommandType (tys ) -> (rng, MathCommandType (List. map (lift_argument_type iter) tys))
261
261
| CodeType (tysub ) -> (rng, CodeType (iter tysub))
262
262
263
- and generalize_row (labset : LabelSet.t ) = function
263
+ and iter_row (labset : LabelSet.t ) = function
264
264
| RowEmpty ->
265
265
RowEmpty
266
266
267
267
| RowCons (rlabel , ty , tail ) ->
268
268
let (_, label) = rlabel in
269
- RowCons (rlabel, iter ty, generalize_row (labset |> LabelSet. add label) tail)
269
+ RowCons (rlabel, iter ty, iter_row (labset |> LabelSet. add label) tail)
270
270
271
271
| RowVar (UpdatableRow(orviref ) as rv0 ) ->
272
272
begin
@@ -282,12 +282,19 @@ let lift_poly_general (intern_ty : FreeID.t -> BoundID.t option) (intern_row : F
282
282
end
283
283
284
284
| MonoRowLink (row ) ->
285
- generalize_row labset row
285
+ iter_row labset row
286
286
end
287
287
288
- | RowVar (MustBeBoundRow(mbbrid )) ->
289
- let brid = MustBeBoundRowID. to_bound_id mbbrid in
290
- RowVar (PolyRowBound (brid))
288
+ | RowVar (MustBeBoundRow(mbbrid ) as rv0 ) ->
289
+ let prvi =
290
+ if must_be_bound_row mbbrid then
291
+ let brid = MustBeBoundRowID. to_bound_id mbbrid in
292
+ PolyRowBound (brid)
293
+ else
294
+ PolyRowFree (rv0)
295
+ in
296
+ RowVar (prvi)
297
+
291
298
in
292
299
iter ty
293
300
@@ -332,14 +339,16 @@ let generalize (lev : level) (ty : mono_type) : poly_type =
332
339
let intern_ty = make_type_generalization_intern lev tvid_ht in
333
340
let intern_row = make_row_generalization_intern lev rvid_ht in
334
341
let must_be_bound (mbbid : MustBeBoundID.t ) = Level. less_than lev (MustBeBoundID. get_level mbbid) in
335
- Poly (lift_poly_general intern_ty intern_row must_be_bound ty)
342
+ let must_be_bound_row (mbbrid : MustBeBoundRowID.t ) = Level. less_than lev (MustBeBoundRowID. get_level mbbrid) in
343
+ Poly (lift_poly_general intern_ty intern_row must_be_bound must_be_bound_row ty)
336
344
337
345
338
346
let lift_poly_body =
339
347
lift_poly_general
340
348
(fun _ -> None )
341
349
(fun _ _ -> None )
342
350
(fun _ -> false )
351
+ (fun _ -> false )
343
352
344
353
345
354
let lift_poly (ty : mono_type ) : poly_type =
@@ -352,9 +361,13 @@ let generalize_macro_type (macty : mono_macro_type) : poly_macro_type =
352
361
let intern_ty = make_type_generalization_intern Level. bottom tvid_ht in
353
362
let intern_row = make_row_generalization_intern Level. bottom rvid_ht in
354
363
let must_be_bound (mbbid : MustBeBoundID.t ) = Level. less_than Level. bottom (MustBeBoundID. get_level mbbid) in
364
+ let must_be_bound_row (mbbrid : MustBeBoundRowID.t ) = Level. less_than Level. bottom (MustBeBoundRowID. get_level mbbrid) in
355
365
let aux = function
356
- | LateMacroParameter (ty ) -> LateMacroParameter (lift_poly_general intern_ty intern_row must_be_bound ty)
357
- | EarlyMacroParameter (ty ) -> EarlyMacroParameter (lift_poly_general intern_ty intern_row must_be_bound ty)
366
+ | LateMacroParameter (ty ) ->
367
+ LateMacroParameter (lift_poly_general intern_ty intern_row must_be_bound must_be_bound_row ty)
368
+
369
+ | EarlyMacroParameter (ty ) ->
370
+ EarlyMacroParameter (lift_poly_general intern_ty intern_row must_be_bound must_be_bound_row ty)
358
371
in
359
372
match macty with
360
373
| InlineMacroType (macparamtys ) -> InlineMacroType (macparamtys |> List. map aux)
0 commit comments