@@ -2571,7 +2571,7 @@ and type_expect_ ~context ?in_function ?(recarg = Rejected) env sexp ty_expected
25712571 (type_label_a_list loc true env
25722572 (fun e k ->
25732573 k
2574- (type_label_exp ~context: None true env loc ty_record
2574+ (type_label_exp ~call_context: `Regular true env loc ty_record
25752575 (process_optional_label e)))
25762576 opath lid_sexp_list)
25772577 (fun x -> x)
@@ -2681,7 +2681,7 @@ and type_expect_ ~context ?in_function ?(recarg = Rejected) env sexp ty_expected
26812681 (type_label_a_list loc closed env
26822682 (fun e k ->
26832683 k
2684- (type_label_exp ~context: None true env loc ty_record
2684+ (type_label_exp ~call_context: `Regular true env loc ty_record
26852685 (process_optional_label e)))
26862686 opath lid_sexp_list)
26872687 (fun x -> x)
@@ -2760,7 +2760,7 @@ and type_expect_ ~context ?in_function ?(recarg = Rejected) env sexp ty_expected
27602760 let record, label, opath = type_label_access env srecord lid in
27612761 let ty_record = if opath = None then newvar () else record.exp_type in
27622762 let label_loc, label, newval, _ =
2763- type_label_exp ~context: ( Some SetRecordField ) false env loc ty_record
2763+ type_label_exp ~call_context: ` SetRecordField false env loc ty_record
27642764 (lid, label, snewval, false )
27652765 in
27662766 unify_exp ~context: None env record ty_record;
@@ -3292,7 +3292,8 @@ and type_label_access env srecord lid =
32923292(* Typing format strings for printing or reading.
32933293 These formats are used by functions in modules Printf, Format, and Scanf.
32943294 (Handling of * modifiers contributed by Thorsten Ohl.) *)
3295- and type_label_exp ~context create env loc ty_expected (lid , label , sarg , opt ) =
3295+ and type_label_exp ~(call_context : [`SetRecordField | `Regular] ) create env loc
3296+ ty_expected (lid , label , sarg , opt ) =
32963297 (* Here also ty_expected may be at generic_level *)
32973298 begin_def () ;
32983299 let separate = Env. has_local_constraints env in
@@ -3319,7 +3320,15 @@ and type_label_exp ~context create env loc ty_expected (lid, label, sarg, opt) =
33193320 else raise (Error (lid.loc, env, Private_label (lid.txt, ty_expected)));
33203321 let arg =
33213322 let snap = if vars = [] then None else Some (Btype. snapshot () ) in
3322- let arg = type_argument ~context env sarg ty_arg (instance env ty_arg) in
3323+ let field_name = Longident. last lid.txt in
3324+ let field_context =
3325+ match call_context with
3326+ | `SetRecordField -> Some (Error_message_utils. SetRecordField field_name)
3327+ | `Regular -> Some (Error_message_utils. RecordField field_name)
3328+ in
3329+ let arg =
3330+ type_argument ~context: field_context env sarg ty_arg (instance env ty_arg)
3331+ in
33233332 end_def () ;
33243333 try
33253334 check_univars env (vars <> [] ) " field value" arg label.lbl_arg vars;
@@ -3329,10 +3338,10 @@ and type_label_exp ~context create env loc ty_expected (lid, label, sarg, opt) =
33293338 (* Try to retype without propagating ty_arg, cf PR#4862 *)
33303339 may Btype. backtrack snap;
33313340 begin_def () ;
3332- let arg = type_exp ~context env sarg in
3341+ let arg = type_exp ~context: field_context env sarg in
33333342 end_def () ;
33343343 generalize_expansive env arg.exp_type;
3335- unify_exp ~context env arg ty_arg;
3344+ unify_exp ~context: field_context env arg ty_arg;
33363345 check_univars env false " field value" arg label.lbl_arg vars;
33373346 arg
33383347 with
0 commit comments