Skip to content

Commit

Permalink
Fix missing TailCall warning in Sequential in use scope, #17897 (#17927)
Browse files Browse the repository at this point in the history
  • Loading branch information
dawedawe authored Oct 29, 2024
1 parent 6860329 commit d566f53
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 0 deletions.
1 change: 1 addition & 0 deletions docs/release-notes/.FSharp.Compiler.Service/9.0.200.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
### Fixed

* Fix missing TailCall warning in Sequential in use scope ([PR #17927](https://github.com/dotnet/fsharp/pull/17927))
* Fix false negatives for passing null to "obj" arguments. Only "obj | null" can now subsume any type ([PR #17757](https://github.com/dotnet/fsharp/pull/17757))
* Fix internal error when calling 'AddSingleton' and other overloads only differing in generic arity ([PR #17804](https://github.com/dotnet/fsharp/pull/17804))
* Fix extension methods support for non-reference system assemblies ([PR #17799](https://github.com/dotnet/fsharp/pull/17799))
Expand Down
1 change: 1 addition & 0 deletions src/Compiler/Checking/TailCallChecks.fs
Original file line number Diff line number Diff line change
Expand Up @@ -792,6 +792,7 @@ let CheckModuleBinding cenv (isRec: bool) (TBind _ as bind) =
// warn for recursive calls in TryWith/TryFinally operations
exprs |> Seq.iter (checkTailCall true)
| Expr.Op(args = exprs) -> exprs |> Seq.iter (checkTailCall insideSubBindingOrTry)
| Expr.Sequential(expr2 = expr2) -> checkTailCall insideSubBindingOrTry expr2
| _ -> ()

checkTailCall false bodyExpr
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,34 @@ namespace N
"The member or function 'f' has the 'TailCallAttribute' attribute, but is not being used in a tail recursive way." }
]

[<FSharp.Test.FactForNETCOREAPP>]
let ``Warn for rec call in Sequential in use scope`` () =
"""
namespace N
module M =
[<TailCall>]
let rec f () =
let path = System.IO.Path.GetTempFileName()
use file = System.IO.File.Open(path, System.IO.FileMode.Open)
printfn "Hi!"
f ()
"""
|> FSharp
|> withLangVersion80
|> compile
|> shouldFail
|> withResults [
{ Error = Warning 3569
Range = { StartLine = 11
StartColumn = 13
EndLine = 11
EndColumn = 14 }
Message =
"The member or function 'f' has the 'TailCallAttribute' attribute, but is not being used in a tail recursive way." }
]

[<FSharp.Test.FactForNETCOREAPP>]
let ``Warn for invalid tailcalls in async expression`` () =
"""
Expand Down

0 comments on commit d566f53

Please sign in to comment.