- Fix IntelliSense not suggesting later named arguments after the first one is autocompleted, for methods (including overloaded methods like
Task.Factory.StartNew). (Issue #19906, PR #19940) - Restore packaging of an F# design-time type provider that is activated via a
ProjectReferencecarryingIsFSharpDesignTimeProvider="true". The provider assembly is again included underfsharp41when packing (includingpack --no-build);PackageFSharpDesignTimeToolsnow resolves the provider viaGetTargetPath, which works indotnet pack'sBuildProjectReferences=falsecontent build without forcing an earlyResolveReferences. (Issue #18924, PR #19979) - Provided types used from multiple files no longer produce spurious FS0001 type mismatches under parallel compilation; provided-type entities are now interned so every file linking a given provided type shares one entity. (PR #19969)
- TypeProviders-SDK providers now load under an unoptimized compiler; the
systemRuntimeContainsTypeclosure field the SDK reflects on (tcImports) is captured stably regardless of optimization settings. (PR #19969) - Fixed: Inheriting from an undefined type now reports
FS0039exactly once instead of three times. Phase 1F and Phase 2A of inherit-clause type-checking now skip re-resolving a syntactic clause whose Phase 1D resolution already failed withUndefinedName, eliminating both the duplicate diagnostic and the redundant work. (Issue #16432, PR #19862) - Fix several F# editor semantic-classification errors: F# delegate declarations no longer highlight the
delegate of …syntax as a method, computation-expression builders inside list/array comprehensions are classified asComputationExpression, the closing]of an open-ended slice (e.g.xs[0..]) is no longer classified asFunction/Method, andopen type Tis no longer reported as unused when its imported members (static members, static fields, or DU union cases) are used. (Issue #19905, PR #19960) - Diagnostic FS0027 now emits a parameter-specific message (suggesting a
let mutable x = xshadow orbyref<_>) instead of the illegallet mutable x = expressionshadow when the assignment target is a function or method parameter. (Issue #15803, PR #19866) - Recursive
inlinefunctions and members now emit a single clear error (FS3890) instead of a misleading FS1113/FS1114 optimizer cascade. (Issue #17991, PR #19803) - Report
FS0037 Duplicate definition of type or moduleat type-check time when two sibling modules in amodule rec/namespace recgroup share a name, instead of letting the duplicate slip through to IL emit where it surfaced as the crypticFS2014: duplicate entry . in type index table. (Issue #6694, PR #19913) - Unused
Unchecked.defaultof<'T>bindings are now eliminated under optimization at their use sites. This removes redundantinitobj/ldnull;popsequences left behind after inlining SRTP helpers that useUnchecked.defaultofas dummy arguments to drive static-member-constraint resolution. Such bindings are preserved insideinlinebodies (whose optimized form is pickled as cross-assembly optimization info and re-inlined by consumers) and whenever the erased type still references unsolved type variables, so noFS0073regression is introduced. (Issue #18128, PR #19758) - Semantic classification no longer marks recursive object self-references (
as this,let recself-refs) as mutable. (Issue #5229) - Fix
MethodAccessExceptionunder--realsig+when a closure (innerlet rec,task/asyncstate machine, or quotation splice) inside a member defined in an intrinsic type augmentation (type C with member ...) accesses aprivatemember ofC. The synthesized closure is now nested inside the declaring type instead of beside it in the module class. (Issue #19933, PR #19955) - Preserve source range for type errors on empty-bodied computation expressions (e.g.
foo {}) in pipelines, function arguments, and type-annotated contexts, instead of reportingunknown(1,1). (Issue #19550, PR #19849) - Tooltip "Full name" now shows demangled companion module names (e.g.
MyType.funcinstead ofMyTypeModule.func). (Issue #17335, PR #19867) - Fix internal error (FS0193) when calling an indexed property setter with a named argument that matches an indexer parameter. (Issue #16034, PR #19851)
- Fix missing FS1182 ("unused binding") warning for unused
letfunction bindings inside class types. (Issue #13849, PR #19805) - Fix internal compiler error FS1110 in
task { let! }(and other computation expressions) when a generic IL extension method whosethis-parameter is a method-level type variable is in scope (e.g.open ReactiveUI). Regression from PR #19536. (Issue #19936) - Fix inner mutually-recursive
let rec ... and ...functions under--realsig+not being lifted to top-level static methods (TLR), causingFSharpFuncclosure allocations and loss oftail.opcodes — the large struct-mutual-recursion perf regression reported in Issue #17607. (PR #19882) - Fix
TypeLoadException("Specialize tried to implicitly override a method with weaker type parameter constraints") and the related CLR crash with constrained inline calls by stripping constraints from closure-class typars inEraseClosures.convIlxClosureDef. (Issue #14492, Issue #19075, PR #19882) - Fix
FieldAccessExceptionat runtime when the optimizer relocates a read of aprotected(family) base-class field into a method outside the field's family (e.g. a trivial member inlined into module/startup code under--optimize+). Protected (family) IL field access is no longer hoisted out of its declaring family by inlining or method-splitting. (Issue #19963, PR #19964) - Suppress hover/symbol resolution for wildcard
_patterns insidemember _.…bodies that incorrectly showedval _: Ttooltip. (PR #19760) - Report
seq { }implicit-yield diagnostics and format specifier locations once instead of twice: the classification pass that decides whether the body is a statement or a yielded element no longer double-reports to the sink or diagnostics. (Issue #16419, PR #19791, PR #19895) - Stabilize codegen order under
--parallelcompilation+so--deterministicRelease builds produce byte-identical IL across rebuilds: optimizer Val iteration, IlxGen type/method/field/event emit order, anonymous-record extra-binding drain, andFileIndexassignment now follow source position rather than thread-scheduling order. (Issue #19732, PR #19810) - Reject non-function bindings for single-case and partial active pattern names with FS1209, matching the existing multi-case behavior. (PR #19763)
- Fix FS0421 "The address of the variable cannot be used at this point" incorrectly raised for the discard pattern
let _ = &exprwhenlet x = &exprcompiles. (Issue #18841, PR #19811) - Fix double
Disposecall when ausebinding aliases its value via anaspattern or rebinds an existinguse-bound value. (Issue #12300, PR #19858) - Honor
--nowarnand--warnaserrorfor warnings emitted during command-line option parsing (Issue #19576, PR #19776) - Fix
[<return: X>]prefix attributes being silently dropped on class members, and fix false-positiveAllowMultiple=falseerrors when[<X>]and[<return: X>]are applied to the same binding. (Issue #17904, Issue #19020, PR #19738) - Fix
=adjacent to an interpolated string (e.g.C(Name=$"value")) being lexed as the invalid operator=$instead of an assignment followed by an interpolated string. (Issue #16696) - Extend the
=adjacent to an interpolated string fix to the verbatim (=$@"…",=@$"…") and extended multi-dollar (=$$"""…""") interpolated-string forms. (Issue #16696, PR #19984) - Preserve type abbreviations (
string, user-defined aliases) in the refined type of bindings introduced after a| nullpattern in amatchexpression. (Issue #19646, PR #19745) - Fix attributes on return type of unparenthesized tuple methods being silently dropped from IL. (Issue #462, PR #19714)
- Fix false-positive nullness warning (FS3261) when pattern matching narrows nullness inside seq/list/array comprehensions. (Issue #19644, PR #19743)
- Fix internal error FS0073 "Undefined or unsolved type variable" in IlxGen when nested inline SRTP functions with multiple overloads leave unsolved typars in the non-witness codegen path. (Issue #19709, PR #19710)
- Fix NRE when calling virtual Object methods on value types through inline SRTP functions. (Issue #8098, PR #19511)
- Narrow overload-resolution error ranges to the method name only instead of covering the entire expression. (Issue #14284, PR #19505)
- Fix attributes not resolved from opened namespaces in
namespace rec/module recscopes. (Issue #7931, PR #19502) - Fix DU case names matching IWSAM member names no longer cause duplicate property entries. (Issue #14321, PR #19341)
- Fix DefaultAugmentation(false) duplicate entry in method table. (Issue #16565, PR #19341)
- Fix abstract event accessors now have SpecialName flag. (Issue #5834, PR #19341)
- Fix warning 20 ("expression is implicitly ignored") pointing at the wrong range when the last expression in a sequential block (e.g. inside
for,whileloops) is non-unit. The squiggle now correctly highlights only the offending expression. (Issue #5418, PR #19504) - Extend the warning 20 range fix to also walk through
let/usebindings, so the squiggle lands on the offending expression when it is the body of alet/use. (Issue #5418, PR #19896) - Fix missing "No implementation was given" error when F# class inherits from a C# class with
abstract overridemembers without providing an implementation. (Issue #7776, PR #19503) - Fix CLIEvent properties to be correctly recognized as events:
IsEventreturnstrueandXmlDocSigusesE:prefix instead ofP:. (Issue #10273, PR #18584) - Fix extra sequence point at the end of match expressions. (Issue #12052, PR #19278)
- Fix wrong sequence point range for
return/yield/return!/yield!inside computation expressions. (Issue #19248, PR #19278) - Fix extra out-of-order sequence point for
useintaskcomputation expressions. (Issue #19255, PR #19278) - Fix debug points failing to bind in body of
[ for x in xs -> body ]comprehensions. (Issue #13504, PR #19278) - Fix outref parameter compiled as byref. (Issue #13468, PR #19340)
- Fix static abstract interface members with byref params. (Issue #18135, PR #19340)
- Fix codegen to produce IL passing ILVerify: specialized stelem/ldelem for primitives, callvirt→call on value types, castclass at interface join points, filter→catch inside finally handlers, witness field alignment in state machine structs. (PR #19372)
- Fix object expressions in struct types no longer generate invalid IL with byref fields. (Issue #19068, PR #19339)
- Avoid duplicate parameter names in closure constructors. (Issue #17692, PR #19339)
- Improve let-rec codegen: reorder bindings to allocate lambda closures before non-lambda values that reference them. (PR #19339)
- Fix
YieldFromFinal/ReturnFromFinalbeing incorrectly called in non-tail positions (for,use,use!,try/withhandler). (Issue #19402, PR #19403) - Fixed how the source ranges of warn directives are reported (as trivia) in the parser output (by not reporting leading spaces). (Issue #19405, PR #19408)
- Fix UoM value type
ToString()returning garbage values when--checknulls+is enabled, caused by double address-taking in codegen. (Issue #19435, PR #19440) - Fix accessibility and type-matching for extension method lookups. (Issue #19349, PR #19536)
- Fix completion inconsistently showing some obsolete members (fields and events) while hiding others (methods and properties). All obsolete members are now consistently hidden by default. (Issue #13512, PR #19506)
- Fix O(n)
TypeStructure.GetHashCodeperformance regression causing sustained high CPU in IDE mode with generative type providers. (Issue #18925, PR #19369) - Fix TypeLoadException when creating delegate with voidptr parameter. (Issue #11132, PR #19338)
- Suppress tail calls when localloc (NativePtr.stackalloc) is used. (Issue #13447, PR #19338)
- Fix TypeLoadException in Release builds with inline constraints. (Issue #14492, PR #19338)
- Fix nativeptr in interfaces leads to TypeLoadException. (Issue #14508, PR #19338)
- Fix box instruction for literal upcasts. (Issue #18319, PR #19338)
- Fix Decimal Literal causes InvalidProgramException in Debug builds. (Issue #18956, PR #19338)
- Fix
AttributeUsage.AllowMultiplenot being inherited for attributes subclassed in C#. (Issue #17107, PR #19315) - Fix signature generation: recursive module
dobinding leaking compiler-generated val. (Issue #13832, PR #19586) - Fix signature generation: literal values in attribute arguments now preserve literal identifier name. (Issue #13810, PR #19586)
- Fix signature generation: struct types with non-comparable/non-equatable fields now include
[<NoComparison>]/[<NoEquality>]. (Issue #15339, PR #19586) - Fix signature generation: backtick escaping for identifiers containing backticks. (Issue #15389, PR #19586)
- Fix signature generation:
privatekeyword placement for prefix-style type abbreviations. (Issue #15560, PR #19586) - Fix signature generation: missing
[<Class>]attribute for types without visible constructors. (Issue #16531, PR #19586) - Fix F# exception serialization now preserves fields (gated behind
--langversion:11). (Issue #878, PR #19342, PR #19746) - Fix methods being tagged as
Memberinstead ofMethodin tooltips. (Issue #10540, PR #19507) - Fix Debug-mode compilation when mixing resumable and standard computation expressions. (Issue #19625, PR #19630)
- IlxGen: fix missing CompilationMapping attribute for generic values (PR #19643)
- Fix internal error
FS0192: encodeCustomAttrElemTypewhen using arrays of user-defined types as custom attribute arguments. Empty arrays (e.g.[<DefaultValue([||] : A[])>]) now compile successfully; non-empty arrays of unencodable types report a proper diagnostic (FS3887) instead of an internal error. (Issue #12796, PR #19472) - Fix internal compiler error in
usebindings when a C#-styleDisposeextension method is in scope alongsideIDisposable.Dispose. (Issue #19552, PR #19568) - Fix signature generation: single-case struct DU gets spurious bar causing FS0300. (Issue #19597, PR #19609)
- Fix signature generation: backticked active pattern case names lose escaping. (Issue #19592, PR #19609)
- Fix signature generation:
namespace globalheader dropped from generated signature. (Issue #19593, PR #19609) - Fix signature generation: SRTP constraints use postfix syntax that fails conformance, now uses explicit type param declarations. (Issue #19594, PR #19609)
- Fix signature generation: type params with special characters missing backtick escaping. (Issue #19595, PR #19609)
- Fix internal error when using custom attribute with
[<Optional>]value type parameter and no[<DefaultParameterValue>]. (Issue #8353, PR #19484) - Fix overload resolution of static member extension if one or more intrinsics candidates exist (Issue #19664, PR #19698)
- Fix parallel compilation of scripts (PR #19649)
- Fix parser recovery, name resolution, and code completion for unfinished enum patterns (PR #19708)
- Parser: fix unexpected diagnostics in debug builds, improve error messages (PR #19730)
- Fix parser error for anonymous record type aliases with postfix type operators (e.g.
{| Id: Guid |} []) when closing bracket is column-aligned with opening bracket. (Issue #17407, PR #19762) - Fix internal error when resolving SRTP
get_Itemwitness forstringindexers (unknown builtin witness 'get_ItemDynamic'). (Issue #18093, PR #19757) - Fix false FS1113 error on inline instance members when a class-scope self identifier (
as self) is present. (Issue #17899, PR #19761) - Allow
| nullnullable annotation on a[<MeasureAnnotatedAbbreviation>]over a reference type (e.g. the FSharp.UMXtype string<[<Measure>] 'm> = stringpattern). (Issue #19657) - Fix
[<Struct>] ?paramoptional parameters could not be passed using the explicit?param = exprcaller-side syntax with aValueOptionvalue. (Issue #19711, PR #19742) - Fix signature conformance: overloaded member with unit parameter
M(())now matches sigmember M: unit -> unit. (Issue #19596, PR #19615) - Fix
--quietnot suppressing NuGet restore output on stdout in F# Interactive (Issue #18086) - Reference assembly MVIDs are now deterministic across compiler invocations. Previously,
--refout/<ProduceReferenceAssembly>true</ProduceReferenceAssembly>produced a different MVID every build because the implied signature hash used .NET's randomizedString.GetHashCode(). (Issue #19751, PR #19801) - Parser: recover on unfinished if and binary expressions (PR #19724)
- Fix missing semantic classification on second and later type qualifiers in nested copy-and-update expressions like
{ p with Person.Info.X = 1; Person.Info.Y = 2 }. (Issue #17428, PR #19878) - Parser: recover on unfinished if and binary expressions (PR #19724)
- Fix QuickInfo /
GetAllUsesOfAllSymbolsInFilefor overloaded CE[<CustomOperation>]keywords to report the actually-resolved overload instead of the first-registered one. (Issue #11612, Issue #15206, PR #19865) - Fix
opendeclaration insertion in.fsx/.fsscriptscripts being placed before#r/#loaddirectives, producing invalid script files. (Issue #16271, PR #19879) - Warn FS3888 when a compiler-semantic attribute on a value/member or type/module is present in the
.fsbut missing from the.fsi. Such attributes were previously ignored at the consumer side. Under theErrorOnMissingSignatureAttributepreview language feature, FS3888 is an error. (Issue #19560, PR #19880) - Emit debug points at a stack-empty position (PR #19877)
- Fix spurious XmlDoc warnings (unknown parameter / no documentation for parameter) under
--warnon:3390when a get/set property documents the full parameter set across both accessors. (Issue #13684, PR #19884) - Stop F# Interactive from mutating script arguments that follow
--. Abbreviated flags like-d,-r,-Iafter the--separator are no longer colon-joined with their next token infsi.CommandLineArgs. (Issue #10819, PR #19926) - Fix Go-to-Definition for provided constructors that lack
TypeProviderDefinitionLocationAttribute. Navigation now falls back to the declaring type instead of silently failing. (Issue #5538, PR #19917) - Render the declaring type for C#-style extension methods in overload-resolution error messages so the suggestion no longer falsely attributes the extension to the receiver type. (Issue #9838, PR #19925)
- Fix FSI pretty printing to distinguish anonymous records (
{| ... |}) from nominal records ({ ... }). (Issue #6116, PR #19919) - Fix dot-completion after indexed expressions (
a.[0].Data.,a[0].Data.,[1;2].Length.) returning unrelated global completions instead of expression-typings members. (Issue #4966, PR #19934) - Quotations of
match s with "" -> _no longer leak thes <> null && s.Length = 0lowering; the empty-string optimization moved from pattern-match compilation to the optimizer so quoted expressions keepop_Equality(s, ""). (Issue #19873)
- Added internal synthesized-name replay infrastructure for compiler-generated names, preserving normal compilation output while enabling future hot reload name stability work.
- Add an internal typed-tree diff utility for future F# hot reload edit classification. It is not called by normal compilation. (PR #19941)
- Added internal F# hot reload delta emitter and symbol matcher infrastructure with direct emitter test coverage.
- Added
FSharpMemberOrFunctionOrValue.IsPropertyAccessorconvenience property that returns true for compiler-generated property accessors (get_X/set_X). (Issue #18157, PR #19883) - Added warning FS3884 when a function or delegate value is used as an interpolated string argument. (PR #19289)
- Symbols: add ObsoleteDiagnosticInfo (PR #19359)
- FCS: add FSharpCheckFileResults.HasErrors (PR #19892)
- Add
#version;;directive to F# Interactive to display version and environment information. (Issue #13307, PR #19332) - Add diagnostic FS3889 when a namespace and a type have the same fully-qualified name in the same assembly, replacing the misleading FS0247 "namespace and a module" error. (Issue #17827, PR #19802)
- Debug: rework for expressions stepping (PR #19894)
- Debug: rework conditional erasure, fix stepping over literals (PR #19897)
- Debug: fix if and match condition sequence points (PR #19932)
- Checker: recover on checking language version (PR ##19970)
- Implied argument names for function-to-delegate coercions now fall back to the delegate's
Invokeparameter names when the function has no recoverable names (e.g. a partial application likeSystem.Func<int, int>((+) 1)), instead of syntheticdelegateArg0,delegateArg1, … names. (PR #20001) - Add Roslyn-format EnC CustomDebugInformation codec and portable PDB method CDI emission support to AbstractIL. (PR #20018)
- Add internal ECMA-335 Edit-and-Continue metadata delta writer to AbstractIL. (PR #20019)
- Add internal
ResetCompilerGeneratedNameStatetoCompilerGlobalStatename generators so warm-checker re-compilation can produce fresh-process-identical generated names. (PR #20017) - Add experimental hot reload support:
--test:HotReloadDeltasbaseline capture in fsc, EnC metadata/IL/PDB delta emission, rude-edit detection, and anFSharpCheckersession API (CreateHotReloadSession, withAddProject/EmitDelta/Commit/Discard). Off by default; flag-off compilation is unchanged. (Issue #11636, PR #19941)
- Nullness warning FS3261 on dotted method or property access (e.g.
x.Member) now underlines the receiver expression and includes the member name and (when known) the binding name in the message. (Issue #19658, PR #19814)
- Improvements in error and warning messages: new error FS3885 when
let!/use!is the final expression in a computation expression; new warning FS3886 when a list literal contains a single tuple element (likely missing;separator); improved wording for FS0003, FS0025, FS0039, FS0072, FS0247, FS0597, FS0670, FS3082, and SRTP operator-not-in-scope hints. (PR #19398) - Exception field serialization (
GetObjectDataand field-restoring constructor) is now gated behindlangversion:11(LanguageFeature.ExceptionFieldSerializationSupport). With langversion ≤10, exception codegen is unchanged from pre-#19342 behavior. (PR #19746)
- Optimizer: don't inline named functions in debug builds (PR #19548