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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions