@@ -7781,7 +7781,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
77817781
77827782 let spreadSrcs, fldsList, tpenv =
77837783 let spreadSrcs, flds, tpenv =
7784- let rec loopFieldsAndSpreads spreadSrcs flds tpenv fieldsAndSpreads =
7784+ let rec loopFieldsAndSpreads spreadSrcs flds i tpenv fieldsAndSpreads =
77857785 let (|LeftwardExplicit|NoLeftwardExplicit|) hasLeftwardExplicit = if hasLeftwardExplicit then LeftwardExplicit else NoLeftwardExplicit
77867786 let LeftwardExplicit = true
77877787 let NoLeftwardExplicit = false
@@ -7792,6 +7792,8 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
77927792 flds
77937793 |> Map.toList
77947794 |> List.collect (fun (_, (_, dupes)) -> dupes)
7795+ |> List.sortBy (fun (i, _) -> i)
7796+ |> List.map (fun (_, field) -> field)
77957797
77967798 List.rev spreadSrcs, flds, tpenv
77977799
@@ -7812,7 +7814,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78127814 flds |> Map.change fieldId.idText (function
78137815 // The first field of this name, explicit or spread.
78147816 | None ->
7815- Some (LeftwardExplicit, [field])
7817+ Some (LeftwardExplicit, [i, field])
78167818
78177819 // Rightward explicit duplicate of leftward explicit field, potentially with intervening spreads.
78187820 //
@@ -7826,7 +7828,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78267828 // Keep both, but error.
78277829 | Some (LeftwardExplicit, dupes) ->
78287830 errorR (Duplicate ("field", fieldId.idText, m))
7829- Some (LeftwardExplicit, field :: dupes)
7831+ Some (LeftwardExplicit, (i, field) :: dupes)
78307832
78317833 // Rightward explicit field shadowing leftward spread field.
78327834 //
@@ -7835,9 +7837,9 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78357837 //
78367838 // Keep right.
78377839 | Some (NoLeftwardExplicit, _dupes) ->
7838- Some (LeftwardExplicit, [field]))
7840+ Some (LeftwardExplicit, [i, field]))
78397841
7840- loopFieldsAndSpreads spreadSrcs flds tpenv fieldsAndSpreads
7842+ loopFieldsAndSpreads spreadSrcs flds (i + 1) tpenv fieldsAndSpreads
78417843
78427844 | SynExprRecordFieldOrSpread.Spread (SynExprSpread (expr = expr; without = _without; range = m), _) :: fieldsAndSpreads ->
78437845 checkLanguageFeatureAndRecover g.langVersion LanguageFeature.RecordSpreads m
@@ -7852,9 +7854,9 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78527854 let wrap, oldAddr, _readonly, _writeonly = mkExprAddrOfExpr g (isStructTy g tyOfSpreadSrcExpr) false NeverMutates spreadSrcExpr None m
78537855 spreadSrcAddrExpr, (fun expr -> wrap (mkCompGenLet m spreadSrcAddrVal oldAddr expr)) :: spreadSrcs
78547856
7855- let rec loopFieldsFromSpread flds fieldsFromSpread =
7857+ let rec loopFieldsFromSpread flds i fieldsFromSpread =
78567858 match fieldsFromSpread with
7857- | [] -> loopFieldsAndSpreads spreadSrcs flds tpenv fieldsAndSpreads
7859+ | [] -> loopFieldsAndSpreads spreadSrcs flds i tpenv fieldsAndSpreads
78587860
78597861 | Item.RecdField fieldInfo :: fieldsFromSpread ->
78607862 let fieldExpr = mkRecdFieldGetViaExprAddr (spreadSrcAddrExpr, fieldInfo.RecdFieldRef, fieldInfo.TypeInst, m)
@@ -7865,7 +7867,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78657867 flds |> Map.change fieldId.idText (function
78667868 // The first field with this name, spread or explicit.
78677869 | None ->
7868- Some (NoLeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7870+ Some (NoLeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
78697871
78707872 // Rightward spread field shadowing leftward explicit field.
78717873 //
@@ -7876,7 +7878,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78767878 | Some (LeftwardExplicit, _dupes) ->
78777879 let fmtedSpreadField = NicePrint.stringOfRecdField env.DisplayEnv cenv.infoReader fieldInfo.TyconRef fieldInfo.RecdField
78787880 warning (Error (FSComp.SR.tcRecordExprSpreadFieldShadowsExplicitField fmtedSpreadField, m))
7879- Some (LeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7881+ Some (LeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
78807882
78817883 // Spread field shadowing spread field.
78827884 //
@@ -7886,9 +7888,9 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78867888 //
78877889 // Keep right.
78887890 | Some (NoLeftwardExplicit, _dupes) ->
7889- Some (NoLeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))]))
7891+ Some (NoLeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))]))
78907892
7891- loopFieldsFromSpread flds fieldsFromSpread
7893+ loopFieldsFromSpread flds (i + 1) fieldsFromSpread
78927894
78937895 | Item.AnonRecdField (anonInfo, tys, fieldIndex, _) :: fieldsFromSpread ->
78947896 let fieldExpr = mkAnonRecdFieldGet g (anonInfo, spreadSrcAddrExpr, tys, fieldIndex, m)
@@ -7899,7 +7901,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
78997901 flds |> Map.change fieldId.idText (function
79007902 // The first field with this name, spread or explicit.
79017903 | None ->
7902- Some (NoLeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7904+ Some (NoLeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
79037905
79047906 // Rightward spread field shadowing leftward explicit field.
79057907 //
@@ -7911,7 +7913,7 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
79117913 let typars = tryAppTy g ty |> ValueOption.map (snd >> List.choose (tryDestTyparTy g >> ValueOption.toOption)) |> ValueOption.defaultValue []
79127914 let fmtedSpreadField = LayoutRender.showL (NicePrint.prettyLayoutOfMemberSig env.DisplayEnv ([], fieldId.idText, typars, [], ty))
79137915 warning (Error (FSComp.SR.tcRecordExprSpreadFieldShadowsExplicitField fmtedSpreadField, m))
7914- Some (LeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
7916+ Some (LeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))])
79157917
79167918 // Spread field shadowing spread field.
79177919 //
@@ -7921,11 +7923,11 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
79217923 //
79227924 // Keep right.
79237925 | Some (NoLeftwardExplicit, _dupes) ->
7924- Some (NoLeftwardExplicit, [ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))]))
7926+ Some (NoLeftwardExplicit, [i, ExplicitOrSpread.Spread (([], fieldId), Some (ty, fieldExpr))]))
79257927
7926- loopFieldsFromSpread flds fieldsFromSpread
7928+ loopFieldsFromSpread flds (i + 1) fieldsFromSpread
79277929
7928- | _ :: fieldsFromSpread -> loopFieldsFromSpread flds fieldsFromSpread
7930+ | _ :: fieldsFromSpread -> loopFieldsFromSpread flds i fieldsFromSpread
79297931
79307932 let recordFieldsFromSpread =
79317933 if isRecdTy g tyOfSpreadSrcExpr then
@@ -7938,13 +7940,13 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, withExprOpt, synRecdFields, m
79387940 |> List.mapi (fun i id -> Item.AnonRecdField (anonInfo, tys, i, id.idRange)))
79397941 |> ValueOption.defaultValue []
79407942
7941- loopFieldsFromSpread flds recordFieldsFromSpread
7943+ loopFieldsFromSpread flds i recordFieldsFromSpread
79427944 else
79437945 if not expr.IsArbExprAndThusAlreadyReportedError then
79447946 errorR (Error (FSComp.SR.tcRecordExprSpreadSourceMustBeRecord (), m))
7945- loopFieldsAndSpreads spreadSrcs flds tpenv fieldsAndSpreads
7947+ loopFieldsAndSpreads spreadSrcs flds i tpenv fieldsAndSpreads
79467948
7947- loopFieldsAndSpreads [] Map.empty tpenv synRecdFields
7949+ loopFieldsAndSpreads [] Map.empty 0 tpenv synRecdFields
79487950
79497951 let flds = if hasOrigExpr then GroupUpdatesToNestedFields flds else flds
79507952 // Check if the overall type is an anon record type and if so raise an copy-update syntax error
0 commit comments