Skip to content

Commit 9bc13b3

Browse files
authored
Debug: rework conditional erasure, fix stepping over literals (#19897)
1 parent aa00b17 commit 9bc13b3

98 files changed

Lines changed: 1697 additions & 264 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/release-notes/.FSharp.Compiler.Service/11.0.100.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
* FCS: add FSharpCheckFileResults.HasErrors ([PR #19892](https://github.com/dotnet/fsharp/pull/19892))
9393
* Add `#version;;` directive to F# Interactive to display version and environment information. ([Issue #13307](https://github.com/dotnet/fsharp/issues/13307), [PR #19332](https://github.com/dotnet/fsharp/pull/19332))
9494
* Debug: rework for expressions stepping ([PR #19894](https://github.com/dotnet/fsharp/pull/19894))
95+
* Debug: rework conditional erasure, fix stepping over literals ([PR #19897](https://github.com/dotnet/fsharp/pull/19897))
9596

9697
### Changed
9798

src/Compiler/Checking/CheckIncrementalClasses.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@ let MakeCtorForIncrClassConstructionPhase2C(
802802
// Extend the range of any immediate debug point to include the 'do'
803803
let doExpr =
804804
match doExpr with
805-
| Expr.DebugPoint(_, innerExpr) -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes mFull, innerExpr)
805+
| Expr.DebugPoint(_, innerExpr) -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFull), innerExpr)
806806
| e -> e
807807
let binder = (fun e -> mkSequential mFull doExpr e)
808808
let isPriorToSuperInit = false
@@ -940,7 +940,7 @@ let MakeCtorForIncrClassConstructionPhase2C(
940940
// Add the debug point
941941
let inheritsExpr =
942942
if inheritsIsVisible then
943-
Expr.DebugPoint(DebugPointAtLeafExpr.Yes inheritsExpr.Range, inheritsExpr)
943+
Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, inheritsExpr.Range), inheritsExpr)
944944
else
945945
inheritsExpr
946946

src/Compiler/Checking/Expressions/CheckComputationExpressions.fs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ let inline arbKeySelectors m =
8181
// Flag that a debug point should get emitted prior to both the evaluation of 'rhsExpr' and the call to Using
8282
let inline addBindDebugPoint spBind e =
8383
match spBind with
84-
| DebugPointAtBinding.Yes m -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, e)
84+
| DebugPointAtBinding.Yes m -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), false, e)
8585
| _ -> e
8686

8787
let inline mkSynDelay2 (e: SynExpr) = mkSynDelay (e.Range.MakeSynthetic()) e
@@ -1345,7 +1345,7 @@ let rec TryTranslateComputationExpression
13451345

13461346
let forCall =
13471347
match spFor with
1348-
| DebugPointAtFor.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFor, false, forCall)
1348+
| DebugPointAtFor.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFor), false, forCall)
13491349
| DebugPointAtFor.No -> forCall
13501350

13511351
translatedCtxt forCall)
@@ -1389,7 +1389,7 @@ let rec TryTranslateComputationExpression
13891389
// 'while' is hit just before each time the guard is called
13901390
let guardExpr =
13911391
match spWhile with
1392-
| DebugPointAtWhile.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mWhile, false, guardExpr)
1392+
| DebugPointAtWhile.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mWhile), false, guardExpr)
13931393
| DebugPointAtWhile.No -> guardExpr
13941394

13951395
Some(
@@ -1419,7 +1419,7 @@ let rec TryTranslateComputationExpression
14191419
// 'while!' is hit just before each time the guard is called
14201420
let guardExpr =
14211421
match spWhile with
1422-
| DebugPointAtWhile.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mWhile, false, guardExpr)
1422+
| DebugPointAtWhile.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mWhile), false, guardExpr)
14231423
| DebugPointAtWhile.No -> guardExpr
14241424

14251425
let rewrittenWhileExpr =
@@ -1557,7 +1557,7 @@ let rec TryTranslateComputationExpression
15571557
// Put down a debug point for the 'finally'
15581558
let unwindExpr2 =
15591559
match spFinally with
1560-
| DebugPointAtFinally.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFinally, true, unwindExpr)
1560+
| DebugPointAtFinally.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFinally), true, unwindExpr)
15611561
| DebugPointAtFinally.No -> unwindExpr
15621562

15631563
if ceenv.isQuery then
@@ -1571,7 +1571,7 @@ let rec TryTranslateComputationExpression
15711571

15721572
let innerExpr =
15731573
match spTry with
1574-
| DebugPointAtTry.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mTry, true, innerExpr)
1574+
| DebugPointAtTry.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mTry), true, innerExpr)
15751575
| _ -> innerExpr
15761576

15771577
Some(
@@ -2308,7 +2308,7 @@ let rec TryTranslateComputationExpression
23082308

23092309
let innerExpr =
23102310
match spTry with
2311-
| DebugPointAtTry.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mTry, true, innerExpr)
2311+
| DebugPointAtTry.Yes _ -> SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mTry), true, innerExpr)
23122312
| _ -> innerExpr
23132313

23142314
let callExpr =
@@ -2345,7 +2345,7 @@ let rec TryTranslateComputationExpression
23452345
if IsControlFlowExpression synYieldExpr then
23462346
yieldFromCall
23472347
else
2348-
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFull, false, yieldFromCall)
2348+
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFull), false, yieldFromCall)
23492349

23502350
Some(translatedCtxt yieldFromCall)
23512351

@@ -2374,7 +2374,7 @@ let rec TryTranslateComputationExpression
23742374
if IsControlFlowExpression synReturnExpr then
23752375
returnFromCall
23762376
else
2377-
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFull, false, returnFromCall)
2377+
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFull), false, returnFromCall)
23782378

23792379
Some(translatedCtxt returnFromCall)
23802380

@@ -2393,7 +2393,7 @@ let rec TryTranslateComputationExpression
23932393
if IsControlFlowExpression synYieldOrReturnExpr then
23942394
yieldOrReturnCall
23952395
else
2396-
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes mFull, false, yieldOrReturnCall)
2396+
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFull), false, yieldOrReturnCall)
23972397

23982398
Some(translatedCtxt yieldOrReturnCall)
23992399

@@ -2704,7 +2704,9 @@ and TranslateComputationExpressionBind
27042704
and convertSimpleReturnToExpr (ceenv: ComputationExpressionContext<'a>) comp varSpace innerComp =
27052705
match innerComp with
27062706
| SynExpr.YieldOrReturn((false, _), returnExpr, m, _) ->
2707-
let returnExpr = SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, false, returnExpr)
2707+
let returnExpr =
2708+
SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), false, returnExpr)
2709+
27082710
Some(returnExpr, None)
27092711

27102712
| SynExpr.Match(spMatch, expr, clauses, m, trivia) ->

src/Compiler/Checking/Expressions/CheckExpressions.fs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3103,7 +3103,7 @@ let BuildPossiblyConditionalMethodCall (cenv: cenv) env isMutable m isProp minfo
31033103
if shouldEraseCall then
31043104
// Methods marked with 'Conditional' must return 'unit'
31053105
UnifyTypes cenv env m g.unit_ty (minfo.GetFSharpReturnType(cenv.amap, m, minst))
3106-
mkUnit g m, g.unit_ty
3106+
Expr.DebugPoint(DebugPointAtLeafExpr.Yes(isHidden = true, range = m), mkUnit g m), g.unit_ty
31073107
else
31083108
#if !NO_TYPEPROVIDERS
31093109
match minfo with
@@ -5903,6 +5903,7 @@ and TcNonControlFlowExpr (env: TcEnv) f =
59035903
let res2 =
59045904
match res with
59055905
| IfThenElseExpr _ -> res
5906+
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes(isHidden = true), _) -> res
59065907
| _ -> mkDebugPoint res.Range res
59075908
res2, tpenv
59085909
else

src/Compiler/CodeGen/IlxGen.fs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3174,8 +3174,8 @@ and GenExprAux (cenv: cenv) (cgbuf: CodeGenBuffer) eenv expr (sequel: sequel) =
31743174
| LinearOpExpr _
31753175
| Expr.Match _ -> GenLinearExpr cenv cgbuf eenv expr sequel false id |> ignore<FakeUnit>
31763176

3177-
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, innerExpr) ->
3178-
if Range.equals m range0 then
3177+
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes(isHidden, m), innerExpr) ->
3178+
if isHidden then
31793179
cgbuf.EmitStartOfHiddenCode()
31803180
else
31813181
CG.EmitDebugPoint cgbuf m
@@ -3739,8 +3739,8 @@ and GenLinearExpr cenv cgbuf eenv expr sequel preSteps (contf: FakeUnit -> FakeU
37393739
GenSequel cenv eenv.cloc cgbuf sequelAfterJoin
37403740
Fake))
37413741

3742-
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, innerExpr) ->
3743-
if Range.equals m range0 then
3742+
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes(isHidden, m), innerExpr) ->
3743+
if isHidden then
37443744
cgbuf.EmitStartOfHiddenCode()
37453745
else
37463746
CG.EmitDebugPoint cgbuf m
@@ -10659,10 +10659,21 @@ and CodeGenInitMethod cenv (cgbuf: CodeGenBuffer) eenv tref (codeGenInitFunc: Co
1065910659
let _, body =
1066010660
CodeGenMethod cenv cgbuf.mgbuf ([], eenv.staticInitializationName, eenv, 0, None, codeGenInitFunc, m)
1066110661

10662-
if CheckCodeDoesSomething body.Code then
10662+
let codeDoesSomething = CheckCodeDoesSomething body.Code
10663+
10664+
// Keep the init method if it carries a visible debug point, so steppable bindings like 'let i = ()' survive.
10665+
let hasVisibleDebugPoint =
10666+
not cenv.options.localOptimizationsEnabled
10667+
&& body.Code.Instrs
10668+
|> Array.exists (function
10669+
| I_seqpoint sp -> sp.Line <> FeeFee cenv
10670+
| _ -> false)
10671+
10672+
if codeDoesSomething || hasVisibleDebugPoint then
1066310673
// We are here because the module we just grabbed has an interesting static initializer
1066410674
let feefee, seqpt =
10665-
if body.Code.Instrs.Length > 0 then
10675+
// Without real init code, the .cctor's FeeFee marker would just add a stray hidden sequence point.
10676+
if codeDoesSomething && body.Code.Instrs.Length > 0 then
1066610677
match body.Code.Instrs[0] with
1066710678
| I_seqpoint sp as i -> [ FeeFeeInstr cenv sp.Document ], [ i ]
1066810679
| _ -> [], []

src/Compiler/Optimize/LowerComputedCollections.fs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ let LowerComputedListOrArraySeqExpr tcVal g amap m collectorTy overallSeqExpr =
114114
let cleanupE = BuildDisposableCleanup tcVal g infoReader m enumv
115115

116116
// A debug point should get emitted prior to both the evaluation of 'inp' and the call to GetEnumerator
117-
let addForDebugPoint e = Expr.DebugPoint(DebugPointAtLeafExpr.Yes mFor, e)
117+
let addForDebugPoint e = Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFor), e)
118118

119119
let spInAsWhile = match spIn with DebugPointAtInOrTo.Yes m -> DebugPointAtWhile.Yes m | DebugPointAtInOrTo.No -> DebugPointAtWhile.No
120120

@@ -289,7 +289,7 @@ module List =
289289
match body with
290290
| Expr.Let(TBind(v, rhs, DebugPointAtBinding.Yes spBind), innerBody, m, flags) ->
291291
let bodyForAdd = Expr.Let(TBind(v, rhs, DebugPointAtBinding.NoneAtInvisible), innerBody, m, flags)
292-
Expr.DebugPoint(DebugPointAtLeafExpr.Yes spBind, mkCallCollectorAdd tcVal g reader mBody collector bodyForAdd)
292+
Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, spBind), mkCallCollectorAdd tcVal g reader mBody collector bodyForAdd)
293293
| _ ->
294294
mkCallCollectorAdd tcVal g reader mIn collector body
295295

@@ -342,7 +342,7 @@ module List =
342342
match body with
343343
| Some (loopVal, body) ->
344344
mkInvisibleLet m loopVal loopVar
345-
(Expr.DebugPoint (DebugPointAtLeafExpr.Yes mFor, mkCallCollectorAdd tcVal g reader mBody collector body))
345+
(Expr.DebugPoint (DebugPointAtLeafExpr.Yes(false, mFor), mkCallCollectorAdd tcVal g reader mBody collector body))
346346
| None ->
347347
mkCallCollectorAdd tcVal g reader mBody collector loopVar)
348348

@@ -447,7 +447,7 @@ module Array =
447447
)
448448

449449
// Add a debug point at the `for`, before anything gets evaluated.
450-
Expr.DebugPoint (DebugPointAtLeafExpr.Yes mFor, mapping)
450+
Expr.DebugPoint (DebugPointAtLeafExpr.Yes(false, mFor), mapping)
451451
)
452452

453453
/// Whether to check for overflow when converting a value to a native int.
@@ -508,7 +508,7 @@ module Array =
508508

509509
match body with
510510
| Some (loopVal, body) ->
511-
mkInvisibleLet mBody loopVal loopVar (Expr.DebugPoint (DebugPointAtLeafExpr.Yes mFor, mkStore body))
511+
mkInvisibleLet mBody loopVal loopVar (Expr.DebugPoint (DebugPointAtLeafExpr.Yes(false, mFor), mkStore body))
512512
| None ->
513513
mkStore loopVar)
514514

src/Compiler/Optimize/LowerSequences.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ let ConvertSequenceExprToObject g amap overallExpr =
118118
let (TBind(v, e, sp)) = bind
119119
let addDebugPoint e =
120120
match sp with
121-
| DebugPointAtBinding.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, e)
121+
| DebugPointAtBinding.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), e)
122122
| _ -> e
123123
let vref = mkLocalValRef v
124124
{ resBody with
@@ -262,7 +262,7 @@ let ConvertSequenceExprToObject g amap overallExpr =
262262
// body ]]
263263

264264
// A debug point should get emitted prior to both the evaluation of 'inp' and the call to GetEnumerator
265-
let addForDebugPoint e = Expr.DebugPoint(DebugPointAtLeafExpr.Yes mFor, e)
265+
let addForDebugPoint e = Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, mFor), e)
266266

267267
// The 'in' debug point is put back into the TypedTree at the right place for SeqWhile
268268
let mIn = match spIn with DebugPointAtInOrTo.Yes m -> m.NoteSourceConstruct(NotedSourceConstruct.While) | DebugPointAtInOrTo.No -> mIn
@@ -293,11 +293,11 @@ let ConvertSequenceExprToObject g amap overallExpr =
293293
let asyncVars = unionFreeVars res1.asyncVars (freeInExpr CollectLocals compensation)
294294
let addTryDebugPoint e =
295295
match spTry with
296-
| DebugPointAtTry.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, e)
296+
| DebugPointAtTry.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), e)
297297
| _ -> e
298298
let addFinallyDebugPoint e =
299299
match spFinally with
300-
| DebugPointAtFinally.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, e)
300+
| DebugPointAtFinally.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), e)
301301
| _ -> e
302302
Some { phase2 = (fun (pcVar, _currv, _, pcMap as ctxt) ->
303303
let generate1, dispose1, checkDispose1 = res1.phase2 ctxt

src/Compiler/Optimize/LowerStateMachines.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ let RepresentBindingAsStateVar g (bind: Binding) (resBody: StateMachineConversio
7676
let (TBind(v, e, sp)) = bind
7777
let addDebugPoint innerExpr =
7878
match sp with
79-
| DebugPointAtBinding.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, innerExpr)
79+
| DebugPointAtBinding.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), innerExpr)
8080
| _ -> innerExpr
8181
let vref = mkLocalValRef v
8282
{ resBody with

src/Compiler/Optimize/Optimizer.fs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -383,9 +383,6 @@ type OptimizationSettings =
383383
/// This optimization is off by default, given tiny overhead of including try/with. See https://github.com/dotnet/fsharp/pull/376
384384
member _.EliminateTryWithAndTryFinally = false
385385

386-
/// Determines if we should eliminate first part of sequential expression if it has no effect
387-
member x.EliminateSequential = x.LocalOptimizationsEnabled
388-
389386
/// Determines if we should determine branches in pattern matching based on known information, e.g.
390387
/// eliminate a "if true then .. else ... "
391388
member x.EliminateSwitch = x.LocalOptimizationsEnabled
@@ -2896,12 +2893,8 @@ and OptimizeLinearExpr cenv env expr contf =
28962893

28972894
OptimizeLinearExpr cenv env e2 (contf << (fun (e2R, e2info) ->
28982895
if (flag = NormalSeq) &&
2899-
// Drop bare (compiler-generated) units always; keep a debug-pointed unit in debug code so
2900-
// it stays steppable (a unit without one must go, else a dangling breakpoint - FSharp 1.0 bug 6034).
2901-
(cenv.settings.EliminateSequential ||
2902-
(match e1R with
2903-
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes _, _) -> false
2904-
| _ -> match stripDebugPoints e1R with Expr.Const (Const.Unit, _, _) -> true | _ -> false)) &&
2896+
(cenv.settings.LocalOptimizationsEnabled ||
2897+
(match e1R with | Expr.DebugPoint(DebugPointAtLeafExpr.Yes(isHidden, _), _) -> isHidden | _ -> false)) &&
29052898
not e1info.HasEffect then
29062899
e2R, e2info
29072900
else
@@ -2964,9 +2957,11 @@ and OptimizeLinearExpr cenv env expr contf =
29642957
OptimizeLinearExpr cenv env argLast (contf << (fun (argLastR, argLastInfo) ->
29652958
OptimizeExprOpReductionsAfter cenv env (op, tyargs, argsHeadR @ [argLastR], argsHeadInfosR @ [argLastInfo], m)))
29662959

2967-
| Expr.DebugPoint (m, innerExpr) when not (IsDebugPipeRightExpr cenv innerExpr)->
2960+
| Expr.DebugPoint (m, innerExpr) when not (IsDebugPipeRightExpr cenv innerExpr)->
29682961
OptimizeLinearExpr cenv env innerExpr (contf << (fun (innerExprR, einfo) ->
2969-
Expr.DebugPoint (m, innerExprR), einfo))
2962+
match m with
2963+
| DebugPointAtLeafExpr.Yes(isHidden = true) when not einfo.HasEffect -> innerExprR, einfo
2964+
| _ -> Expr.DebugPoint (m, innerExprR), einfo))
29702965

29712966
| _ -> contf (OptimizeExpr cenv env expr)
29722967

@@ -2988,7 +2983,7 @@ and OptimizeTryFinally cenv env (spTry, spFinally, e1, e2, m, ty) =
29882983
if cenv.settings.EliminateTryWithAndTryFinally && not e1info.HasEffect then
29892984
let e1R2 =
29902985
match spTry with
2991-
| DebugPointAtTry.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes m, e1R)
2986+
| DebugPointAtTry.Yes m -> Expr.DebugPoint(DebugPointAtLeafExpr.Yes(false, m), e1R)
29922987
| DebugPointAtTry.No -> e1R
29932988
Expr.Sequential (e1R2, e2R, ThenDoSeq, m), info
29942989
else
@@ -4242,7 +4237,14 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) =
42424237
if vref.ShouldInline && IsPartialExprVal einfo.Info then
42434238
errorR(InternalError("the inline value '"+vref.LogicalName+"' was not inferred to have a known value", vref.Range))
42444239

4245-
let env = BindInternalLocalVal cenv vref (mkValInfo einfo vref) env
4240+
let env = BindInternalLocalVal cenv vref (mkValInfo einfo vref) env
4241+
4242+
// The hidden debug point on the r.h.s. is dropped above, so suppress the binding's debug point too.
4243+
let spBind =
4244+
match expr with
4245+
| Expr.DebugPoint(DebugPointAtLeafExpr.Yes(isHidden = true), _) when not einfo.HasEffect -> DebugPointAtBinding.NoneAtLet
4246+
| _ -> spBind
4247+
42464248
(TBind(vref, exprOptimized, spBind), einfo), env
42474249
with RecoverableException exn ->
42484250
errorRecovery exn vref.Range

src/Compiler/Service/FSharpParseFileResults.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
568568
| SynInterpolatedStringPart.FillExpr(fillExpr, _) -> yield fillExpr
569569
]
570570

571-
| SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes m, isControlFlow, innerExpr) ->
571+
| SynExpr.DebugPoint(DebugPointAtLeafExpr.Yes(_, m), isControlFlow, innerExpr) ->
572572
yield! checkRange m
573573
yield! walkExpr isControlFlow innerExpr
574574

0 commit comments

Comments
 (0)