Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

False negative with TailCall attribute #18365

Open
BoundedChenn31 opened this issue Mar 6, 2025 · 0 comments
Open

False negative with TailCall attribute #18365

BoundedChenn31 opened this issue Mar 6, 2025 · 0 comments

Comments

@BoundedChenn31
Copy link
Contributor

Repro steps

Consider the following code (the simplest example I could craft, don't expect anything sane):

type Value =
    { Code: string }

[<TailCall>]
let rec fooArray (values: Value[], code: string) =
    match values with
    | [||] -> seq { code }
    | values ->
        let replicatedValues =
            values
            |> Array.map (fun value -> fooArray (values, value.Code))
        replicatedValues |> Seq.concat

fooArray isn't called in tail recursive manner, however compiler does not issue a warning.

Curiously, after rewrite to Seq functions compiler does issue Warning FS3569 : The member or function 'fooSeq' has the 'TailCallAttribute' attribute, but is not being used in a tail recursive way.

[<TailCall>]
let rec fooSeq (values: Value[], code: string) =
    match values with
    | [||] -> seq { code }
    | values ->
        let replicatedValues =
            values
            |> Seq.map (fun value -> fooSeq (values, value.Code))
            |> Seq.toArray
        replicatedValues |> Seq.concat

Looking at decompiled code of assembly I would guess that compiler tries to optimise Array.map and TailCall analyser mistakes the result for tail-recursive function.

Expected behavior

Warning is issued for first code example.

Actual behavior

No warning.

Known workarounds

.

Related information

Provide any related information (optional):
.NET SDK 9.0.200

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: New
Development

No branches or pull requests

1 participant