Improve static compilation of state machines#19297
Conversation
|
Improve reduction of resumable code in state machines Enhance application reduction in state machine lowering for F# computation expressions by tracking let-bound resumable code in the environment and resolving references during reduction. This enables correct handling of optimizer-generated continuations and deeper reduction of nested applications. Also, update test comments to reflect resolved state machine compilation issues.
|
Looks like this now to some point reinvents #14930. I'll try to include some of the relevant repros in tests. Too bad they are scattered across issues and comments. |
|
Another observation: Lack of FS3511 warning does not mean the state machine actually compiled statically. Sometimes the fallback to dynamic implementation gives no warning. |
tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/NestedTaskFailures.fs
Show resolved
Hide resolved
|
I tried to include in tests as many old repros as I could find across the issues. Turns out a lot of those repros already compile statically. If not in sharplab (no idea what version it uses) than with current compiler from main. 3 cases remained that are fixed specifically by this PR: |
|
Is it right to close #12839 with this ? It looks like an umbrella issue for all sorts of problems. I am also thinking if there is a way we could add an end2end test here, e.g. using the library regression testing pipeline? |
As far as I can tell all of them are resolved now, few have been resolved for some time.
I have nothing apart from the few tests I added :) One thing that comes to mind is to disable some of the #nowarn 3511 we have in this repo, or at least make them scoped to the exact place, like using |
|
Removing the nowarns here is good dogfooding 👍 . IcedTasks have 3 of them in tests https://github.com/search?q=repo%3ATheAngryByrd%2FIcedTasks%203511&type=code that appear to be intentionally dynamic (for testing), otherwise I do not see it - all good ( I will just check the regression pipeline outputs if there are any warnings from it) |
|
There's an odd timeout, but there is no information which test hanged. Previously we got this info with |
Pull request was converted to draft
|
It seems to be good apart of the flaky FSharp.Data test. |
Restore files to match main to fix NO-LEFTOVERS and TEST-CODE-QUALITY verifier failures: - TrieMapping.fs: Restore Module+Module merge fix from PR #19280 - Release notes: Restore missing entries from PRs #19297, #19347, #19329 - XunitHelpers.fs: Restore deleted file - XunitSetup.fs: Restore to main version - TestConsole.fs: Restore to main version - CompilerAssert.fs: Restore to main version - FSharp.Test.Utilities.fsproj: Restore XunitHelpers reference Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Type checker: recover on argument/overload checking (#19314) * [main] Update dependencies from dotnet/arcade (#19333) * Update dependencies from https://github.com/dotnet/arcade build 20260219.2 On relative base path root Microsoft.DotNet.Arcade.Sdk From Version 10.0.0-beta.26117.6 -> To Version 10.0.0-beta.26119.2 * Update dependencies from https://github.com/dotnet/arcade build 20260223.2 On relative base path root Microsoft.DotNet.Arcade.Sdk From Version 10.0.0-beta.26117.6 -> To Version 10.0.0-beta.26123.2 --------- Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com> * [main] Source code updates from dotnet/dotnet (#19343) * Backflow from https://github.com/dotnet/dotnet / 854c152 build 302768 [[ commit created by automation ]] * Update dependencies from build 302768 No dependency updates to commit [[ commit created by automation ]] * Backflow from https://github.com/dotnet/dotnet / 51587e2 build 302820 [[ commit created by automation ]] * Update dependencies from build 302820 No dependency updates to commit [[ commit created by automation ]] --------- Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com> Co-authored-by: Tomas Grosup <Tomas.Grosup@gmail.com> * Update image used for insert into VS step (#19357) * Fix :: FAR :: Remove corrupted .ctor symbol reference (#19358) * DotNetBuildUseMonoRuntime stackguard (#19360) * Fsharp.Core :: {Array;List;Set;Array.Parallel} partitionWith (taking Choice<T,U> partitioner) (#19335) * Sort out some outstanding issues after xUnit upgrade (#19363) * Improve collection comparison diagnostics in tests (#19365) Added shouldBeEqualCollections to Assert.fs for detailed collection comparison, including reporting missing/unexpected items and positional differences. Updated Project25 symbol uses test to use this helper and print actual/expected values for easier debugging. * Enhance the compiler to produce a FS0750 error on let! or use! outside a CE (#19347) * Update to latest .NET 10 SDK patch (#19350) * Feature: `#elif` preprocessor directive (#19323) * Support #exit;; as alias to #quit;; in fsi (#19329) * Checker: prevent reporting optional parameter rewritten tree symbols (#19353) * Improve static compilation of state machines (#19297) * Add FSC compiler options tests (#19348) * Update dependencies from https://dev.azure.com/dnceng/internal/_git/dotnet-optimization build 20260226.1 (#19366) On relative base path root optimization.linux-arm64.MIBC.Runtime , optimization.linux-x64.MIBC.Runtime , optimization.windows_nt-arm64.MIBC.Runtime , optimization.windows_nt-x64.MIBC.Runtime , optimization.windows_nt-x86.MIBC.Runtime From Version 1.0.0-prerelease.26117.2 -> To Version 1.0.0-prerelease.26126.1 Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com> * Fix Get-PrBuildIds.ps1 reporting SUCCESS while builds in progress (#19313) * Fix flaky Project25 TP test by replacing FSharp.Data NuGet with TestTP (#19364) (#19373) Replace FSharp.Data (resolved via NuGet at runtime) with the built-in TestTP type provider for the Project25 symbol API tests. This fixes non-deterministic test failures on Linux CI caused by Directory.GetFiles returning DLLs in random inode order on ext4, which varied whether the FSharp.Data namespace was tagged as 'provided' or not. Changes: - Replace 70-line NuGet restore/staging setup with 2-line TestTP reference - Update source to use ErasedWithConstructor.Provided.MyType instead of FSharp.Data.XmlProvider - Replace brittle exact-match symbol list with targeted assertions for provided types, methods, and namespaces - Remove FactSkipOnSignedBuild (TestTP is always available after build) - Rename test variables to match the types being tested Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add automatic merge flow from main to feature/net11-scouting (#19283) * Optimize Set.intersect symmetry and add release notes (#19292) Co-authored-by: Ahmed <w0lf@192.168.1.8> * Fix strong name signature size to align with Roslyn for public signing (#11887) (#19242) * Use culture-independent `IndexOf` in interpolated string parsing (#19370) * Rename "inline hints" to "inlay hints" (#19318) * Rename "inline hints" to "inlay hints" for LSP consistency Aligns F#-owned terminology with LSP and VS Code conventions. The Roslyn ExternalAccess types (IFSharpInlineHintsService, etc.) are left unchanged as they are owned by Roslyn. Fixes #16608 * Add release note for inline-to-inlay hints rename --------- Co-authored-by: Tomas Grosup <Tomas.Grosup@gmail.com> * FCS: capture additional types during analysis (#19305) * remove duplicate FlatErrors file (#19383) * Update dependencies from https://github.com/dotnet/arcade build 20260302.1 (#19379) [main] Update dependencies from dotnet/arcade * [main] Update dependencies from dotnet/msbuild (#19021) * Update dependencies from https://github.com/dotnet/msbuild build 20251021.3 On relative base path root Microsoft.Build , Microsoft.Build.Framework , Microsoft.Build.Tasks.Core , Microsoft.Build.Utilities.Core From Version 18.1.0-preview-25515-01 -> To Version 18.1.0-preview-25521-03 * Update dependencies from https://github.com/dotnet/msbuild build 20251023.2 On relative base path root Microsoft.Build , Microsoft.Build.Framework , Microsoft.Build.Tasks.Core , Microsoft.Build.Utilities.Core From Version 18.1.0-preview-25515-01 -> To Version 18.1.0-preview-25523-02 * Update dependencies from https://github.com/dotnet/msbuild build 20251024.3 On relative base path root Microsoft.Build , Microsoft.Build.Framework , Microsoft.Build.Tasks.Core , Microsoft.Build.Utilities.Core From Version 18.1.0-preview-25515-01 -> To Version 18.1.0-preview-25524-03 * Update dependencies from https://github.com/dotnet/msbuild build 20251027.5 On relative base path root Microsoft.Build , Microsoft.Build.Framework , Microsoft.Build.Tasks.Core , Microsoft.Build.Utilities.Core From Version 18.1.0-preview-25515-01 -> To Version 18.1.0-preview-25527-05 * Update dependencies from https://github.com/dotnet/msbuild build 20251027.6 On relative base path root Microsoft.Build , Microsoft.Build.Framework , Microsoft.Build.Tasks.Core , Microsoft.Build.Utilities.Core From Version 18.1.0-preview-25515-01 -> To Version 18.1.0-preview-25527-06 * Update dependencies from https://github.com/dotnet/msbuild build 20251104.4 On relative base path root Microsoft.Build , Microsoft.Build.Framework , Microsoft.Build.Tasks.Core , Microsoft.Build.Utilities.Core From Version 18.1.0-preview-25515-01 -> To Version 18.1.0-preview-25554-04 * Bump dependency versions in Version.Details.props Updated package versions for several dependencies. --------- Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com> Co-authored-by: Tomas Grosup <Tomas.Grosup@gmail.com> * Add fsharp-release-announcement agent (#19390) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix Seq.empty rendering as "EmptyEnumerable" in serializers (#19317) * Update FileContentMapping.fs (#19391) * Fix flaky help_options test: restore enableConsoleColoring after mutation (#19385) * Initial plan * Fix flaky help_options test by saving/restoring enableConsoleColoring global The `fsc --consolecolors switch` test mutates the global `enableConsoleColoring` via `--consolecolors-`. When help_options tests run after this test, the help output says "(off by default)" instead of "(on by default)", causing baseline mismatches. Fix: save and restore `enableConsoleColoring` around the test. Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com> Co-authored-by: Tomas Grosup <Tomas.Grosup@gmail.com> * isolate checker (#19393) Isolate type-provider tests with dedicated FSharpChecker Introduce Project25.checker to avoid shared state races in type-provider tests. All relevant test cases now use this dedicated instance, improving test isolation, reliability, and determinism without changing test functionality. * Introduce CallRelatedSymbolSink to avoid affect name resolution with related symbols (#19361) * Add RelatedSymbolUseKind flags enum and separate sink for related symbols Address auduchinok's review comments on PR #19252: related symbols (union case testers, copy-and-update record types) are now reported via a separate NotifyRelatedSymbolUse sink instead of abusing NotifyNameResolution. - Add [<Flags>] RelatedSymbolUseKind enum (None/UnionCaseTester/CopyAndUpdateRecord/All) - Add NotifyRelatedSymbolUse to ITypecheckResultsSink interface - Refactor RegisterUnionCaseTesterForProperty to use the new sink - Refactor copy-and-update in TcRecdExpr to use CallRelatedSymbolSink - Add ?relatedSymbolKinds parameter to GetUsesOfSymbolInFile (default: None) - Wire up VS FAR to pass relatedSymbolKinds=All - Write related symbols to ItemKeyStore for background FAR - Update semantic classification tests: tester properties now classified as Property (not UnionCase) since they're no longer in capturedNameResolutions * Add release notes for FSharp.Compiler.Service 11.0.100 --------- Co-authored-by: Eugene Auduchinok <eugene.auduchinok@gmail.com> Co-authored-by: dotnet-maestro[bot] <42748379+dotnet-maestro[bot]@users.noreply.github.com> Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com> Co-authored-by: Tomas Grosup <Tomas.Grosup@gmail.com> Co-authored-by: Adam Boniecki <20281641+abonie@users.noreply.github.com> Co-authored-by: Jakub Majocha <1760221+majocha@users.noreply.github.com> Co-authored-by: Evgeny Tsvetkov <61620612+evgTSV@users.noreply.github.com> Co-authored-by: Youssef Victor <youssefvictor00@gmail.com> Co-authored-by: Bozhidar Batsov <bozhidar@batsov.dev> Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Ahmed Waleed <ahmedwalidahmed.0@gmail.com> Co-authored-by: Ahmed <w0lf@192.168.1.8> Co-authored-by: Brian Rourke Boll <brianrourkeboll@users.noreply.github.com> Co-authored-by: Apoorv Darshan <ad13dtu@gmail.com> Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com>

Fixes #19296, #12839 also includes test cases from #14930.
Also fixes FS3511
The resumable code value(s) 'code' does not have a definition.we have no issue open for it, but it was suppressed in this repo.Brazenly vibecoded, however I think the risk of changes here is under control, given that we have quite a few relevant projects and their tests in the regression matrix.
OK here goes AI summary:
This pull request improves the F# compiler's handling of state machine lowering, especially for cases involving resumable code and control flow constructs like
if __useResumableCode. It fixes issues where inlined helpers or nested resumable code constructs could incorrectly fall back to dynamic branches at runtime, and adds comprehensive test coverage for these scenarios. The main focus is on ensuring that statically-compilable state machines are correctly recognized and optimized, and that code generation remains robust for complex patterns.Key changes include:
Compiler logic improvements:
LowerStateMachines.fsto correctly handle resumable code bindings found inside debug points, ensuring that nested resumable code constructs are properly expanded.if __useResumableCode.Test suite enhancements:
FailingInlinedHelper) and test case to verify that inlined helpers containingif __useResumableCodeare expanded correctly, addressing a real-world bug. [1] [2]Documentation/test comments:
NestedTaskFailures.fstest to reflect that certain state machine failures are now fixed, clarifying the status of known issues.Fixes State machines: low-level resumable code not always expanded correctly, without warning #19296, also includes test cases from Try fix static compilation of state machines #14930