Skip to content

Latest commit

 

History

History
147 lines (139 loc) · 33.2 KB

File metadata and controls

147 lines (139 loc) · 33.2 KB

Fixed

  • 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 ProjectReference carrying IsFSharpDesignTimeProvider="true". The provider assembly is again included under fsharp41 when packing (including pack --no-build); PackageFSharpDesignTimeTools now resolves the provider via GetTargetPath, which works in dotnet pack's BuildProjectReferences=false content build without forcing an early ResolveReferences. (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 systemRuntimeContainsType closure field the SDK reflects on (tcImports) is captured stably regardless of optimization settings. (PR #19969)
  • Fixed: Inheriting from an undefined type now reports FS0039 exactly 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 with UndefinedName, 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 as ComputationExpression, the closing ] of an open-ended slice (e.g. xs[0..]) is no longer classified as Function/Method, and open type T is 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 = x shadow or byref<_>) instead of the illegal let mutable x = expression shadow when the assignment target is a function or method parameter. (Issue #15803, PR #19866)
  • Recursive inline functions 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 module at type-check time when two sibling modules in a module rec / namespace rec group share a name, instead of letting the duplicate slip through to IL emit where it surfaced as the cryptic FS2014: 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 redundant initobj/ldnull;pop sequences left behind after inlining SRTP helpers that use Unchecked.defaultof as dummy arguments to drive static-member-constraint resolution. Such bindings are preserved inside inline bodies (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 no FS0073 regression is introduced. (Issue #18128, PR #19758)
  • Semantic classification no longer marks recursive object self-references (as this, let rec self-refs) as mutable. (Issue #5229)
  • Fix MethodAccessException under --realsig+ when a closure (inner let rec, task/async state machine, or quotation splice) inside a member defined in an intrinsic type augmentation (type C with member ...) accesses a private member of C. 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 reporting unknown(1,1). (Issue #19550, PR #19849)
  • Tooltip "Full name" now shows demangled companion module names (e.g. MyType.func instead of MyTypeModule.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 let function 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 whose this-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), causing FSharpFunc closure allocations and loss of tail. 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 in EraseClosures.convIlxClosureDef. (Issue #14492, Issue #19075, PR #19882)
  • Fix FieldAccessException at runtime when the optimizer relocates a read of a protected (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 inside member _.… bodies that incorrectly showed val _: T tooltip. (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 --deterministic Release builds produce byte-identical IL across rebuilds: optimizer Val iteration, IlxGen type/method/field/event emit order, anonymous-record extra-binding drain, and FileIndex assignment 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 _ = &expr when let x = &expr compiles. (Issue #18841, PR #19811)
  • Fix double Dispose call when a use binding aliases its value via an as pattern or rebinds an existing use-bound value. (Issue #12300, PR #19858)
  • Honor --nowarn and --warnaserror for 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-positive AllowMultiple=false errors 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 | null pattern in a match expression. (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 rec scopes. (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, while loops) 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/use bindings, so the squiggle lands on the offending expression when it is the body of a let/use. (Issue #5418, PR #19896)
  • Fix missing "No implementation was given" error when F# class inherits from a C# class with abstract override members without providing an implementation. (Issue #7776, PR #19503)
  • Fix CLIEvent properties to be correctly recognized as events: IsEvent returns true and XmlDocSig uses E: prefix instead of P:. (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 use in task computation 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/ReturnFromFinal being incorrectly called in non-tail positions (for, use, use!, try/with handler). (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.GetHashCode performance 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.AllowMultiple not being inherited for attributes subclassed in C#. (Issue #17107, PR #19315)
  • Fix signature generation: recursive module do binding 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: private keyword 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 Member instead of Method in 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: encodeCustomAttrElemType when 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 use bindings when a C#-style Dispose extension method is in scope alongside IDisposable.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 global header 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_Item witness for string indexers (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 | null nullable annotation on a [<MeasureAnnotatedAbbreviation>] over a reference type (e.g. the FSharp.UMX type string<[<Measure>] 'm> = string pattern). (Issue #19657)
  • Fix [<Struct>] ?param optional parameters could not be passed using the explicit ?param = expr caller-side syntax with a ValueOption value. (Issue #19711, PR #19742)
  • Fix signature conformance: overloaded member with unit parameter M(()) now matches sig member M: unit -> unit. (Issue #19596, PR #19615)
  • Fix --quiet not 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 randomized String.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 / GetAllUsesOfAllSymbolsInFile for overloaded CE [<CustomOperation>] keywords to report the actually-resolved overload instead of the first-registered one. (Issue #11612, Issue #15206, PR #19865)
  • Fix open declaration insertion in .fsx/.fsscript scripts being placed before #r/#load directives, 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 .fs but missing from the .fsi. Such attributes were previously ignored at the consumer side. Under the ErrorOnMissingSignatureAttribute preview 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:3390 when 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, -I after the -- separator are no longer colon-joined with their next token in fsi.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 the s <> null && s.Length = 0 lowering; the empty-string optimization moved from pattern-match compilation to the optimizer so quoted expressions keep op_Equality(s, ""). (Issue #19873)

Added

  • 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.IsPropertyAccessor convenience 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 Invoke parameter names when the function has no recoverable names (e.g. a partial application like System.Func<int, int>((+) 1)), instead of synthetic delegateArg0, 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 ResetCompilerGeneratedNameState to CompilerGlobalState name generators so warm-checker re-compilation can produce fresh-process-identical generated names. (PR #20017)
  • Add experimental hot reload support: --test:HotReloadDeltas baseline capture in fsc, EnC metadata/IL/PDB delta emission, rude-edit detection, and an FSharpChecker session API (CreateHotReloadSession, with AddProject/EmitDelta/Commit/Discard). Off by default; flag-off compilation is unchanged. (Issue #11636, PR #19941)

Improved

  • 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)

Changed

  • 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 (GetObjectData and field-restoring constructor) is now gated behind langversion:11 (LanguageFeature.ExceptionFieldSerializationSupport). With langversion ≤10, exception codegen is unchanged from pre-#19342 behavior. (PR #19746)

Breaking Changes

  • Optimizer: don't inline named functions in debug builds (PR #19548