dotnet / roslyn

The Roslyn .NET compiler provides C# and Visual Basic languages with rich code analysis APIs.
https://docs.microsoft.com/dotnet/csharp/roslyn-sdk/
MIT License
18.95k stars 4.02k forks source link

Unexpected System.NullReferenceException while binding global imports #40911

Open AlekseyTs opened 4 years ago

AlekseyTs commented 4 years ago
        <Fact>
        Public Sub NothingInGlobalImports()
            Dim options = TestOptions.DebugDll.WithGlobalImports({Nothing})

            options.Errors.AssertTheseDiagnostics(<expected/>)

            Dim comp = CreateCompilation("", options:=options)
            comp.AssertTheseDiagnostics(<expected/>)
        End Sub

Observed:

System.NullReferenceException : Object reference not set to an instance of an object.
Stack Trace:
  F:\GitHub\roslyn\src\Compilers\VisualBasic\Portable\Symbols\Source\SourceModuleSymbol.vb(375,0): at Microsoft.CodeAnalysis.VisualBasic.Symbols.SourceModuleSymbol.BindImports(CancellationToken cancellationToken)
  F:\GitHub\roslyn\src\Compilers\VisualBasic\Portable\Symbols\Source\SourceModuleSymbol.vb(349,0): at Microsoft.CodeAnalysis.VisualBasic.Symbols.SourceModuleSymbol.EnsureImportsAreBound(CancellationToken cancellationToken)
  F:\GitHub\roslyn\src\Compilers\VisualBasic\Portable\Symbols\Source\SourceModuleSymbol.vb(625,0): at Microsoft.CodeAnalysis.VisualBasic.Symbols.SourceModuleSymbol.GetAllDeclarationErrors(BindingDiagnosticBag diagnostics, CancellationToken cancellationToken, Boolean& hasExtensionMethods)
  F:\GitHub\roslyn\src\Compilers\VisualBasic\Portable\Symbols\Source\SourceAssemblySymbol.vb(1144,0): at Microsoft.CodeAnalysis.VisualBasic.Symbols.SourceAssemblySymbol.GetAllDeclarationErrors(BindingDiagnosticBag diagnostics, CancellationToken cancellationToken)
  F:\GitHub\roslyn\src\Compilers\VisualBasic\Portable\Compilation\VisualBasicCompilation.vb(2064,0): at Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilation.GetDiagnosticsWithoutFiltering(CompilationStage stage, Boolean includeEarlierStages, BindingDiagnosticBag builder, CancellationToken cancellationToken)
  F:\GitHub\roslyn\src\Compilers\VisualBasic\Portable\Compilation\VisualBasicCompilation.vb(2013,0): at Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilation.GetDiagnostics(CompilationStage stage, Boolean includeEarlierStages, DiagnosticBag diagnostics, CancellationToken cancellationToken)
  F:\GitHub\roslyn\src\Compilers\VisualBasic\Portable\Compilation\VisualBasicCompilation.vb(2002,0): at Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilation.GetDiagnostics(CompilationStage stage, Boolean includeEarlierStages, CancellationToken cancellationToken)
  F:\GitHub\roslyn\src\Compilers\Test\Utilities\VisualBasic\CompilationTestUtils.vb(847,0): at Microsoft.CodeAnalysis.VisualBasic.UnitTests.CompilationUtils.AssertTheseDiagnostics(Compilation compilation, XElement errs, Boolean suppressInfos)
  F:\GitHub\roslyn\src\Compilers\VisualBasic\Test\Semantic\Compilation\VisualBasicCompilationOptionsTests.vb(580,0): at Microsoft.CodeAnalysis.VisualBasic.UnitTests.VisualBasicCompilationOptionsTests.NothingInGlobalImports()

Expected: No exception. It would be Ok to report an error, but that is optional, I think. We can simply ignore the null reference.

Should check similar scenario for C#.

AlekseyTs commented 4 years ago

Also see https://github.com/dotnet/roslyn/pull/40823

sharwell commented 4 years ago

Thanks! I wasn't sure how it actually ended up in this case but it looks like you have a concrete repro with the test.