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

.\build.cmd -subset clr+libs -config release fails in ConfigurationBindingGenerator #88918

Closed
tannergooding opened this issue Jul 14, 2023 · 13 comments · Fixed by #89150
Closed
Assignees
Labels
area-Extensions-Configuration in-pr There is an active PR which will close this issue when it is merged source-generator Indicates an issue with a source generator feature
Milestone

Comments

@tannergooding
Copy link
Member

As per the title, currently running .\build.cmd -subset clr+libs -config release currently fails with the following:

CSC : error CS8785: Generator 'ConfigurationBindingGenerator' failed to generate source. It will not contribute to the
output and compilation errors may occur as a result. Exception was of type 'ArgumentOutOfRangeException' with message '
repeatCount ('-4') must be a non-negative value. (Parameter 'repeatCount') [D:\Users\tagoo\source\repos\runtime\src\lib
raries\Microsoft.Extensions.Logging.Configuration\src\Microsoft.Extensions.Logging.Configuration.csproj::TargetFramewor
k=net8.0]
D:\Users\tagoo\source\repos\runtime\src\libraries\Microsoft.Extensions.Logging.Configuration\src\LoggerFilterConfigureO
ptions.cs(54,72): error IL2026: Using member 'Microsoft.Extensions.Configuration.ConfigurationBinder.GetValue<T>(IConfi
guration, String, T)' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application c
ode. In case the type is non-primitive, the trimmer cannot statically analyze the object's type so its members may be t
rimmed. [D:\Users\tagoo\source\repos\runtime\src\libraries\Microsoft.Extensions.Logging.Configuration\src\Microsoft.Ext
ensions.Logging.Configuration.csproj::TargetFramework=net8.0
@ghost ghost added the untriaged New issue has not been triaged by the area owner label Jul 14, 2023
@ghost
Copy link

ghost commented Jul 14, 2023

Tagging subscribers to this area: @dotnet/area-extensions-configuration
See info in area-owners.md if you want to be subscribed.

Issue Details

As per the title, currently running .\build.cmd -subset clr+libs -config release currently fails with the following:

CSC : error CS8785: Generator 'ConfigurationBindingGenerator' failed to generate source. It will not contribute to the
output and compilation errors may occur as a result. Exception was of type 'ArgumentOutOfRangeException' with message '
repeatCount ('-4') must be a non-negative value. (Parameter 'repeatCount') [D:\Users\tagoo\source\repos\runtime\src\lib
raries\Microsoft.Extensions.Logging.Configuration\src\Microsoft.Extensions.Logging.Configuration.csproj::TargetFramewor
k=net8.0]
D:\Users\tagoo\source\repos\runtime\src\libraries\Microsoft.Extensions.Logging.Configuration\src\LoggerFilterConfigureO
ptions.cs(54,72): error IL2026: Using member 'Microsoft.Extensions.Configuration.ConfigurationBinder.GetValue<T>(IConfi
guration, String, T)' which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming application c
ode. In case the type is non-primitive, the trimmer cannot statically analyze the object's type so its members may be t
rimmed. [D:\Users\tagoo\source\repos\runtime\src\libraries\Microsoft.Extensions.Logging.Configuration\src\Microsoft.Ext
ensions.Logging.Configuration.csproj::TargetFramework=net8.0
Author: tannergooding
Assignees: -
Labels:

area-Extensions-Configuration

Milestone: -

@tarekgh tarekgh added the source-generator Indicates an issue with a source generator feature label Jul 14, 2023
@tarekgh tarekgh assigned tarekgh and layomia and unassigned tarekgh Jul 14, 2023
@layomia
Copy link
Contributor

layomia commented Jul 14, 2023

Can you check again with the latest bits? Doesn't repro for me with latest main e264ba7. What commit were you folks on when you saw this?

@layomia layomia added this to the 8.0.0 milestone Jul 14, 2023
@ghost ghost removed the untriaged New issue has not been triaged by the area owner label Jul 14, 2023
@jasper-d
Copy link
Contributor

Does repro for me with 218d2ef and git clean -ffdx && dotnet nuget locals all --clear && .\build.cmd -s clr+libs -c Release. Will try with e264ba7 next.

@jasper-d
Copy link
Contributor

Still able to reproduce with e264ba7. This is what I ran:

git checkout e264ba7
get-process dotnet | stop-process
dotnet build-server shutdown
git clean -ffdx
dotnet nuget locals all --clear
.\build.cmd -s clr+libs -c Release

@tannergooding
Copy link
Member Author

Same. I'm also able to repro still using 5a43a6f

@vcsjones
Copy link
Member

I've hit a couple of errors trying to build with the preview 6 SDK installed.

Do y'all have .NET 8 preview 6 installed? Does it build if you do export useInstalledDotNetCli=0 then try a build?

@lateralusX
Copy link
Member

lateralusX commented Jul 17, 2023

I get this on debug builds as well, but in that scenario it will trigger an assert instead of a crash. I have currently not found a way around this issue.

C:\Users\xxxx\.nuget\packages\microsoft.net.compilers.toolset\4.7.0-2.23319.4\tasks\netcore\Microsoft.CSharp.Core.t
argets(80,5): error : Process terminated. Assertion failed. [C:\git\runtime\src\libraries\Microsoft.Extensions.Logging.
Configuration\src\Microsoft.Extensions.Logging.Configuration.csproj::TargetFramework=net8.0]
C:\Users\xxxx\.nuget\packages\microsoft.net.compilers.toolset\4.7.0-2.23319.4\tasks\netcore\Microsoft.CSharp.Core.t
argets(80,5): error :    at Microsoft.Extensions.Configuration.Binder.SourceGeneration.SourceWriter.WriteBlockEnd(Strin
g extra) in C:\git\runtime\src\libraries\Microsoft.Extensions.Configuration.Binder\gen\Helpers\SourceWriter.cs:line 30
[C:\git\runtime\src\libraries\Microsoft.Extensions.Logging.Configuration\src\Microsoft.Extensions.Logging.Configuration
.csproj::TargetFramework=net8.0]

@layomia
Copy link
Contributor

layomia commented Jul 17, 2023

Do folks still see this issue when upgrading to the latest Visual Studio preview and adding the latest MSVC/compiler build tools (under individual components)? This resolved the issue for me. It could be that the compiler toolset currently used when building are wrongly selecting a stale version of the generator.

@ericstj
Copy link
Member

ericstj commented Jul 17, 2023

I was able to get a repro on MacOS using @martincostello's project. Here's the call stack.

{System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. (Parameter 'value')
Microsoft.Extensions.Configuration.Binder.SourceGeneration.dll!Microsoft.Extensions.Configuration.Binder.SourceGeneration.SourceWriter.set_Indentation.__Throw|5_0() Line 26 (SourceWriter.cs:26)
Microsoft.Extensions.Configuration.Binder.SourceGeneration.dll!Microsoft.Extensions.Configuration.Binder.SourceGeneration.SourceWriter.WriteBlock(string source) Line 73 (SourceWriter.cs:73)
Microsoft.Extensions.Configuration.Binder.SourceGeneration.dll!Microsoft.Extensions.Configuration.Binder.SourceGeneration.ConfigurationBindingGenerator.Emitter.EmitBinder_Extensions_ServiceCollection() Line 69 (OptionsConfigurationServiceCollectionExtensions.cs:69)
Microsoft.Extensions.Configuration.Binder.SourceGeneration.dll!Microsoft.Extensions.Configuration.Binder.SourceGeneration.ConfigurationBindingGenerator.Emitter.Emit() Line 51 (ConfigurationBindingGenerator.Emitter.cs:51)
Microsoft.Extensions.Configuration.Binder.SourceGeneration.dll!Microsoft.Extensions.Configuration.Binder.SourceGeneration.ConfigurationBindingGenerator.Execute(Microsoft.Extensions.Configuration.Binder.SourceGeneration.ConfigurationBindingGenerator.CompilationData compilationData, System.Collections.Immutable.ImmutableArray<Microsoft.Extensions.Configuration.Binder.SourceGeneration.BinderInvocation> inputCalls, Microsoft.CodeAnalysis.SourceProductionContext context) Line 67 (ConfigurationBindingGenerator.cs:67)
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.UserFunctionExtensions.WrapUserAction.AnonymousMethod__0(Microsoft.CodeAnalysis.SourceProductionContext input1, (Microsoft.Extensions.Configuration.Binder.SourceGeneration.ConfigurationBindingGenerator.CompilationData, System.Collections.Immutable.ImmutableArray<Microsoft.Extensions.Configuration.Binder.SourceGeneration.BinderInvocation>) input2, System.Threading.CancellationToken token) Line 101 (UserFunction.cs:101)
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.SourceOutputNode<(Microsoft.Extensions.Configuration.Binder.SourceGeneration.ConfigurationBindingGenerator.CompilationData, System.Collections.Immutable.ImmutableArray<Microsoft.Extensions.Configuration.Binder.SourceGeneration.BinderInvocation>)>.UpdateStateTable(Microsoft.CodeAnalysis.DriverStateTable.Builder graphState, Microsoft.CodeAnalysis.NodeStateTable<(System.Collections.Generic.IEnumerable<Microsoft.CodeAnalysis.GeneratedSourceText>, System.Collections.Generic.IEnumerable<Microsoft.CodeAnalysis.Diagnostic>)> previousTable, System.Threading.CancellationToken cancellationToken) Line 69 (SourceOutputNode.cs:69)
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.DriverStateTable.Builder.GetLatestStateTableForNode<(System.Collections.Generic.IEnumerable<Microsoft.CodeAnalysis.GeneratedSourceText>, System.Collections.Generic.IEnumerable<Microsoft.CodeAnalysis.Diagnostic>)>(Microsoft.CodeAnalysis.IIncrementalGeneratorNode<(System.Collections.Generic.IEnumerable<Microsoft.CodeAnalysis.GeneratedSourceText>, System.Collections.Generic.IEnumerable<Microsoft.CodeAnalysis.Diagnostic>)> source) Line 60 (DriverStateTable.cs:60)
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.SourceOutputNode<(Microsoft.Extensions.Configuration.Binder.SourceGeneration.ConfigurationBindingGenerator.CompilationData, System.Collections.Immutable.ImmutableArray<Microsoft.Extensions.Configuration.Binder.SourceGeneration.BinderInvocation>)>.AppendOutputs(Microsoft.CodeAnalysis.IncrementalExecutionContext context, System.Threading.CancellationToken cancellationToken) Line 97 (SourceOutputNode.cs:97)
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.GeneratorDriver.UpdateOutputs(System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.IIncrementalGeneratorOutputNode> outputNodes, Microsoft.CodeAnalysis.IncrementalGeneratorOutputKind outputKind, Microsoft.CodeAnalysis.GeneratorRunStateTable.Builder generatorRunStateBuilder, System.Threading.CancellationToken cancellationToken, Microsoft.CodeAnalysis.DriverStateTable.Builder driverStateBuilder) Line 318 (GeneratorDriver.cs:318)
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.GeneratorDriver.RunGeneratorsCore(Microsoft.CodeAnalysis.Compilation compilation, Microsoft.CodeAnalysis.DiagnosticBag diagnosticsBag, System.Threading.CancellationToken cancellationToken) Line 299 (GeneratorDriver.cs:299)
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.GeneratorDriver.RunGeneratorsAndUpdateCompilation(Microsoft.CodeAnalysis.Compilation compilation, out Microsoft.CodeAnalysis.Compilation outputCompilation, out System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Diagnostic> diagnostics, System.Threading.CancellationToken cancellationToken) Line 57 (GeneratorDriver.cs:57)
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.CommonCompiler.RunGenerators(Microsoft.CodeAnalysis.Compilation input, Microsoft.CodeAnalysis.ParseOptions parseOptions, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.ISourceGenerator> generators, Microsoft.CodeAnalysis.Diagnostics.AnalyzerConfigOptionsProvider analyzerConfigOptionsProvider, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.AdditionalText> additionalTexts, Microsoft.CodeAnalysis.DiagnosticBag generatorDiagnostics) Line 822 (CommonCompiler.cs:822)
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.CommonCompiler.CompileAndEmit(Microsoft.CodeAnalysis.TouchedFileLogger touchedFilesLogger, ref Microsoft.CodeAnalysis.Compilation compilation, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Diagnostics.DiagnosticAnalyzer> analyzers, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.ISourceGenerator> generators, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.AdditionalText> additionalTextFiles, Microsoft.CodeAnalysis.AnalyzerConfigSet analyzerConfigSet, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.AnalyzerConfigOptionsResult> sourceFileAnalyzerConfigOptions, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.EmbeddedText> embeddedTexts, Microsoft.CodeAnalysis.DiagnosticBag diagnostics, Microsoft.CodeAnalysis.ErrorLogger errorLogger, System.Threading.CancellationToken cancellationToken, out System.Threading.CancellationTokenSource analyzerCts, out Microsoft.CodeAnalysis.Diagnostics.AnalyzerDriver analyzerDriver, out Microsoft.CodeAnalysis.GeneratorDriverTimingInfo? generatorTimingInfo) Line 1098 (CommonCompiler.cs:1098)
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.CommonCompiler.RunCore(System.IO.TextWriter consoleOutput, Microsoft.CodeAnalysis.ErrorLogger errorLogger, System.Threading.CancellationToken cancellationToken) Line 960 (CommonCompiler.cs:960)
Microsoft.CodeAnalysis.dll!Microsoft.CodeAnalysis.CommonCompiler.Run(System.IO.TextWriter consoleOutput, System.Threading.CancellationToken cancellationToken) Line 769 (CommonCompiler.cs:769)
csc.dll!Microsoft.CodeAnalysis.CSharp.CommandLine.Csc.Run.AnonymousMethod__0(System.IO.TextWriter tw) Line 28 (Csc.cs:28)
csc.dll!Microsoft.CodeAnalysis.CSharp.CommandLine.Csc.Run(string[] args, Microsoft.CodeAnalysis.BuildPaths buildPaths, System.IO.TextWriter textWriter, Microsoft.CodeAnalysis.IAnalyzerAssemblyLoader analyzerLoader) Line 28 (Csc.cs:28)
csc.dll!Microsoft.CodeAnalysis.CommandLine.BuildClient.RunCompilation(System.Collections.Generic.IEnumerable<string> originalArguments, Microsoft.CodeAnalysis.BuildPaths buildPaths, System.IO.TextWriter textWriter, string pipeName) Line 169 (BuildClient.cs:169)
csc.dll!Microsoft.CodeAnalysis.CommandLine.BuildClient.Run(System.Collections.Generic.IEnumerable<string> arguments, Microsoft.CodeAnalysis.CommandLine.RequestLanguage language, Microsoft.CodeAnalysis.CommandLine.CompileFunc compileFunc, Microsoft.CodeAnalysis.CommandLine.CompileOnServerFunc compileOnServerFunc, Microsoft.CodeAnalysis.CommandLine.ICompilerServerLogger logger) Line 118 (BuildClient.cs:118)

I can see that it loaded the preview6 generator:

Loaded '/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/8.0.0-preview.6.23329.11/analyzers/dotnet/cs/Microsoft.Extensions.Configuration.Binder.SourceGeneration.dll'.

I disassembled this and see: "8.0.0-preview.6.23329.7+5340be2ccc67101dc890c9f1b0ec57470b685f3e"

Trying to get more info, I'm pretty novice debugging with VS Code on macOS.

@ericstj
Copy link
Member

ericstj commented Jul 17, 2023

I was able to get symbols and updated the above. Here's the parameter to WriteBlock(string source)

"    global::Microsoft.Extensions.DependencyInjection.OptionsServiceCollectionExtensions.AddOptions(services);\r\n    global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::Microsoft.Extensions.Options.IOptionsChangeTokenSource<TOptions>>(services, new global::Microsoft.Extensions.Options.ConfigurationChangeTokenSource<TOptions>(name, configuration));\r\n    return global::Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton<global::Microsoft.Extensions.Options.IConfigureOptions<TOptions>>(services, new global::Microsoft.Extensions.Options.ConfigureNamedOptions<TOptions>(name, obj => global::Microsoft.Extensions.Configuration.Binder.SourceGeneration.CoreBindingHelper.BindCoreUntyped(configuration, obj, typeof(TOptions), configureOptions)));\r\n}"

@ericstj
Copy link
Member

ericstj commented Jul 17, 2023

It looks to me like the the multi-line string literal embedded into the binary as new-line constants that depend upon whatever the git client settings are on the machine building the generator:

global::Microsoft.Extensions.DependencyInjection.OptionsServiceCollectionExtensions.AddOptions({{Identifier.services}});
{{FullyQualifiedDisplayString.AddSingleton}}<{{FullyQualifiedDisplayString.IOptionsChangeTokenSource}}<{{Identifier.TOptions}}>>({{Identifier.services}}, new {{FullyQualifiedDisplayString.ConfigurationChangeTokenSource}}<{{Identifier.TOptions}}>({{Identifier.name}}, {{Identifier.configuration}}));
return {{FullyQualifiedDisplayString.AddSingleton}}<{{optionsNamespaceName}}.IConfigureOptions<{{Identifier.TOptions}}>>({{Identifier.services}}, new {{optionsNamespaceName}}.ConfigureNamedOptions<{{Identifier.TOptions}}>({{Identifier.name}}, {{Identifier.obj}} => {{bindCoreUntypedDisplayString}}({{Identifier.configuration}}, {{Identifier.obj}}, typeof({{Identifier.TOptions}}), {{Identifier.configureOptions}})));

So if I disassemble the one on the mac it has \r\n because we're shipping one copy of the source generator assembly for all platforms, built from windows. Looks to me like having a mismatch in line endings is causing this line ending logic to fail,

ReadOnlySpan<char> line = GetNextLine(ref remainingText, out isFinalLine);
.

@tannergooding observed a break here because his local git client on windows was configured for source line-endings (eg: LF), which differed from Environment.NewLine:

private static readonly char[] s_newLine = Environment.NewLine.ToCharArray();

@martincostello observed a break because his mac/unix build client's had a different line ending in the generator (built on windows - CRLF) than his environment (LF).

@jasper-d
Copy link
Contributor

So the right fix would be to handle both CRLF and LF correctly as line endings I presume. I can provide a fix for that if you don't mind.

@eiriktsarpalis
Copy link
Member

@jasper-d thanks for the offer, but I believe a fix is already in the works :-)

@ghost ghost added the in-pr There is an active PR which will close this issue when it is merged label Jul 19, 2023
@ghost ghost locked as resolved and limited conversation to collaborators Aug 19, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
area-Extensions-Configuration in-pr There is an active PR which will close this issue when it is merged source-generator Indicates an issue with a source generator feature
Projects
None yet
Development

Successfully merging a pull request may close this issue.

8 participants