@@ -2575,7 +2575,7 @@ and type_expect_ ~context ?in_function ?(recarg = Rejected) env sexp ty_expected
25752575 (type_record_elem_list loc true env
25762576 (fun e k ->
25772577 k
2578- (type_label_exp ~context: None true env loc ty_record
2578+ (type_label_exp ~call_context: `Regular true env loc ty_record
25792579 (process_optional_label e)))
25802580 opath lid_sexp_list)
25812581 (fun x -> x)
@@ -2685,7 +2685,7 @@ and type_expect_ ~context ?in_function ?(recarg = Rejected) env sexp ty_expected
26852685 (type_record_elem_list loc closed env
26862686 (fun e k ->
26872687 k
2688- (type_label_exp ~context: None true env loc ty_record
2688+ (type_label_exp ~call_context: `Regular true env loc ty_record
26892689 (process_optional_label e)))
26902690 opath lid_sexp_list)
26912691 (fun x -> x)
@@ -2764,7 +2764,7 @@ and type_expect_ ~context ?in_function ?(recarg = Rejected) env sexp ty_expected
27642764 let record, label, opath = type_label_access env srecord lid in
27652765 let ty_record = if opath = None then newvar () else record.exp_type in
27662766 let label_loc, label, newval, _ =
2767- type_label_exp ~context: ( Some SetRecordField ) false env loc ty_record
2767+ type_label_exp ~call_context: ` SetRecordField false env loc ty_record
27682768 (lid, label, snewval, false )
27692769 in
27702770 unify_exp ~context: None env record ty_record;
@@ -3296,7 +3296,8 @@ and type_label_access env srecord lid =
32963296(* Typing format strings for printing or reading.
32973297 These formats are used by functions in modules Printf, Format, and Scanf.
32983298 (Handling of * modifiers contributed by Thorsten Ohl.) *)
3299- and type_label_exp ~context create env loc ty_expected (lid , label , sarg , opt ) =
3299+ and type_label_exp ~(call_context : [`SetRecordField | `Regular] ) create env loc
3300+ ty_expected (lid , label , sarg , opt ) =
33003301 (* Here also ty_expected may be at generic_level *)
33013302 begin_def () ;
33023303 let separate = Env. has_local_constraints env in
@@ -3323,7 +3324,15 @@ and type_label_exp ~context create env loc ty_expected (lid, label, sarg, opt) =
33233324 else raise (Error (lid.loc, env, Private_label (lid.txt, ty_expected)));
33243325 let arg =
33253326 let snap = if vars = [] then None else Some (Btype. snapshot () ) in
3326- let arg = type_argument ~context env sarg ty_arg (instance env ty_arg) in
3327+ let field_name = Longident. last lid.txt in
3328+ let field_context =
3329+ match call_context with
3330+ | `SetRecordField -> Some (Error_message_utils. SetRecordField field_name)
3331+ | `Regular -> Some (Error_message_utils. RecordField field_name)
3332+ in
3333+ let arg =
3334+ type_argument ~context: field_context env sarg ty_arg (instance env ty_arg)
3335+ in
33273336 end_def () ;
33283337 try
33293338 check_univars env (vars <> [] ) " field value" arg label.lbl_arg vars;
@@ -3333,10 +3342,10 @@ and type_label_exp ~context create env loc ty_expected (lid, label, sarg, opt) =
33333342 (* Try to retype without propagating ty_arg, cf PR#4862 *)
33343343 may Btype. backtrack snap;
33353344 begin_def () ;
3336- let arg = type_exp ~context env sarg in
3345+ let arg = type_exp ~context: field_context env sarg in
33373346 end_def () ;
33383347 generalize_expansive env arg.exp_type;
3339- unify_exp ~context env arg ty_arg;
3348+ unify_exp ~context: field_context env arg ty_arg;
33403349 check_univars env false " field value" arg label.lbl_arg vars;
33413350 arg
33423351 with
0 commit comments