tl-dr
tl-dr

Reputation: 21

F# discriminated unions simple use raises AOT and trimming warnings on publish

F#, .NET 8 console app with DUs generates AOT & trimming warnings even for simple usage.

I am creating an F#, .NET 8 (SDK 8.0.302) console app and publish as a single file with AOT, trimming. I defined a discriminated union and used it in few trivial functions. But this raises AOT and trimming warnings when I run dotnet publish command. Is this expected or am I missing something obvious? I am running:

dotnet publish -c Release -r win-x64 --self-contained true -p:PublishAot=true -p:PublishTrimmed=true -o ./publish

And the code is:

type AnyDU = X | Y

let f1 () = let unrelated = System.DateTime.Now in ()
let f2 () = let works = X in ()
let f3 () = let works = X in match works with | X -> 0 | _ -> 1
let f4 () = let unrelated = System.DateTime.Now in let fails = X in ()
let f5 () = let fails = X in if fails = X then 1 else 0

[<EntryPoint>]
let main _ =
    f1 () |> ignore // no warnings. unrelated.
    f2 () |> ignore // no warnings.
    f3 () |> ignore // no warnings.
    f4 () |> ignore // IL3053 and IL2104 warnings.
    f5 () |> ignore // IL3053 and IL2104 warnings.
    0

The fsproj file has following settings:

    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <IsAotCompatible>true</IsAotCompatible>
    <PublishAot>true</PublishAot>
    <PublishTrimmed>true</PublishTrimmed>

When I added <TrimmerSingleWarn>false</TrimmerSingleWarn> to fsproj, I got around 50 warnings mostly related to reflection and print formatting with warning codes: IL2055, IL2060, IL2067, IL2070, IL2072, IL2075, IL2080, IL3050.

Also, adding [<Struct>] attribute to the DU didn't help.

The example code is simplified. My real DU structure and usage is fairly complex. So enums instead of DUs is not an option.

Upvotes: 2

Views: 251

Answers (0)

Related Questions