Skip to content

Fickl performance experiments - #20

Draft
shayanhabibi wants to merge 965 commits into
ncave:service_slimfrom
shayanhabibi:fickle_slim
Draft

shayanhabibi wants to merge 965 commits into
ncave:service_slimfrom
shayanhabibi:fickle_slim

Conversation

@shayanhabibi

@shayanhabibi shayanhabibi commented Oct 22, 2026 •

Copy link
Copy Markdown

Staging full tree for cherrypicking

See fable-compiler/Fable#5135

T-Gro and others added 30 commits September 1, 2026 17:06
…net#20371)

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Backflow from https://github.com/dotnet/dotnet / cbd5b21 build 329883

Diff: https://github.com/dotnet/dotnet/compare/9eb4f66561b6ba5176554da7437f9cdd6c83637b..cbd5b21057d077735a6a251869377ead82797993

From: dotnet/dotnet@9eb4f66
To: dotnet/dotnet@cbd5b21

[[ commit created by automation ]]

* Update dependencies from build 329883
No dependency updates to commit
[[ commit created by automation ]]

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
* Remove all trailing whitespaces

Strips trailing whitespace from F# sources under tests/, vsintegration/tests,
buildtools/ and docs/fcs-samples.

Trailing whitespace is preserved wherever it is semantically significant:
lines whose end falls inside a multi-line string literal (STRING_TEXT) or
inside an inactive `#if` region are left untouched. Those lines were
classified with FSharp.Compiler.Tokenization.FSharpSourceTokenizer rather
than a regex, because many tests embed expected IL / expected compiler
output in triple-quoted strings where trailing spaces are part of the
baseline being compared -- stripping those was what broke CI previously.

Verified with the F# tokenizer: the string-literal token stream is
byte-identical before and after for every file touched.

src/ and vsintegration/src are split out into a separate PR so that each
stays under the 3000-file limit enforced by the release-notes check.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Add the whitespace-removal commit to .git-blame-ignore-revs

Note: dotnet/fsharp squash-merges PRs, so this SHA points at the branch
commit and will need rewriting to the squashed commit SHA afterwards --
the same caveat the file's own header documents for the existing entries.
The companion src-only PR's SHA should be added in that same follow-up.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Restore significant trailing whitespace in three SyntaxTree fixtures

These files are parse-tree fixtures whose `.bsl` baselines assert exact
column ranges, so the trailing space is part of what is being parsed:

* `Unfinished escaped ident 01.fs` - the space sits inside an unterminated
  escaped identifier, which the lexer consumes to end of line.
* `SynTypeFunHasRangeOfArrow.fs` - inside a line comment, whose range is
  printed via `ParsedInputTrivia.CodeComments`.
* `RegressionOptionType.fs` - on the final, newline-less line.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…et#20353)

MethInfo.GetParamAttribs rebuilt the full per-parameter attribute list
(custom-attr decoding, well-known-attr probes, OptionalArgInfo) from IL
metadata on every call and was never cached. On an overload-heavy compile
it was called 2.17M times against only 137 distinct underlying methods.

Memoize the decode with the existing MemoizationTable, held per compilation
via WeakMap.getOrCreate keyed on the ImportMap. The key is the method's
physical ILMethodDef plus extension-member use (the C#-style extension view
drops the object argument from ParamMetadata, so the two views must not share
an entry); canMemoize restricts caching to monomorphic declaring types (an
optional arg's default can otherwise depend on the instantiation), matching
InfoReader's monomorphic-only caches.

Add a regression test covering an IL extension method used with both instance
and static call syntax, which shares one ILMethodDef across both views.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…#20384)

FoldHierarchyOfTypeAux runs on a hot path (InfoReader member/property/field
lookup and type inference). Its inner 'let rec loop' was handed to
List.foldBack / Option.foldBack / List.exists as a partial application, so a
fresh closure was allocated on every traversal.

Add a ListInline module (illib.fs) with exists / foldBack whose function
argument is inlined at the call site via InlineIfLambda, so the closure never
materializes. foldBack folds lists up to length five directly (no allocation)
and only copies to an array for longer lists, so it stays stack-safe. Length
five is measured: over a real compile GetImmediateInterfacesOfType returns
<=5 elements ~96% of the time (81% are empty), so short interface lists
allocate nothing at all.

At the call sites the top-level 'typeEquiv g ty' stays partially applied (the
optimizer fuses it after inlining), but the local 'loop' is passed as a lambda
so InlineIfLambda inlines it rather than allocating it as a closure.

Fold order is unchanged, so visit order, dedup and the ndeep>100 error are
preserved; compiler output is byte-identical under --deterministic+.

Co-authored-by: perf-bundle <perf@local>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
Copilot-Session: c6610fae-a96e-4421-a920-e73de4fc94dc
…otnet#20427)

Flatten the permanently-enabled LanguageFeature.OverloadsForCustomOperations:
delete the DU case, features-map entry, GetFeatureString arm and FSComp string,
regenerate xlf, and collapse every enforcement gate to its always-on path.
Drops the now-dead customOperationMethodsIndexedByMethodName field and its
overload-rejection branch.

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…20429)

The ExtendedFixedBindings feature shipped in F# 8.0, the minimum accepted
--langversion, so its flag can never be disabled and is dead configuration.
Remove the LanguageFeature case, its feature-map entry, GetFeatureString arm,
and FSComp resource string, and collapse both guarded paths in
TcAndBuildFixedExpr to their always-on behaviour. Regenerated xlf files.

Fixes dotnet#20194

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Collapse ArithmeticInLiterals enforcement site

Remove the always-true suppressLangFeatureCheck threading and checkFeature helper from EvalAttribArgExpr, and delete the now-unused SuppressLanguageFeatureCheck type.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Remove the ArithmeticInLiterals language feature flag and its resources

The feature shipped in F# 8.0 and the minimum selectable --langversion is now
8.0, so the flag is permanently enabled dead configuration (dotnet#20176).
Delete the LanguageFeature DU case, its features-map entry and GetFeatureString
arm, the featureArithmeticInLiterals resource string, and regenerate the xlf
translation files.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…0904.5 (dotnet#20472)

On relative base path root
Microsoft.Build , Microsoft.Build.Framework , Microsoft.Build.Tasks.Core , Microsoft.Build.Utilities.Core From Version 18.12.0-1.26428.4 -> To Version 18.12.0-1.26454.5

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
…otnet-optimization build 20260901.1 (dotnet#20471)

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.26420.2 -> To Version 1.0.0-prerelease.26451.1

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Strips trailing whitespace from F# sources under src/ and vsintegration/src,
plus eng/Build.ps1.

Trailing whitespace is preserved wherever it is semantically significant:
lines whose end falls inside a multi-line string literal (STRING_TEXT) or
inside an inactive `#if` region are left untouched. Those lines were
classified with FSharp.Compiler.Tokenization.FSharpSourceTokenizer rather
than a regex.

Verified with the F# tokenizer: the string-literal token stream is
byte-identical before and after for every file touched.

Split out of dotnet#20355 so that each PR stays under the 3000-file limit
enforced by the release-notes check.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* Fix final do! computation expression desugaring

* Add pull request link to release note

* Update coroutine tail-call test
…eck (dotnet#20413)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 9480ae5d-00f1-443f-868c-0edfe4929836
* Update dependencies from https://github.com/dotnet/arcade build 20260830.1
On relative base path root
Microsoft.DotNet.Arcade.Sdk From Version 11.0.0-beta.26421.2 -> To Version 11.0.0-beta.26430.1

* Update tests for .NET 11 breaking changes (saturating narrow conversions, decimal rounding, new String APIs)

The net11 RC1 SDK bump surfaced coreclr-only test failures caused by three intended .NET 11 changes:

- Narrow (sbyte/int16) float-to-integer conversions now saturate directly to the
  target range instead of saturating to Int32 then truncating. Guard the int16/sbyte
  overflow expectations in OperatorsModule2/OperatorsModuleDynamic with a new
  Info.isNet11OrGreater helper (byte/uint16 already matched the saturated result).
- double->decimal is now correctly rounded, so Convert.ToDecimal(3.02) no longer
  yields 3.02. Use a 3.02M literal in the migrated printf test, which exercises %M
  formatting rather than the conversion.
- System.String gained ToLowerOrdinal/ToUpperOrdinal; add them to the expected
  completion list under NET11_0_OR_GREATER.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update dependencies from https://github.com/dotnet/arcade build 20260906.1
On relative base path root
Microsoft.DotNet.Arcade.Sdk From Version 11.0.0-beta.26421.2 -> To Version 11.0.0-beta.26456.1

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use ListInline.foldBack in free-variable typar folds

accFreeInTyparConstraints and accFreeInTypars fold accFreeInTyparConstraint /
accFreeTyparRef over a typar's constraint and typar lists during
free-variable computation, one of the hottest traversals in the compiler.
Passing those top-level functions to List.foldBack allocated a partial-
application closure per call, over typically tiny (often empty) lists where
the closure is the entire cost.

Switch both folds to ListInline.foldBack (added in the parent change), whose
InlineIfLambda folder inlines the top-level partial application, so no closure
is allocated. Fold order is unchanged; compiler output is byte-identical under
--deterministic+.

Measured (dotnet-trace gc-verbose, 6 self-compiles of a 120-file corpus):
accFreeInTyparConstraints closure 147.8 MB -> 0, accFreeTyparRef closure
238.8 MB -> 0.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: c6610fae-a96e-4421-a920-e73de4fc94dc

* [MicroPerf] Inline the remaining free-variable foldBacks (dotnet#20439)

* Use ListInline.foldBack in free-variable typar folds

accFreeInTyparConstraints and accFreeInTypars fold accFreeInTyparConstraint /
accFreeTyparRef over a typar's constraint and typar lists during
free-variable computation, one of the hottest traversals in the compiler.
Passing those top-level functions to List.foldBack allocated a partial-
application closure per call, over typically tiny (often empty) lists where
the closure is the entire cost.

Switch both folds to ListInline.foldBack (added in the parent change), whose
InlineIfLambda folder inlines the top-level partial application, so no closure
is allocated. Fold order is unchanged; compiler output is byte-identical under
--deterministic+.

Measured (dotnet-trace gc-verbose, 6 self-compiles of a 120-file corpus):
accFreeInTyparConstraints closure 147.8 MB -> 0, accFreeTyparRef closure
238.8 MB -> 0.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: c6610fae-a96e-4421-a920-e73de4fc94dc

* Inline the remaining free-variable foldBacks

The remaining List.foldBack / List.fold sites in the free-variable
walkers (accFreeInFlatExprs, boundTypars and its left-to-right twin,
accFreeInMeasure, the LetRec/Obj/target walkers, and the object-
expression method walker) passed lambdas or partial applications to the
non-inline List HOFs, allocating a closure per call over typically tiny
(often empty) lists.

Route each through the inline ListInline.foldBack / ListInline.fold
twins, whose InlineIfLambda folder is inlined rather than allocated.
ListInline.fold is added alongside the existing ListInline.foldBack
(inline, InlineIfLambda folder, left-to-right cursor loop). Fold order
is unchanged.

Extends dotnet#20385. IL TypeDefinition enumeration of FSharp.Compiler.Service.dll:
the matching per-call closure classes drop from 22 to 6, with the 6
survivors being continuation-passing closures, Option.foldBack partial
applications, a LetRec cache-compute thunk, and a List.foldBack2 lambda,
none of which is a List fold this technique can inline.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: perf-bundle <perf@local>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: c6610fae-a96e-4421-a920-e73de4fc94dc

---------

Co-authored-by: perf-bundle <perf@local>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: c6610fae-a96e-4421-a920-e73de4fc94dc
…otnet#20447)

CheckTypeDeep threaded a tuple of five optional closures through its mutual recursion, so it allocated those closures, the tuple, the option wrappers, and a per-node TypeInstCtx heap value for every checked type. It is now generic over a struct visitor (ITypeVisitor), TypeInstCtx is a struct, and the onInnerByrefError callback is a ByrefError union. The walk allocates nothing and diagnostics are unchanged.

Co-authored-by: perf-bundle <perf@local>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 1696d169-c464-47bd-85ae-efef96c10d62
…ries (dotnet#20423)

* Eliminate closure allocations in well-known-attribute queries

The well-known-attribute query helpers partially applied computeXxx g to
non-inline caching methods (CheckFlag / HasWellKnownAttribute(flag,compute)),
allocating a closure on every query even on cache hits. Replace that with a
two-phase form: test a function-free NeedsCompute bit, and on a miss classify
with a fully-applied computeXxx g attribs (a plain call, no closure), store,
then do function-free bit tests. Also add an inline Array.tryPick twin in
Internal.Utilities.Library that shadows FSharp.Core's at tryFindILAttribByFlag,
folding that lambda closure. Behavior is unchanged (per-entity/val caching
still lives in the flag bitfield). Removes the now-dead CheckFlag /
compute-overload methods.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Deduplicate well-known value attribute caching

Use an inline helper with an InlineIfLambda setter so Val and argument queries share cache initialization without reintroducing closure allocations.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: perf-bundle <perf@local>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…#20415)

vMapFold's only caller (ImportILTypeWithNullness in import.fs) passes a
lambda; making the combinator inline + InlineIfLambda folds that lambda so
no per-call closure is allocated per imported IL type.

Co-authored-by: perf-bundle <perf@local>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
…tnet#20432)

* Collapse InterfacesWithAbstractStaticMembers enforcement sites to always-on path

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Preserve IWSAM runtime capability check via dedicated InfoReader member

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Remove always-on InterfacesWithAbstractStaticMembers language feature flag

Delete the dead LanguageFeature.InterfacesWithAbstractStaticMembers enum case, its features-map entry and GetFeatureString arm. Collapse the remaining compile-time SupportsFeature check in InfoReader.TryFindUnimplementedStaticAbstractMemberOfType to its always-on path. The FSComp string is retained as the display name for the runtime FS3351 diagnostic.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add release notes entry for IWSAM feature flag removal (dotnet#20432)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Remove remaining IWSAM feature resource after main merge

Keep the runtime-support diagnostic under a runtime-specific resource key and regenerate XLF files with UpdateXlf. Remove the release-note entry to keep the flatten PR note-free.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: perf-bundle <perf@local>
…otnet#20431)

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Improve parser error recovery for underscore-dot patterns

Refactored `pars.fsy` to split `UNDERSCORE DOT pathOp` into granular rules, adding explicit error recovery for missing identifiers after a dot. Introduced `underscoreLongIdentPat` to centralize underscore-prefixed long identifier logic, updating related rules and replacing `access UNDERSCORE DOT pathOp` with `access underscoreLongIdentPat`. Updated `Member 11.fs.bsl` baseline: wildcard member patterns now parse as `Named` instead of `FromParseError (Wild, ...)`, and error messages are more precise ("Identifier expected", "Expecting member body").

* Fix CompletionProviderTests.fs override trigger

Corrected the completion trigger string from "override _." to "override _.g" to match the code context.
…hsEqAndForall2 (dotnet#20372)

* Perf: eliminate closure allocs in List.mapq / List.lengthsEqAndForall2

Make both identity/equality List primitives `inline` with `[<InlineIfLambda>]`
and rewrite their bodies to apply the function argument directly (single-pass
while-loop) instead of forwarding it to the non-inline `List.map` / `List.forall2`.
This lets the optimizer beta-reduce the partial-application closures passed at the
hot remap/type-equivalence call sites (e.g. `List.mapq (remapTypeAux tyenv) types`)
into direct calls, with no call-site changes required.

Self-build gc-verbose trace (120 files / 65,880 LOC): the driven closures collapse
to 0 MB - typesAEquivAux@1646 599.6->0, remapTypes@419 591.5->0, remapExprs@2045
493.8->0, remapTypesAux@276 386.5->0, remapDecisionTree@2076-1 68.3->0; ~1.88 GB
net closure-allocation reduction.

Pure allocation optimization, output-identical: 3,000,000-trial in-process
differential (value + same-instance identity preservation, 0 mismatches) and
--deterministic+ self-compile SHA-256 byte-identity on two inputs.

Adds an EmittedIL characterization test (InlineIfLambdaClosureForms) documenting
when a HOF call site allocates a closure for its function argument.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Compaction: drop dead checkq, simplify lengthsEqAndForall2, trim comments/test

- Remove now-unused List.checkq (both .fs and .fsi) - mapq no longer calls it.
- lengthsEqAndForall2: drop the `ok` mutable; derive the result from `List.isEmpty`
  on the remainders after the single-pass loop.
- Trim over-explanatory comments to the load-bearing why.
- Characterization test: cut a redundant vanilla List.map case (6 -> 5 facts),
  compress the header doc block.

Behaviour unchanged: 3,000,000-trial differential still 0 mismatches; build clean.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Simplify primitives and make the characterization test readable

- lengthsEqAndForall2: 2 mutables driven by the while-condition (no `go` flag, no nested match).
- mapq: restore recursive `checkq` and reuse it; the general arm builds via a 2-mutable loop
  that applies `f` directly, then `checkq` preserves identity.
- InlineIfLambdaClosureForms: snippets as formatted multiline `"""` code; add the `<|` and
  piped forms (both closure-free for a module-level `let inline`).

Verified in isolation (fsc + ildasm): the while/checkq forms allocate 0 closures and 0 tuples,
whereas a recursive inner function allocates 2 closures and a tupled match allocates a per-iteration
tuple. Behaviour unchanged: 3,000,000-trial differential still 0 mismatches; the driven closures
still collapse to 0 in the self-build trace; −294 MB per compile.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Extract inline list combinators into a ListInline module

Add `module ListInline` (in illib) with `inline` + `[<InlineIfLambda>]` counterparts of the
`FSharp.Core` list combinators that take a function (`map`, `forall2`). Because the built-ins
are not inline, they force the function argument into a heap `FSharpFunc`; the ListInline
versions apply it directly, and `[<InlineIfLambda>]` chains through the enclosing inline
function, so the closure is beta-reduced away at the call site.

`mapq` and `lengthsEqAndForall2` then return to their original functional bodies with only the
combinator swapped (`List.map` -> `ListInline.map`, `List.forall2` -> `ListInline.forall2`) plus
the `inline` annotation - no hand-rolled mutable loops in either.

Verified in isolation (fsc + ildasm): InlineIfLambda chains through the nested inline call, so a
partial-application call site allocates 0 closures. Behaviour unchanged: 3,000,000-trial
differential 0 mismatches; the driven closures still collapse to 0 in the self-build trace.
InlineIfLambdaClosureForms gains a test for the chaining case.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Also carry [<InlineIfLambda>] on the ListInline / mapq / lengthsEqAndForall2 signatures

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Characterize that an instance member inline preserves InlineIfLambda through <|

Verified (fsc + ildasm) that the member/back-pipe shape is not itself a closure hazard -
members inline exactly like functions; the closure sometimes blamed on it comes from the
lambda escaping into a non-inline callee, which the forwarding cell already covers.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Correct the member/<| comment: the <| penalty is real under escape

Verified against the sibling StackGuard fix: with an escaping InlineIfLambda param, <| materialises
the closure unconditionally every call while a method-call keeps it in the cold escape branch - a
per-call placement difference a newobj-presence check cannot see. The non-escaping member+<| cell
stays (still 0), with an honest caveat.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* ListInline.forall2: flatten with a struct-tuple match

A reference-tuple `match r1, r2` allocates a heap Tuple2 per iteration on this hot path; a struct
tuple keeps the single flat match while `newobj valuetype ValueTuple` stays on the stack. Verified:
0 closures, no ValueTuple/Tuple in the gc-verbose trace, driven closures still collapse to 0, and
struct-tuple forall2 == List.forall2 over 2,000,000 trials (raise-on-mismatch included).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* ListInline.forall2: drop redundant struct keyword from the case patterns

The scrutinee `match struct (r1, r2)` already fixes the struct-tuple type, so the cases need not
repeat it. Verified the IL is unchanged - still `newobj valuetype ValueTuple` (stack, no heap tuple).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Test: split closure-form cases into DoesNotAllocate / AllocatesClosure; add top-level vs local partial-application

Adds the verified distinction: a partial application of a TOP-LEVEL function into an inline
InlineIfLambda HOF is beta-reduced to a saturated call (no closure), whereas a partial application
of a LOCAL function that closes over a local is materialised (closure) - even though the HOF applies
it directly. Regroups all cells by outcome into two sub-modules.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Update src/Compiler/Utilities/illib.fs

Co-authored-by: Brian Rourke Boll <brianrourkeboll@users.noreply.github.com>

* Fix Fantomas formatting

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 839445bd-9e73-4dc5-96be-e3befb1be5a1

* [MicroPerf] Drop the per-call closure in remarkExprs (dotnet#20425)

remarkExprs mapped with a partial application, es |> List.map (remarkExpr m),
allocating one remarkExpr m closure (remarkExprs@2586) per call. Switch to
ListInline.map (fun e -> remarkExpr m e) (inline + InlineIfLambda) so the
mapping is inlined and no closure is created. The result list spine is
unchanged.

Co-authored-by: perf-bundle <perf@local>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: perf-bundle <perf@local>
Co-authored-by: Brian Rourke Boll <brianrourkeboll@users.noreply.github.com>
Copilot-Session: 839445bd-9e73-4dc5-96be-e3befb1be5a1
* Fail F# tests whose return value xUnit never executes

An F# [<Fact>]/[<Theory>] that is accidentally a partial application (or
otherwise returns a value xUnit never runs -- an FSharpFunc, a delegate,
or a Lazy<_>) executes none of its assertions yet still reports success.
A custom test framework fails such a method at discovery time by swapping
it for xUnit's own ExecutionErrorTestCase; only discovery is customized,
so the stock execution/runner chain (parallelism, console capture) is
untouched.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 77be7136-44a4-468f-b8ec-2e5edeb2a76a

* Fully apply singleTestBuildAndRunAux so --tailcalls tests actually run

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 77be7136-44a4-468f-b8ec-2e5edeb2a76a

* Re-run CI (flaky nuget package-management cache race)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 77be7136-44a4-468f-b8ec-2e5edeb2a76a

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 77be7136-44a4-468f-b8ec-2e5edeb2a76a
…IL writer (dotnet#20349)

* Reverse instead of sort already-ordered branch fixups in IL writer

origReqdBrFixups is recorded by prepending at strictly-increasing code
positions, so it always arrives strictly descending by fixupLoc with no
ties. The stable List.sortBy is therefore exactly List.rev. Output is
byte-for-byte identical.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Document fixup-ordering invariant with a debug assertion in RecordReqdBrFixups

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
…20441)

* Remove always-on DotlessFloat32Literal language feature flag

The DotlessFloat32Literal feature shipped in F# 5.0. Since the minimum
accepted --langversion is now 8.0, the flag is permanently enabled and is
dead configuration. Remove the LanguageFeature case, its features-map
entry, and GetFeatureString arm, and collapse the gated lexer rule into a
single always-on ieee32 rule by folding the dotless-integer case into the
ieee32 regex. Regenerated xlf localization files.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Re-trigger CI: supersede stale pre-label check_release_notes run

The prior check_release_notes failure ran before the NO_RELEASE_NOTES
label existed. This empty commit advances the head SHA so the check
re-runs with the label present (opt-out) and passes. No release notes
are added (label opts this cleanup PR out).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…Patterns (dotnet#20158) (dotnet#20440)

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… Build ID 3064082 (dotnet#20304)

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3052923

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3052923

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3053805

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3053805

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3055958

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3055958

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3056027

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3056027

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3056046

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3056046

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3056141

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3056141

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3057781

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3057781

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3058030

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3058030

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3058082

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3058082

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3062023

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3062023

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3062051

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3062051

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3063165

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3063165

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3063170

* Localized file check-in by OneLocBuild Task: Build definition ID 499: Build ID 3063170

* Re-trigger CI (transient MacOS git fetch failure)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: dotnet-oneloc-localization[bot] <310689744+dotnet-oneloc-localization[bot]@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
missymessa and others added 15 commits October 21, 2026 10:37
AB#13599

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3d24c7a1-de44-482c-aa6a-eedc4a0cae5b
Fickl checks cached package sources as assemblies of their own, which a
compile of the project would check in its own assembly. Anonymous record
types belong to their assembly, so the project's {| ... |} no longer
type-checked against a cached API taking one, and an overload taking one
could silently lose to another. InteractiveChecker.SetAnonRecdTypesUnifiedAssembly
names the assemblies whose anonymous record types are one; none by default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…013.24 (dotnet#20824)

On relative base path root
System.Collections.Immutable , System.Composition , System.Diagnostics.DiagnosticSource , System.Reflection.Metadata From Version 10.0.10 -> To Version 10.0.14
System.Security.Cryptography.Xml From Version 10.0.13 -> To Version 10.0.14

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: f2185844-a242-4f12-8ed2-ff37f8b5a49c
* Red test for issue 20732: Release-only wrong result in integer `for` loop: local bound inside loop range expression clobbers a local slot

* Fix for issue 20732: Release-only wrong result in integer `for` loop: local bound inside loop range expression clobbers a local slot

* Release notes entry for PR 20733
A file checked again after an edit is compared with its earlier check by a
fingerprint of its signature: types with type parameters numbered by
position, constraints, attributes and their arguments, literal values,
inline flags, argument names, accessibility, members, slots, union cases,
fields and exceptions, leaving out ranges and stamps. When it is the same,
the file's earlier finisher stays in the state its dependents are checked
in, so they keep consistent entity identities and are reused; only the new
implementation is reported. Anything the fingerprint cannot describe makes
the file count as changed. FICKL_FCS_SIGNATURE_CUTOFF=0 turns it off.

Each result now records the generation of the finisher of every file it
depends on. Before, a file replaced in one check of part of the project
let its dependents be reused against its old result in a later check of the
rest, giving stale diagnostics and output.

FICKL_FCS_GRAPH_LOG prints how many files each check reused, kept and
replaced.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Add narrated slides release agent

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 6cc6e5b6-78b0-43d8-9b4b-d705cb3ec54e

* Pin narrated slides wrapper source

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 6cc6e5b6-78b0-43d8-9b4b-d705cb3ec54e

---------

Copilot-Session: 6cc6e5b6-78b0-43d8-9b4b-d705cb3ec54e
* Fix struct tuple quotation printer (dotnet#20800)

Use the stored tuple type only to select the debug-layout node name.
Preserve tuple construction, patterns, types and shape reconstruction.
Cover all four renderers with typed/untyped literals, both constructors,
mixed nesting, generic lambdas, and literal/constructed arities 7/8/9.
Add the VNEXT 11.0.200 FSharp.Core printer-only release note.

All commands below used BUILDING_USING_DOTNET=true and
FSHARPCORE_USE_PACKAGE=false. MTP options are passed directly: the
selected SDK rejects the handoff's extra "--" separator.

RED/GREEN command (plus Detailed output and xUnit XML diagnostics):
dotnet test --project tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj -c Debug -f net11.0 --filter-method "*Issue 20800*"
Before product edits: 2 executed, reference passed, struct failed,
exit 2. Expected: NewStructTuple (Value (1), Value ("a"))
Actual: NewTuple (Value (1), Value ("a"))
After the printer-only change: unchanged pair 2/2 passed, exit 0.
Expanded matrix: 3/3 passed, exit 0.

Both RED and GREEN loaded version 11.0.0.0 from:
C:\agents\fsharp-worktrees\issue-2112\artifacts\bin\FSharp.Core.UnitTests\Debug\net11.0\FSharp.Core.dll
Each matched the corresponding just-built repository core output:
C:\agents\fsharp-worktrees\issue-2112\artifacts\bin\FSharp.Core\Debug\net10.0\FSharp.Core.dll
RED SHA256: C1CDC73CE62BAB4DF4478F94CBA53488D69758C896734C4B15D61998DCB28AEF
GREEN SHA256: 05129632B3E6821E6E857FDF2EA68A0AEDC3FD4B67EC783707EC7203DFEE3E5D
Temporary runtime provenance diagnostics were removed.

Validation (all exit 0):
.\build.cmd -c Release
  Initial and final composite builds: 0 errors.
dotnet test --project tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj -c Debug -f net11.0 --filter-class "FSharp.Core.UnitTests.Quotations.*" --minimum-expected-tests 1
  29/29 passed, including unchanged tuple active-pattern facts.
dotnet test --project tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj -c Debug -f net11.0
  Total 6358: 6353 passed, 5 skipped, 0 failed.
dotnet test --project tests\FSharp.Compiler.ComponentTests\FSharp.Compiler.ComponentTests.fsproj -c Release -f net11.0 --filter-class "Conformance.Expressions.ExpressionQuotations.*" --minimum-expected-tests 1
  123/123 passed, including rendering snapshots.
dotnet test --project tests\fsharp\FSharpSuite.Tests.fsproj -c Debug -f net472 -p:BUILDING_USING_DOTNET=false --filter-method "*quotes-*" --output Detailed --minimum-expected-tests 3
  3/3 passed: quotes-FSC-FSC_DEBUG, quotes-FSC-BASIC, quotes-FSI-BASIC.
  These cases are #if !NETCOREAPP; net11.0 cannot discover them.
  MTP method filtering needs the leading wildcard for qualified names.
  MSBuild property enables desktop targeting; environment retains the
  values above and repository core project references remain in use.

Both requested file-scoped Fantomas commands ran. The product branch
is formatted; tests/ is intentionally excluded by .fantomasignore.
No unrelated formatting. git diff --check passed.
Bounded read-only expert-reviewer review using GPT-5.4: no findings.
Copilot Coding Agent-only final CoreCLR sweep is not applicable to
this Copilot CLI execution.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add release notes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Update service-branch-merge.json with new merge config

Removed old branch flow configurations and added a new merge configuration for release/10.0.4xx.

* Add automatic merge flow from main to feature/net12-scouting

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8dc30c74-e8bc-4ab4-b25f-2ebb9ae42ad7

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 8dc30c74-e8bc-4ab4-b25f-2ebb9ae42ad7
* Add F# release documentation author agent

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Refine F# release author editorial guidance

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Refine code-first F# documentation guidance

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Emphasize impact and substantive F# release examples

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Refine F# author explanations, migration, and credit

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Lead F# release documentation with design motivations

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Distinguish release and feature introductions

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* Freeze five-month performance-review corpus

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Freeze performance-review evidence and RED cases

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add and calibrate focused performance improvement reviewer

Add the read-only eight-group performance reviewer and a minimal discovery reference. Record blind development replays, calibration corrections, compact candidate identity and invocation fallback without consuming holdout feedback.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Complete and audit performance improvement reviewer

Reconcile source attribution and coverage, preserve failed calibration and isolation runs, and record the verified C6-S acceptance and delivery audit.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add release notes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Recover frozen performance-review corpus inventory

Reconcile the original 485 PR identities and query receipts without new discovery or inspection credit. Add offline cache recovery and a sealed, fail-closed inventory gate with normal and optimized regression coverage.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Cover offline corpus recovery and collector entry point

Exercise temporary archive reconciliation, repeat import reuse, invalid receipts, and byte-only source seal changes without granting inspection credit. All 16 tests pass normally and under Python optimization; the exact 485-member inventory passes and completion remains rejected.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Adjudicate performance-review scope and freeze exposure

Record evidence-backed scope decisions for the original 485 PRs, immutable six-way shards, connected-family exposure, and predeclared authorship and evaluation policies. Preserve real-source availability blockers and leave reviewer semantics unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Isolate unknown-exposure freshness regression

Start freshness tests from a valid metadata-only holdout and synchronize family summaries and test-only seals before injecting unknown access. Check the specific exposure error and independently exercise both audit requirements with distinct diagnostics. Preserve all frozen corpus records and reviewer semantics.

Validation: 27 Python tests pass normally and optimized; four broken freshness guards are detected in both modes; inventory, scope, shard and whitespace checks pass. Release solution build and all 19,941 executed .NET tests pass (537 skipped) using local FSharp.Core and the desktop SDK-test prerequisites.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Preserve connected variants and cover semantic exposure

Join the central-package-management variants without losing historical aliases or access events, and retain prior freeze hashes as additive provenance. Exercise all disqualifying exposure categories and a resealed connected-family split.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Consolidate authorship attestation regression cases

Parameterize copied-source and account-identity attestations without losing either scenario. Require distinct diagnostics with consistent test-only exposure seals so unrelated validation failures cannot satisfy the tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Record blocked blind RED runner preflight

No holdout or reviewer invocation was attempted without an enforced isolation boundary. Require owner runner enrollment before resuming sprint 3.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Copilot-Session: 20b10bf6-6a7c-483a-8d09-d521e7ddd73d
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: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Provision DartLab from main before fetching reviewed PR code

Pin orchestration YAML and control scripts to protected main independently of the reviewed PR revision. Preserve the main verifier and runner outside the PR checkout, then fetch and test the selected PR code after provisioning.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 34f3e808-c404-4337-8e8c-76fcea75b3ed

* Remove selected DartLab orchestration test suites

Remove the command-helper, bootstrap and Git environment test suites and their README references. Keep snapshot-selection and result-handoff tests unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 34f3e808-c404-4337-8e8c-76fcea75b3ed

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 34f3e808-c404-4337-8e8c-76fcea75b3ed
@MangelMaxime

Copy link
Copy Markdown

Thank you for sharing the result of your investigation.

Reading through the PR, it seems like we found some similar improvements.

I opened 2 mores PRs against dotnet/fsharp as this could benefit any FCS consumer:

I think there is more improvement available this PR, but we still need to extract them and see where we can contribute them.

T-Gro and others added 13 commits October 22, 2026 16:30
* Stabilize active-pattern tooling and measured catalogue cache

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Separate AP tooling from the independent catalogue cache

Preserve the complete source snapshot for the cache owner, remove only the cache slice, reuse editor test helpers, and prepare release notes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Reuse current-project symbol catalogues in Visual Studio

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Link active-pattern tooling release notes to the draft PR

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Link the Visual Studio cache release note

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Fix desktop edit-test APIs and compact verified assertion recipes

Preserve all completion and editor scenarios while using the net472-compatible Replace overload and existing edited-source assertions.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Separate the dependent editor layer from FCS case completion

Preserve the tested complete source and exact editor export while retaining the FCS completion/catalogue changes and release note in this lower draft.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Fix catalogue cache test name resolution

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Offer valid active-pattern imports and completion edits

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Link editor release note to its dependent draft

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Wire cache reference tests through Roslyn metadata

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Validate pull requests targeting maintainer branches

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Apply referenced cache fixtures to the editor workspace

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Deduplicate qualified case imports and normalize editor fixtures

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Keep completion imports in the consuming namespace

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Consolidate the complete active-pattern feature in one draft

Keep the reviewed FCS, editor and catalogue-cache histories; remove the discarded stack-only CI filter and link all release notes to PR20719.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Fix active-pattern open naming and editor placement

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Anchor compiler namespace in editor completion tests

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Correct active-pattern option test entry and preserve context guards

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Reuse identifier projection and catalogue assertion recipe

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Reject insertion candidates before selecting completed module scope

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Restore original catalogue file ending

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Create insertion naming scope once per request

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Select one Git executable in PR validation fixture

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Share active-pattern editor assertion and option recipes

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Share FCS unused-open and case-identity assertions

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Reuse insertion modes and fresh codefix test recipes

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Retry DNS failures during test-result verification

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Load HTTP dependency before typed publisher verification

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

* Fix CI failures after merge

The main-branch publisher revert in the merge removes the Windows HTTP type-loading and macOS DNS verification failures. No additional source changes are required.

Validated the full Release product build, both FCS target frameworks, all editor tests, isolated active-pattern regressions, formatting, and PR-validation Git fixtures. The extra legacy VS file-movement tests require a VS installation matching the repository 18.9 packages.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
* Backflow from https://github.com/dotnet/dotnet / ee344f8 build 337683

Diff: https://github.com/dotnet/dotnet/compare/8d27771a45b794da311fc551e2ed62366fe43784..ee344f85ef890dd92974e9b93d75906f1f8c39f3

From: dotnet/dotnet@8d27771
To: dotnet/dotnet@ee344f8

[[ commit created by automation ]]

* Update dependencies from build 337683
No dependency updates to commit
[[ commit created by automation ]]

---------

Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
…0853)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: d411284f-2a6b-4b0d-9ee5-18b2de547fd9
* Fix struct tuple property reflection diagnostics

Reject struct tuples in PreComputeTuplePropertyInfo after negative-index validation, with a resource-backed explanation and supported reader alternatives. Preserve reference-tuple metadata and continuation behavior; cover the validation precedence and struct reader compatibility for issue dotnet#20801.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Add release notes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update FSharp.Core localizations for struct tuple diagnostic

Regenerate all 13 XLF files for the existing structTupleNoProperties resource to repair PR dotnet#20815 localization validation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Update trimming baselines for tuple reflection fix

Use the sizes measured by both Windows AOT metadata modes in build 1641071 at 6bcda0b. Preserve the unchanged metadata-resource trimming expectation.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 20b10bf6-6a7c-483a-8d09-d521e7ddd73d

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
Copilot-Session: 20b10bf6-6a7c-483a-8d09-d521e7ddd73d
…otnet#20782)

* Debugger: emit a call for a self tail call in non-optimized builds

* Update baselines

* Release notes
…nesses (dotnet#20844)

* * Optimizer: key debug inline specializations on type arguments and witnesses

* Release notes
Brings in 950 upstream commits (2025-11-21 to 2026-10-23), including the
type checker allocation and caching work. Fork patches carried across:

- Parameter attributes travel with ParamData; they are now
  WellKnownValAttribs, as ArgReprInfo.Attribs became upstream, and the new
  overload-resolution rules and delegate checks take only the ParamData.
- Anonymous record CCU unification moved into TypedTreeOps.Remap.fs after
  upstream split TypedTreeOps.fs.
- The FS1113 inline-accessibility check that replaced
  CheckInlineValueIsComplete is skipped under FABLE_CLI, as the old check
  was, so precompiled packages may inline internal values.
- Witness generation keeps failing soft in quotations and the symbol API,
  around upstream's new CodegenWitnessesForTyparInstWith; the skip for
  type parameters without trait constraints is kept.
- IWSAM checks skip extension members as upstream now does.
- service_slim follows PartialResult's new own-signature field, the
  eighth TTrait field and the TypeCheckInfo constructor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream now lowers every string-typed interpolated string to
String.Concat (dotnet#19971). Fable builds string templates (JSX, emitJs*
templates, its own hole formatting) from the PrintfFormat an
interpolated string used to produce, so under FABLE_CLI the earlier
lowering is kept: String.Concat only when every hole is a string with no
format, otherwise sprintf of a captured PrintfFormat.

The parser now moves a hole's printf specifier and .NET alignment/format
onto SynInterpolationFormatting, so the old checks read it from there.
sprintf_info and mkCall_sprintf, removed upstream, are restored for this.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream now reports FS1113 from post-inference checks as well as the
optimizer. Fable lets inline functions use internal values (precompiled
packages rely on it) and reports inlined private values itself, so under
FABLE_CLI the check is skipped, as the optimizer's is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PropertyCollector enumerates a ConcurrentDictionary whose keys hash the
property name, and string hashes are randomized per process, so the
order of a type's properties changed from one run to the next. Fable
picks and prints interface members in that order, so its output did too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The occurrence counters behind compiler-generated names, such as those
of let rec values that are not all functions and of top-level patterns,
live as long as the checker. In watch mode a file checked again kept
counting from its last check, so recursive1@385 became recursive1@385-2,
then -4, and the output differed from a fresh compilation.

Fable's checker now resets the counters of a file, and only that file,
before checking it. Code generation's counters are left alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codegen witnesses for an application with trait constraints built a new
InfoReader per call; since the dotnet/fsharp merge each of its dozen
MemoizationTables is a Cache that preallocates a ConcurrentDictionary.
FSharpExprConvert now passes its SymbolEnv's InfoReader
(CodegenWitnessesForTyparInstUsing); the codegen solver state stays fresh.

entityIsUnresolved, isResolvedAndFSharp and ccuOfTyconRef matched
|ERefLocal|ERefNonLocal|, allocating a Choice per call; they test IsLocalRef.
FSharpType.GenericArguments no longer copies the fresh arrays of function and
measure types.

Fable's tests/Js/Main watch rebuild after a new value in a widely used file:
2.2 -> 1.35 s with the matching Fable fixes; cold output byte-identical.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.