Repository navigation
Fickl performance experiments - #20
Draft
shayanhabibi wants to merge 965 commits into
Draft
shayanhabibi wants to merge 965 commits into
shayanhabibi wants to merge 965 commits into
Conversation
…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>
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
|
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
I think there is more improvement available this PR, but we still need to extract them and see where we can contribute them. |
* 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Staging full tree for cherrypicking
See fable-compiler/Fable#5135