Skip to content

System.InvalidCastException in DynamicallyAccessedMembersAnalyzer when using C# 14 extensions #115949

Open
@PhilippNaused

Description

@PhilippNaused

Description

ILLink.RoslynAnalyzer.DynamicallyAccessedMembersAnalyzer fails if you use a C#14 extension with IsAotCompatible=true

Reproduction Steps

build this:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net8.0</TargetFrameworks>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <LangVersion>preview</LangVersion>
    <IsAotCompatible>true</IsAotCompatible>
  </PropertyGroup>
</Project>
public static class Extensions
{
    extension(string source)
    {
        public bool IsNullOrEmpty() => string.IsNullOrEmpty(source);
    }
}

Expected behavior

No warnings or errors

Actual behavior

CSC : warning AD0001: Analyzer 'ILLink.RoslynAnalyzer.DynamicallyAccessedMembersAnalyzer' threw an exception of type 'System.InvalidCastException' with message 'Unable to cast object of type 'Microsoft.CodeAnalysis.CSharp.Symbols.PublicModel.NonErrorNamedTypeSymbol' to type 'Microsoft.CodeAnalysis.IMethodSymbol'.'. [C:\Users\Admin\source\repos\Test1\Test1.csproj::TargetFramework=net8.0]
  Exception occurred with following context: (TaskId:128)
  Compilation: Test1 (TaskId:128)
  ISymbol: IsNullOrEmpty (Method) (TaskId:128)
  System.InvalidCastException: Unable to cast object of type 'Microsoft.CodeAnalysis.CSharp.Symbols.PublicModel.NonErrorNamedTypeSymbol' to type 'Microsoft.CodeAnalysis.IMethodSymbol'. (TaskId:128)
  at ILLink.Shared.TypeSystemProxy.ParameterProxy..ctor(IParameterSymbol parameter) (TaskId:128)
  at ILLink.RoslynAnalyzer.TrimAnalysis.TrimAnalysisVisitor.GetParameterTargetValue(IParameterSymbol parameter) (TaskId:128)
  at ILLink.RoslynAnalyzer.DataFlow.OperationWalker`2.Visit(IOperation operation, TArgument argument) (TaskId:128)
  at ILLink.RoslynAnalyzer.TrimAnalysis.TrimAnalysisVisitor.Visit(IOperation operation, LocalDataFlowState`2 argument) (TaskId:128)
  at ILLink.RoslynAnalyzer.DataFlow.LocalDataFlowVisitor`2.ProcessMethodCall(IOperation operation, IMethodSymbol method, IOperation instance, ImmutableArray`1 arguments, LocalDataFlowState`2 state) (TaskId:128)
  at ILLink.RoslynAnalyzer.DataFlow.LocalDataFlowVisitor`2.VisitInvocation(IInvocationOperation operation, LocalDataFlowState`2 state) (TaskId:128)
  at ILLink.RoslynAnalyzer.DataFlow.OperationWalker`2.Visit(IOperation operation, TArgument argument) (TaskId:128)
  at ILLink.RoslynAnalyzer.TrimAnalysis.TrimAnalysisVisitor.Visit(IOperation operation, LocalDataFlowState`2 argument) (TaskId:128)
  at ILLink.RoslynAnalyzer.DataFlow.LocalDataFlowVisitor`2.Transfer(BlockProxy block, LocalDataFlowState`2 state) (TaskId:128)
  at ILLink.Shared.DataFlow.ForwardDataFlowAnalysis`7.Fixpoint(TControlFlowGraph cfg, TLattice lattice, TTransfer transfer) (TaskId:128)
  at ILLink.RoslynAnalyzer.DataFlow.LocalDataFlowAnalysis`3.AnalyzeMethod(MethodBodyValue method, InterproceduralState`2& interproceduralState) (TaskId:128)
  at ILLink.RoslynAnalyzer.DataFlow.LocalDataFlowAnalysis`3.InterproceduralAnalyze() (TaskId:128)
  at ILLink.RoslynAnalyzer.DynamicallyAccessedMembersAnalyzer.<>c.<Initialize>b__8_1(OperationBlockAnalysisContext context) (TaskId:128)
  at Microsoft.CodeAnalysis.Diagnostics.AnalyzerExecutor.ExecuteOperationBlockActions(ImmutableArray`1 startActions, ImmutableArray`1 actions, ImmutableArray`1 endActions, DiagnosticAnalyzer analyzer, SyntaxNode declaredNode, ISymbol declaredSymbol, ImmutableArray`1 operationBlocks, ImmutableArray`1 operations, SemanticModel semanticModel, Nullable`1 filterSpan, Boolean isGeneratedCode, CancellationToken cancellationToken) (TaskId:128)

Regression?

Unlikely

Known Workarounds

No response

Configuration

.NET SDK:
Version: 10.0.100-preview.4.25258.110
Commit: c22dcd0c7a
Workload version: 10.0.100-manifests.e9b6aa6e
MSBuild version: 17.15.0-preview-25258-110+c22dcd0c7

Runtime Environment:
OS Name: Windows
OS Version: 10.0.26100
OS Platform: Windows
RID: win-x64
Base Path: C:\Program Files\dotnet\sdk\10.0.100-preview.4.25258.110\

Other information

Method = new ((IMethodSymbol) parameter.ContainingSymbol);

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-Tools-ILLink.NET linker development as well as trimming analyzers

    Type

    No type

    Projects

    Status

    No status

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions