@@ -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