@@ -2928,43 +2928,35 @@ let lookup_ident_module (type a) (load : a load) ~errors ~use ~loc s env =
2928
2928
let lock_mode ~errors ~loc env id vda locks =
2929
2929
let vmode = vda.vda_mode in
2930
2930
List. fold_left
2931
- (fun vmode lock ->
2931
+ (fun ( vmode , must_box ) lock ->
2932
2932
match lock with
2933
- | Region_lock -> Value_mode. local_to_regional vmode
2933
+ | Region_lock -> Value_mode. local_to_regional vmode, must_box
2934
2934
| Lock {mode; escaping_context} ->
2935
2935
begin
2936
2936
match Value_mode. submode vmode (Value_mode. of_alloc mode) with
2937
- | Ok () -> vmode
2937
+ | Ok () -> vmode, must_box
2938
2938
| Error _ ->
2939
2939
may_lookup_error errors loc env
2940
2940
(Local_value_used_in_closure (id, escaping_context))
2941
2941
end
2942
2942
| Exclave_lock ->
2943
2943
begin
2944
2944
match Value_mode. submode vmode Value_mode. regional with
2945
- | Ok () -> Value_mode. regional_to_local vmode
2945
+ | Ok () -> Value_mode. regional_to_local vmode, must_box
2946
2946
| Error _ ->
2947
2947
may_lookup_error errors loc env
2948
2948
(Local_value_used_in_exclave id);
2949
2949
end
2950
- | Unboxed_lock ->
2951
- let vd = Subst.Lazy. force_value_description vda.vda_description in
2952
- match ! constrain_type_layout env vd.val_type
2953
- (Layout. (value ~why: Captured_in_object ))
2954
- with
2955
- | Ok () -> vmode
2956
- | Result. Error err ->
2957
- may_lookup_error errors loc env
2958
- (Non_value_used_in_object (id, vd.val_type, err))
2950
+ | Unboxed_lock -> vmode, true
2959
2951
)
2960
- vmode locks
2952
+ ( vmode, false ) locks
2961
2953
2962
2954
let lookup_ident_value ~errors ~use ~loc name env =
2963
2955
match IdTbl. find_name_and_modes wrap_value ~mark: use name env.values with
2964
2956
| (path , locks , Val_bound vda ) ->
2965
- let mode = lock_mode ~errors ~loc env (Lident name) vda locks in
2957
+ let mode, must_box = lock_mode ~errors ~loc env (Lident name) vda locks in
2966
2958
use_value ~use ~loc path vda;
2967
- path, vda.vda_description, mode
2959
+ path, vda.vda_description, mode, must_box
2968
2960
| (_ , _ , Val_unbound reason ) ->
2969
2961
report_value_unbound ~errors ~loc env reason (Lident name)
2970
2962
| exception Not_found ->
@@ -3244,7 +3236,7 @@ let lookup_value_lazy ~errors ~use ~loc lid env =
3244
3236
| Ldot (l , s ) ->
3245
3237
let path, desc = lookup_dot_value ~errors ~use ~loc l s env in
3246
3238
let mode = Value_mode. global in
3247
- path, desc, mode
3239
+ path, desc, mode, false
3248
3240
| Lapply _ -> assert false
3249
3241
3250
3242
let lookup_type_full ~errors ~use ~loc lid env =
@@ -3335,7 +3327,7 @@ let find_module_by_name lid env =
3335
3327
3336
3328
let find_value_by_name lid env =
3337
3329
let loc = Location. (in_file ! input_name) in
3338
- let path, desc, _ = lookup_value_lazy ~errors: false ~use: false ~loc lid env in
3330
+ let path, desc, _, _ = lookup_value_lazy ~errors: false ~use: false ~loc lid env in
3339
3331
path, Subst.Lazy. force_value_description desc
3340
3332
3341
3333
let find_type_by_name lid env =
@@ -3372,8 +3364,19 @@ let lookup_module ?(use=true) ~loc lid env =
3372
3364
3373
3365
let lookup_value ?(use =true ) ~loc lid env =
3374
3366
check_value_name (Longident. last lid) loc;
3375
- let path, desc, mode = lookup_value_lazy ~errors: true ~use ~loc lid env in
3376
- path, Subst.Lazy. force_value_description desc, mode
3367
+ let path, desc, mode, must_box =
3368
+ lookup_value_lazy ~errors: true ~use ~loc lid env
3369
+ in
3370
+ let vd = Subst.Lazy. force_value_description desc in
3371
+ if must_box then begin
3372
+ match ! constrain_type_layout env vd.val_type
3373
+ (Layout. (value ~why: Captured_in_object ))
3374
+ with
3375
+ | Ok () -> ()
3376
+ | Result. Error err ->
3377
+ lookup_error loc env (Non_value_used_in_object (lid, vd.val_type, err))
3378
+ end ;
3379
+ path, vd, mode
3377
3380
3378
3381
let lookup_type ?(use =true ) ~loc lid env =
3379
3382
lookup_type ~errors: true ~use ~loc lid env
0 commit comments