Skip to content

FSC exception prevents analysis #276

@Smaug123

Description

@Smaug123

Describe the bug

(Very possibly a bug report for dotnet/fsharp.)

This F# file fails to be analyzed, because the analyzer throws within FCS complaining that the type parameter is required to support comparison but does not:

// WorldFreezer.fs
namespace Foo

type Bar<'appEvent> =
    | Wibble of 'appEvent
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Update="FSharp.Core" Version="6.0.0" />
  </ItemGroup>

  <ItemGroup>
    <Compile Include="WorldFreezer.fs" />
  </ItemGroup>

</Project>

Running the analyzers:

#!/bin/sh

nix develop --command dotnet build || exit 1
nix develop --command dotnet restore analyzers/analyzers.fsproj || exit 1

dotnet fsharp-analyzers --verbosity detailed --analyzers-path ./.analyzerpackages/woofware.fsharpanalyzers/*/ --project WoofWare.Zoomies/WoofWare.Zoomies.fsproj --report woofware.sarif
exit_code_2=$?

if [ "$exit_code_2" -eq 0 ]; then
    exit 0
else
    exit "$exit_code_2"
fi

analyzers/analyzers.fsproj:

<Project Sdk="Microsoft.Build.NoTargets/3.7.134"> <!-- This is not a project we want to build. -->

  <PropertyGroup>
    <IsPackable>false</IsPackable>
    <IsPublishable>false</IsPublishable>
    <RestorePackagesPath>../.analyzerpackages/</RestorePackagesPath>
    <TargetFramework>net6.0</TargetFramework>
    <DisableImplicitNuGetFallbackFolder>true</DisableImplicitNuGetFallbackFolder>
    <AutomaticallyUseReferenceAssemblyPackages>false</AutomaticallyUseReferenceAssemblyPackages> <!-- We don't want to build this project, so we do not need the reference assemblies for the framework we chose.-->
  </PropertyGroup>

  <ItemGroup>
    <PackageDownload Include="G-Research.FSharp.Analyzers" Version="[0.20.0]" />
    <PackageDownload Include="WoofWare.FSharpAnalyzers" Version="[0.2.8]" />
  </ItemGroup>

</Project>
{
  "version": 1,
  "isRoot": true,
  "tools": {
    "fantomas": {
      "version": "7.0.3",
      "commands": [
        "fantomas"
      ]
    },
    "fsharp-analyzers": {
      "version": "0.34.1",
      "commands": [
        "fsharp-analyzers"
      ]
    },
    "woofware.nunittestrunner": {
      "version": "0.3.10",
      "commands": [
        "woofware.nunittestrunner"
      ]
    }
  }
}

The enormous stack trace is at the bottom of this report.

Expected behaviour
Analysis runs, and in particular, this line of the StreamReadAnalyzer https://github.com/Smaug123/WoofWare.FSharpAnalyzers/blob/ce51189251779ec9bfa06c79a303d4b2fed1d69f/WoofWare.FSharpAnalyzers/StreamReadAnalyzer.fs#L37 does not throw.

Environment (please complete the following information):

> dotnet info
.NET SDK:
 Version:           10.0.100
 Commit:            b0f34d51fc
 Workload version:  10.0.100-manifests.4eab3e0f
 MSBuild version:   18.0.2+b0f34d51f

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  26.1
 OS Platform: Darwin
 RID:         osx-arm64
 Base Path:   /nix/store/i48qfcm2yxxp4xmx3fb5bavjvl7yj1lz-dotnet-sdk-10.0.100/share/dotnet/sdk/10.0.100/

.NET workloads installed:
There are no installed workloads to display.
Configured to use workload sets when installing new manifests.
No workload sets are installed. Run "dotnet workload restore" to install a workload set.

Host:
  Version:      10.0.0
  Architecture: arm64
  Commit:       b0f34d51fc

.NET SDKs installed:
  10.0.100 [/nix/store/i48qfcm2yxxp4xmx3fb5bavjvl7yj1lz-dotnet-sdk-10.0.100/share/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 10.0.0 [/nix/store/i48qfcm2yxxp4xmx3fb5bavjvl7yj1lz-dotnet-sdk-10.0.100/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 10.0.0 [/nix/store/i48qfcm2yxxp4xmx3fb5bavjvl7yj1lz-dotnet-sdk-10.0.100/share/dotnet/shared/Microsoft.NETCore.App]

Other architectures found:
  None

Environment variables:
  DOTNET_CLI_TELEMETRY_OPTOUT              [1]
  DOTNET_NOLOGO                            [1]
  DOTNET_SKIP_FIRST_TIME_EXPERIENCE        [1]
  DOTNET_SKIP_WORKLOAD_INTEGRITY_CHECK     [1]

global.json file:
  Not found

Additional context
Horrible stack trace:

[20:41:25.316] [FSharp.Analyzers.Cli] info: Running in verbose mode
[20:41:25.323] [FSharp.Analyzers.Cli] info: Treat as Hints: []
[20:41:25.323] [FSharp.Analyzers.Cli] info: Treat as Info: []
[20:41:25.323] [FSharp.Analyzers.Cli] info: Treat as Warning: []
[20:41:25.323] [FSharp.Analyzers.Cli] info: Treat as Error: []
[20:41:25.326] [FSharp.Analyzers.Cli] info: Exclude Files: []
[20:41:25.326] [FSharp.Analyzers.Cli] info: Include Files: []
[20:41:25.330] [FSharp.Analyzers.Cli] info: Loading analyzers from /Users/patrick/Documents/GitHub/WoofWare.Zoomies/.analyzerpackages/woofware.fsharpanalyzers/0.2.8/
[20:41:25.363] [FSharp.Analyzers.Cli] info: Registered 9 analyzers from 1 dlls
[20:41:25.373] [FSharp.Analyzers.Cli] info: Loading project /Users/patrick/Documents/GitHub/WoofWare.Zoomies/WoofWare.Zoomies/WoofWare.Zoomies.fsproj
[20:41:25.631] [MsBuild] info: Build started.
[20:41:25.854] [MsBuild] info: Build succeeded.
[20:41:25.901] [FSharp.Analyzers.Cli] info: Checking project /Users/patrick/Documents/GitHub/WoofWare.Zoomies/WoofWare.Zoomies/WoofWare.Zoomies.fsproj
[20:41:27.298] [FSharp.Analyzers.Cli] info: Running analyzers for /Users/patrick/Documents/GitHub/WoofWare.Zoomies/WoofWare.Zoomies/obj/Debug/net6.0/.NETCoreApp,Version=v6.0.AssemblyAttributes.fs
[20:41:27.298] [FSharp.Analyzers.Cli] info: Running analyzers for /Users/patrick/Documents/GitHub/WoofWare.Zoomies/WoofWare.Zoomies/WorldFreezer.fs
[20:41:27.300] [FSharp.Analyzers.Cli] info: Running analyzers for /Users/patrick/Documents/GitHub/WoofWare.Zoomies/WoofWare.Zoomies/obj/Debug/net6.0/WoofWare.Zoomies.AssemblyInfo.fs
[20:41:27.300] [FSharp.Analyzers.Cli] info: Running analyzers for /Users/patrick/Documents/GitHub/WoofWare.Zoomies/WoofWare.Zoomies/obj/Debug/net6.0/WoofWare.Zoomies.Version.fs
[20:41:27.345] [FSharp.Analyzers.Cli] critical: Unhandled exception:                                                                                                                                                   FSharp.Compiler.DiagnosticsLogger+ReportedError: The exception has been reported. This internal exception should now be caught at an error recovery point on the stack. Original message: ConstraintSolverMissingConstraint
  ({ includeStaticParametersInTypeNames = false
     openTopPathsSorted =
      Internal.Utilities.Library.InterruptibleLazy`1[Microsoft.FSharp.Collections.FSharpList`1[Microsoft.FSharp.Collections.FSharpList`1[System.String]]]
     openTopPathsRaw = []
     shortTypeNames = false
     suppressNestedTypes = false
     maxMembers = None
     showObsoleteMembers = false
     showHiddenMembers = false
     showTyparBinding = false
     showInferenceTyparAnnotations = false
     suppressInlineKeyword = true
     suppressMutableKeyword = false
     showMemberContainers = false
     shortConstraints = false
     useColonForReturnType = false
     showAttributes = false
     showCsharpCodeAnalysisAttributes = false
     showOverrides = true
     showStaticallyResolvedTyparAnnotations = true
     showNullnessAnnotations = None
     abbreviateAdditionalConstraints = false
     showTyparDefaultConstraints = false
     showDocumentation = false
     shrinkOverloads = true
     printVerboseSignatures = false
     escapeKeywordNames = false
     g = <TcGlobals>
     contextAccessibility = public
     generatedValueLayout = <fun:Empty@3244>
     genericParameterStyle = Implicit }, appEvent,
   SupportsComparison (4,6--4,12), (4,6--4,12), (4,6--4,12)))
   at FSharp.Compiler.DiagnosticsLogger.DiagnosticsLoggerExtensions.DiagnosticsLogger.Error[T](DiagnosticsLogger x, Exception exn) in D:\a\_work\1\s\src\fsharp\src\Compiler\Facilities\DiagnosticsLogger.fs:line 475
   at FSharp.Compiler.DiagnosticsLogger.CommitOperationResult[T](OperationResult`1 res) in D:\a\_work\1\s\src\fsharp\src\Compiler\Facilities\DiagnosticsLogger.fs:line 664
   at FSharp.Compiler.Symbols.FSharpExprConvert.GetWitnessArgs(SymbolEnv cenv, ExprTranslationEnv env, ValRef vref, Range m, FSharpList`1 tps, FSharpList`1 tyargs) in D:\a\_work\1\s\src\fsharp\src\Compiler\Symbols\E
xprs.fs:line 519
   at FSharp.Compiler.Symbols.FSharpExprConvert.ConvModuleValueOrMemberUseLinear(SymbolEnv cenv, ExprTranslationEnv env, Expr expr, ValRef vref, ValUseFlag vFlags, FSharpList`1 tyargs, FSharpList`1 curriedArgs, FSha
rpFunc`2 contF) in D:\a\_work\1\s\src\fsharp\src\Compiler\Symbols\Exprs.fs:line 504
   at FSharp.Compiler.Symbols.FSharpExprConvert.ConvExprOnDemand@1339.Invoke(Unit unitVar0) in D:\a\_work\1\s\src\fsharp\src\Compiler\Symbols\Exprs.fs:line 1339
   at FSharp.Compiler.Symbols.FSharpExpr.get_E() in D:\a\_work\1\s\src\fsharp\src\Compiler\Symbols\Exprs.fs:line 153
   at FSharp.Compiler.Symbols.FSharpExprPatterns.|ObjectExpr|_|(FSharpExpr e) in D:\a\_work\1\s\src\fsharp\src\Compiler\Symbols\Exprs.fs:line 1489
   at WoofWare.FSharpAnalyzers.ThrowingInDisposeAnalyzer.findObjectExpressions(FSharpExpr expr, List`1 violations) in /_//WoofWare.FSharpAnalyzers/ThrowingInDisposeAnalyzer.fs:line 130
   at WoofWare.FSharpAnalyzers.ThrowingInDisposeAnalyzer.walkDeclarations@175(List`1 violations, FSharpList`1 decls) in /_//WoofWare.FSharpAnalyzers/ThrowingInDisposeAnalyzer.fs:line 187
   at WoofWare.FSharpAnalyzers.ThrowingInDisposeAnalyzer.walkDeclarations@175(List`1 violations, FSharpList`1 decls) in /_//WoofWare.FSharpAnalyzers/ThrowingInDisposeAnalyzer.fs:line 179
   at WoofWare.FSharpAnalyzers.ThrowingInDisposeAnalyzer.analyze(FSharpImplementationFileContents typedTree) in /_//WoofWare.FSharpAnalyzers/ThrowingInDisposeAnalyzer.fs:line 193
   at WoofWare.FSharpAnalyzers.ThrowingInDisposeAnalyzer.cliAnalyzer@220-13.Invoke(Unit unitVar) in /_//WoofWare.FSharpAnalyzers/ThrowingInDisposeAnalyzer.fs:line 220
   at Microsoft.FSharp.Control.AsyncPrimitives.CallThenInvoke[T,TResult](AsyncActivation`1 ctxt, TResult result1, FSharpFunc`2 part2) in D:\a\_work\1\s\src\fsharp\src\FSharp.Core\async.fs:line 509
   at Microsoft.FSharp.Control.Trampoline.Execute(FSharpFunc`2 firstAction) in D:\a\_work\1\s\src\fsharp\src\FSharp.Core\async.fs:line 112
--- End of stack trace from previous location ---
   at Microsoft.FSharp.Control.AsyncResult`1.Commit() in D:\a\_work\1\s\src\fsharp\src\FSharp.Core\async.fs:line 453
   at Microsoft.FSharp.Control.AsyncPrimitives.QueueAsyncAndWaitForResultSynchronously[a](CancellationToken token, FSharpAsync`1 computation, FSharpOption`1 timeout) in D:\a\_work\1\s\src\fsharp\src\FSharp.Core\asyn
c.fs:line 1138
   at Microsoft.FSharp.Control.AsyncPrimitives.RunSynchronously[T](CancellationToken cancellationToken, FSharpAsync`1 computation, FSharpOption`1 timeout) in D:\a\_work\1\s\src\fsharp\src\FSharp.Core\async.fs:line 1
165
   at Microsoft.FSharp.Control.FSharpAsync.RunSynchronously[T](FSharpAsync`1 computation, FSharpOption`1 timeout, FSharpOption`1 cancellationToken) in D:\a\_work\1\s\src\fsharp\src\FSharp.Core\async.fs:line 1514
   at Program.results$cont@1048(ToolsPath toolsPath, FSharpOption`1 binlogPath, SeverityMappings severityMapping, FSharpChoice`2 exclInclFiles, FSharpList`1 properties, Client`2 client, FSharpList`1 scripts, FSharpList`1 projects, Unit unitVar) in /_//src/FSharp.Analyzers.Cli/Program.fs:line 1095
   at Program.main(String[] argv) in /_//src/FSharp.Analyzers.Cli/Program.fs:line 1045

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions