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

Generic extension method on generic type with LangVersion=preview and Nullable=enable crashes compiler with NullReferenceException in ConstraintsHelper.CheckConstraints when accessing non-existent member of extension method's name on type #74404

Closed
just-ero opened this issue Jul 16, 2024 · 0 comments · Fixed by #74487
Assignees
Milestone

Comments

@just-ero
Copy link

just-ero commented Jul 16, 2024

Version Used

Visual Studio Code: 1.91.1, f1e16e1e6214d7c44d078b1f0607b2388f29d729, x64
Compiler: 4.11.0-3.24320.2 (adce315)
C# Extension: v2.38.16
C# Dev Kit Extension: v1.9.2

Steps to Reproduce

  1. Open any C# project in Visual Studio Code.
  2. Add the following code:
    class Foo<T>;
    static class FooExt
    {
        public static void Bar<T>(this Foo<T> foo)
        {
            foo.Bar = 42;
        }
    }
  3. Set LangVersion to preview and Nullable to enable in the project file.
  4. Return to the code and observe the crash.

Full exception message
[Error - 6:19:22 PM] [LanguageServerHost] System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.CodeAnalysis.CSharp.Symbols.ConstraintsHelper.CheckConstraints(Symbol containingSymbol, CheckConstraintsArgs& args, TypeMap substitution, TypeParameterSymbol typeParameter, TypeWithAnnotations typeArgument, ArrayBuilder`1 diagnosticsBuilder, ArrayBuilder`1 nullabilityDiagnosticsBuilderOpt, ArrayBuilder`1& useSiteDiagnosticsBuilder, HashSet`1 ignoreTypeConstraintsDependentOnTypeParametersOpt) in /_/src/Compilers/CSharp/Portable/Symbols/ConstraintsHelper.cs:line 1062
   at Microsoft.CodeAnalysis.CSharp.Binder.<GetUniqueSignatureFromMethodGroup>g__satisfiesConstraintChecks|545_1(MethodSymbol method) in /_/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs:line 10603
   at Microsoft.CodeAnalysis.CSharp.Binder.GetUniqueSignatureFromMethodGroup(BoundMethodGroup node) in /_/src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs:line 10562
   at Microsoft.CodeAnalysis.CSharp.Symbols.FunctionTypeSymbol.GetInternalDelegateType() in /_/src/Compilers/CSharp/Portable/Symbols/FunctionTypeSymbol.cs:line 85
   at Microsoft.CodeAnalysis.CSharp.NullableWalker.ExpressionAndSymbolEqualityComparer.GetHashCode(ValueTuple`2 obj) in /_/src/Compilers/CSharp/Portable/FlowAnalysis/NullableWalker.cs:line 12477
   at Microsoft.CodeAnalysis.CSharp.NullabilityRewriter.GetUpdatedSymbol[T](BoundNode expr, T sym) in /_/src/Compilers/CSharp/Portable/BoundTree/NullabilityRewriter.cs:line 87
   at Microsoft.CodeAnalysis.CSharp.NullabilityRewriter.VisitMethodGroup(BoundMethodGroup node) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 13825
   at Microsoft.CodeAnalysis.CSharp.NullabilityRewriter.VisitBadExpression(BoundBadExpression node) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 12397
   at Microsoft.CodeAnalysis.CSharp.NullabilityRewriter.VisitAssignmentOperator(BoundAssignmentOperator node) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 12736
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitExpressionStatement(BoundExpressionStatement node) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 11290
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[T](ImmutableArray`1 list) in /_/src/Compilers/CSharp/Portable/BoundTree/BoundTreeRewriter.cs:line 39
   at Microsoft.CodeAnalysis.CSharp.NullabilityRewriter.VisitBlock(BoundBlock node) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 13284
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitNonConstructorMethodBody(BoundNonConstructorMethodBody node) in /_/src/Compilers/CSharp/Portable/Generated/BoundNodes.xml.Generated.cs:line 12137
   at Microsoft.CodeAnalysis.CSharp.NullableWalker.Rewrite(ImmutableDictionary`2 updatedNullabilities, SnapshotManager snapshotManager, BoundNode node, ImmutableDictionary`2& remappedSymbols) in /_/src/Compilers/CSharp/Portable/FlowAnalysis/NullableWalker.cs:line 1606
   at Microsoft.CodeAnalysis.CSharp.NullableWalker.AnalyzeAndRewrite(CSharpCompilation compilation, Symbol symbol, BoundNode node, Binder binder, VariableState initialState, DiagnosticBag diagnostics, Boolean createSnapshots, SnapshotManager& snapshotManager, ImmutableDictionary`2& remappedSymbols) in /_/src/Compilers/CSharp/Portable/FlowAnalysis/NullableWalker.cs:line 1486
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.BindMethodBody(MethodSymbol method, TypeCompilationState compilationState, BindingDiagnosticBag diagnostics, Boolean includeInitializersInBody, BoundNode initializersBody, Boolean reportNullableDiagnostics, ImportChain& importChain, Boolean& originalBodyNested, Boolean& prependedDefaultValueTypeConstructorInitializer, InitialState& forSemanticModel) in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 1799
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState) in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 991
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType) in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 530
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.VisitNamedType(NamedTypeSymbol symbol, TypeCompilationState arg) in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 420
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamespace(NamespaceSymbol symbol) in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 397
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.VisitNamespace(NamespaceSymbol symbol, TypeCompilationState arg) in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 374
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamespace(NamespaceSymbol symbol) in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 397
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethodBodies(CSharpCompilation compilation, PEModuleBuilder moduleBeingBuiltOpt, Boolean emittingPdb, Boolean hasDeclarationErrors, Boolean emitMethodBodies, BindingDiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken) in /_/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs:line 123
   at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetDiagnosticsForMethodBodiesInTree(SyntaxTree tree, Nullable`1 span, CancellationToken cancellationToken) in /_/src/Compilers/CSharp/Portable/Compilation/CSharpCompilation.cs:line 3107
   at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetDiagnosticsForSyntaxTree(CompilationStage stage, SyntaxTree syntaxTree, Nullable`1 filterSpanWithinTree, Boolean includeEarlierStages, CancellationToken cancellationToken) in /_/src/Compilers/CSharp/Portable/Compilation/CSharpCompilation.cs:line 3322
   at Microsoft.CodeAnalysis.Diagnostics.CompilationWithAnalyzers.GetCompilationEventsForSingleFileAnalysis(Compilation compilation, AnalysisScope analysisScope, ImmutableArray`1 additionalFiles, Boolean hasAnyActionsRequiringCompilationEvents, CancellationToken cancellationToken) in /_/src/Compilers/Core/Portable/DiagnosticAnalyzer/CompilationWithAnalyzers.cs:line 1019
   at Microsoft.CodeAnalysis.Diagnostics.CompilationWithAnalyzers.ComputeAnalyzerDiagnosticsAsync(AnalysisScope analysisScope, CancellationToken cancellationToken) in /_/src/Compilers/Core/Portable/DiagnosticAnalyzer/CompilationWithAnalyzers.cs:line 767
   at Microsoft.CodeAnalysis.Diagnostics.CompilationWithAnalyzers.GetAnalysisResultCoreAsync(SemanticModel model, Nullable`1 filterSpan, ImmutableArray`1 analyzers, CancellationToken cancellationToken) in /_/src/Compilers/Core/Portable/DiagnosticAnalyzer/CompilationWithAnalyzers.cs:line 654
   at Microsoft.CodeAnalysis.Diagnostics.Extensions.GetAnalysisResultAsync(CompilationWithAnalyzers compilationWithAnalyzers, DocumentAnalysisScope documentAnalysisScope, CancellationToken cancellationToken) in /_/src/Workspaces/Core/Portable/Diagnostics/Extensions.cs:line 356
   at Microsoft.CodeAnalysis.Diagnostics.Extensions.GetAnalysisResultAsync(CompilationWithAnalyzers compilationWithAnalyzers, DocumentAnalysisScope documentAnalysisScope, Project project, DiagnosticAnalyzerInfoCache analyzerInfoCache, CancellationToken cancellationToken) in /_/src/Workspaces/Core/Portable/Diagnostics/Extensions.cs:line 323
   at Microsoft.CodeAnalysis.Diagnostics.InProcOrRemoteHostAnalyzerRunner.AnalyzeInProcAsync(DocumentAnalysisScope documentAnalysisScope, Project project, CompilationWithAnalyzers compilationWithAnalyzers, RemoteHostClient client, Boolean logPerformanceInfo, Boolean getTelemetryInfo, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.InProcOrRemoteHostAnalyzerRunner.cs:line 126
   at Microsoft.CodeAnalysis.Diagnostics.InProcOrRemoteHostAnalyzerRunner.<>c__DisplayClass8_0.<<AnalyzeAsync>g__AnalyzeCoreAsync|0>d.MoveNext() in /_/src/LanguageServer/Protocol/Features/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.InProcOrRemoteHostAnalyzerRunner.cs:line 87
--- End of stack trace from previous location ---
   at Microsoft.CodeAnalysis.Diagnostics.InProcOrRemoteHostAnalyzerRunner.AnalyzeAsync(DocumentAnalysisScope documentAnalysisScope, Project project, CompilationWithAnalyzers compilationWithAnalyzers, Boolean isExplicit, Boolean forceExecuteAllAnalyzers, Boolean logPerformanceInfo, Boolean getTelemetryInfo, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.InProcOrRemoteHostAnalyzerRunner.cs:line 72
   at Microsoft.CodeAnalysis.Diagnostics.DocumentAnalysisExecutor.GetAnalysisResultAsync(DocumentAnalysisScope analysisScope, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/Diagnostics/DocumentAnalysisExecutor.cs:line 179
   at Microsoft.CodeAnalysis.Diagnostics.DocumentAnalysisExecutor.GetSemanticDiagnosticsAsync(DiagnosticAnalyzer analyzer, Boolean isCompilerAnalyzer, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/Diagnostics/DocumentAnalysisExecutor.cs:line 282
   at Microsoft.CodeAnalysis.Diagnostics.DocumentAnalysisExecutor.ComputeDiagnosticsAsync(DiagnosticAnalyzer analyzer, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/Diagnostics/DocumentAnalysisExecutor.cs:line 146
   at Microsoft.CodeAnalysis.Diagnostics.EngineV2.DiagnosticIncrementalAnalyzer.LatestDiagnosticsForSpanGetter.ComputeDocumentDiagnosticsForAnalyzerCoreAsync(DiagnosticAnalyzer analyzer, DocumentAnalysisExecutor executor, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_GetDiagnosticsForSpan.cs:line 561
   at Microsoft.CodeAnalysis.Diagnostics.EngineV2.DiagnosticIncrementalAnalyzer.LatestDiagnosticsForSpanGetter.ComputeDocumentDiagnosticsCoreAsync(DocumentAnalysisExecutor executor, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_GetDiagnosticsForSpan.cs:line 547
   at Microsoft.CodeAnalysis.Diagnostics.EngineV2.DiagnosticIncrementalAnalyzer.LatestDiagnosticsForSpanGetter.ComputeDocumentDiagnosticsAsync(ImmutableArray`1 analyzersWithState, AnalysisKind kind, Nullable`1 span, ArrayBuilder`1 builder, Boolean incrementalAnalysis, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_GetDiagnosticsForSpan.cs:line 438
   at Microsoft.CodeAnalysis.Diagnostics.EngineV2.DiagnosticIncrementalAnalyzer.LatestDiagnosticsForSpanGetter.TryGetAsync(ArrayBuilder`1 list, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_GetDiagnosticsForSpan.cs:line 274
   at Microsoft.CodeAnalysis.Diagnostics.EngineV2.DiagnosticIncrementalAnalyzer.TryAppendDiagnosticsForSpanAsync(TextDocument document, Nullable`1 range, ArrayBuilder`1 result, Func`2 shouldIncludeDiagnostic, Boolean includeSuppressedDiagnostics, Boolean includeCompilerDiagnostics, ICodeActionRequestPriorityProvider priorityProvider, Boolean blockForData, DiagnosticKind diagnosticKinds, Boolean isExplicit, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_GetDiagnosticsForSpan.cs:line 34
   at Microsoft.CodeAnalysis.Diagnostics.EngineV2.DiagnosticIncrementalAnalyzer.GetDiagnosticsForSpanAsync(TextDocument document, Nullable`1 range, Func`2 shouldIncludeDiagnostic, Boolean includeSuppressedDiagnostics, Boolean includeCompilerDiagnostics, ICodeActionRequestPriorityProvider priorityProvider, Boolean blockForData, DiagnosticKind diagnosticKinds, Boolean isExplicit, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer_GetDiagnosticsForSpan.cs:line 50
   at Microsoft.CodeAnalysis.Diagnostics.DiagnosticAnalyzerService.GetDiagnosticsForSpanAsync(TextDocument document, Nullable`1 range, Func`2 shouldIncludeDiagnostic, Boolean includeCompilerDiagnostics, Boolean includeSuppressedDiagnostics, ICodeActionRequestPriorityProvider priorityProvider, DiagnosticKind diagnosticKinds, Boolean isExplicit, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/Diagnostics/DiagnosticAnalyzerService.cs:line 112
   at Microsoft.CodeAnalysis.CodeFixes.CodeFixService.StreamFixesAsync(TextDocument document, TextSpan range, ICodeActionRequestPriorityProvider priorityProvider, CodeActionOptionsProvider fallbackOptions, CancellationToken cancellationToken)+MoveNext() in /_/src/LanguageServer/Protocol/Features/CodeFixes/CodeFixService.cs:line 197
   at Microsoft.CodeAnalysis.CodeFixes.CodeFixService.StreamFixesAsync(TextDocument document, TextSpan range, ICodeActionRequestPriorityProvider priorityProvider, CodeActionOptionsProvider fallbackOptions, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at Microsoft.CodeAnalysis.Shared.Extensions.IAsyncEnumerableExtensions.ToImmutableArrayAsync[T](IAsyncEnumerable`1 values, CancellationToken cancellationToken) in /_/src/Workspaces/Core/Portable/Shared/Extensions/IAsyncEnumerableExtensions.cs:line 39
   at Microsoft.CodeAnalysis.Shared.Extensions.IAsyncEnumerableExtensions.ToImmutableArrayAsync[T](IAsyncEnumerable`1 values, CancellationToken cancellationToken) in /_/src/Workspaces/Core/Portable/Shared/Extensions/IAsyncEnumerableExtensions.cs:line 39
   at Microsoft.CodeAnalysis.UnifiedSuggestions.UnifiedSuggestedActionsSource.GetFilterAndOrderCodeFixesAsync(Workspace workspace, ICodeFixService codeFixService, TextDocument document, TextSpan selection, ICodeActionRequestPriorityProvider priorityProvider, CodeActionOptionsProvider fallbackOptions, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Features/UnifiedSuggestions/UnifiedSuggestedActionsSource.cs:line 49
   at Microsoft.CodeAnalysis.LanguageServer.Handler.CodeActions.CodeActionHelpers.GetActionSetsAsync(TextDocument document, CodeActionOptionsProvider fallbackOptions, ICodeFixService codeFixService, ICodeRefactoringService codeRefactoringService, Range selection, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Handler/CodeActions/CodeActionHelpers.cs:line 395
   at Microsoft.CodeAnalysis.LanguageServer.Handler.CodeActions.CodeActionHelpers.GetVSCodeActionsAsync(CodeActionParams request, TextDocument document, CodeActionOptionsProvider fallbackOptions, ICodeFixService codeFixService, ICodeRefactoringService codeRefactoringService, Boolean hasVsLspCapability, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Handler/CodeActions/CodeActionHelpers.cs:line 40
   at Microsoft.CodeAnalysis.LanguageServer.Handler.CodeActionsHandler.HandleRequestAsync(CodeActionParams request, RequestContext context, CancellationToken cancellationToken) in /_/src/LanguageServer/Protocol/Handler/CodeActions/CodeActionsHandler.cs:line 59
   at Microsoft.CommonLanguageServerProtocol.Framework.QueueItem`3.StartRequestAsync(TRequestContext context, IMethodHandler handler, CancellationToken cancellationToken)
@dotnet-issue-labeler dotnet-issue-labeler bot added Area-Compilers untriaged Issues and PRs which have not yet been triaged by a lead labels Jul 16, 2024
@jaredpar jaredpar added Bug and removed untriaged Issues and PRs which have not yet been triaged by a lead labels Jul 22, 2024
@jaredpar jaredpar added this to the 17.12 milestone Jul 22, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants