Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Use VisitRvalue to visit a function pointer #75996

Merged
merged 1 commit into from
Nov 21, 2024

Conversation

RikkiGibson
Copy link
Contributor

Closes #75933

Plain Visit() can leave us in a conditional state. We want to unsplit before unconditionally visiting the fnptr arguments, when it is immediately invoked, for example.

Debug mode error stack without this change
  Message: 
System.InvalidOperationException : !IsConditionalState

  Stack Trace: 
ThrowingTraceListener.Fail(String message, String detailMessage) line 26
TraceInternal.Fail(String message, String detailMessage)
Debug.Fail(String message, String detailMessage)
DefiniteAssignmentPass.CheckAssigned(Symbol symbol, SyntaxNode node) line 1153
DefiniteAssignmentPass.VisitLocal(BoundLocal node) line 2368
BoundLocal.Accept(BoundTreeVisitor visitor) line 4539
BoundTreeVisitor.Visit(BoundNode node) line 151
AbstractFlowPass`2.VisitExpressionOrPatternWithoutStackGuard(BoundNode node) line 375
BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(Int32& recursionDepth, BoundNode node) line 213
AbstractFlowPass`2.VisitWithStackGuard(BoundNode node) line 366
AbstractFlowPass`2.VisitAlways(BoundNode node) line 354
AbstractFlowPass`2.Visit(BoundNode node) line 343
AbstractFlowPass`2.VisitRvalue(BoundExpression node, Boolean isKnownToBeAnLvalue) line 662
DefiniteAssignmentPass.VisitRvalue(BoundExpression node, Boolean isKnownToBeAnLvalue) line 320
AbstractFlowPass`2.VisitArgumentsBeforeCall(ImmutableArray`1 arguments, ImmutableArray`1 refKindsOpt) line 1531
AbstractFlowPass`2.VisitArguments(ImmutableArray`1 arguments, ImmutableArray`1 refKindsOpt, MethodSymbol method) line 1519
AbstractFlowPass`2.VisitFunctionPointerInvocation(BoundFunctionPointerInvocation node) line 3745
BoundFunctionPointerInvocation.Accept(BoundTreeVisitor visitor) line 1467
BoundTreeVisitor.Visit(BoundNode node) line 151
AbstractFlowPass`2.VisitExpressionOrPatternWithoutStackGuard(BoundNode node) line 375
BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(BoundNode node) line 243
BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(Int32& recursionDepth, BoundNode node) line 217
AbstractFlowPass`2.VisitWithStackGuard(BoundNode node) line 366
AbstractFlowPass`2.VisitAlways(BoundNode node) line 354
AbstractFlowPass`2.Visit(BoundNode node) line 343
AbstractFlowPass`2.VisitRvalue(BoundExpression node, Boolean isKnownToBeAnLvalue) line 662
DefiniteAssignmentPass.VisitRvalue(BoundExpression node, Boolean isKnownToBeAnLvalue) line 320
AbstractFlowPass`2.VisitExpressionStatement(BoundExpressionStatement node) line 1327
BoundExpressionStatement.Accept(BoundTreeVisitor visitor) line 3681
BoundTreeVisitor.Visit(BoundNode node) line 151
AbstractFlowPass`2.VisitWithStackGuard(BoundNode node) line 369
AbstractFlowPass`2.VisitAlways(BoundNode node) line 354
AbstractFlowPass`2.Visit(BoundNode node) line 343
AbstractFlowPass`2.VisitStatement(BoundStatement statement) line 672
DefiniteAssignmentPass.VisitStatementsWithLocalFunctions(BoundBlock block) line 2203
DefiniteAssignmentPass.VisitBlock(BoundBlock node) line 2138
BoundBlock.Accept(BoundTreeVisitor visitor) line 3325
BoundTreeVisitor.Visit(BoundNode node) line 151
AbstractFlowPass`2.VisitWithStackGuard(BoundNode node) line 369
AbstractFlowPass`2.VisitAlways(BoundNode node) line 354
AbstractFlowPass`2.Visit(BoundNode node) line 343
AbstractFlowPass`2.Scan(Boolean& badRegion) line 424
DefiniteAssignmentPass.Scan(Boolean& badRegion) line 371
AbstractFlowPass`2.Analyze(Boolean& badRegion, Optional`1 initialState) line 447
DefiniteAssignmentPass.Analyze(Boolean& badRegion, DiagnosticBag diagnostics) line 682
DefiniteAssignmentPass.<Analyze>g__analyze|41_0(Boolean strictAnalysis, <>c__DisplayClass41_0&) line 639
DefiniteAssignmentPass.Analyze(CSharpCompilation compilation, MethodSymbol member, BoundNode node, DiagnosticBag diagnostics, ImmutableArray`1& implicitlyInitializedFieldsOpt, Boolean requireOutParamsAssigned) line 552
FlowAnalysisPass.Analyze(CSharpCompilation compilation, MethodSymbol method, BoundBlock block, DiagnosticBag diagnostics, Boolean& needsImplicitReturn, ImmutableArray`1& implicitlyInitializedFieldsOpt) line 216
FlowAnalysisPass.Rewrite(MethodSymbol method, BoundBlock block, TypeCompilationState compilationState, BindingDiagnosticBag diagnostics, Boolean hasTrailingExpression, Boolean originalBodyNested) line 51
MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState) line 1099
MethodCompiler.CompileNamedType(NamedTypeSymbol containingType) line 537
<>c__DisplayClass25_0.<CompileNamedTypeAsync>b__0() line 439
<>c__DisplayClass5_0.<WithCurrentUICulture>b__0() line 139
ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
MethodCompiler.WaitForWorkers() line 338
MethodCompiler.CompileMethodBodies(CSharpCompilation compilation, PEModuleBuilder moduleBeingBuiltOpt, Boolean emittingPdb, Boolean hasDeclarationErrors, Boolean emitMethodBodies, BindingDiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken) line 160
CSharpCompilation.CompileMethods(CommonPEModuleBuilder moduleBuilder, Boolean emittingPdb, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken) line 3503
Compilation.Emit(Stream peStream, Stream metadataPEStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, RebuildData rebuildData, CompilationTestData testData, CancellationToken cancellationToken) line 2967
Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Stream metadataPEStream, RebuildData rebuildData, CancellationToken cancellationToken) line 2908
Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Stream metadataPEStream, CancellationToken cancellationToken) line 2796
DiagnosticExtensions.GetEmitDiagnostics[TCompilation](TCompilation c, EmitOptions options, IEnumerable`1 manifestResources) line 367
DiagnosticExtensions.VerifyEmitDiagnostics[TCompilation](TCompilation c, EmitOptions options, DiagnosticDescription[] expected) line 356
DiagnosticExtensions.VerifyEmitDiagnostics[TCompilation](TCompilation c, DiagnosticDescription[] expected) line 373
FunctionPointerTests.BoolLiteralInvocation_01() line 4173

@RikkiGibson RikkiGibson requested a review from a team as a code owner November 20, 2024 22:04
@dotnet-issue-labeler dotnet-issue-labeler bot added Area-Compilers untriaged Issues and PRs which have not yet been triaged by a lead labels Nov 20, 2024
@RikkiGibson RikkiGibson requested a review from a team November 21, 2024 03:40
Copy link
Contributor

@AlekseyTs AlekseyTs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM (commit 1)

@RikkiGibson RikkiGibson merged commit 1207044 into dotnet:main Nov 21, 2024
24 checks passed
@RikkiGibson RikkiGibson deleted the fnptr-visitrvalue branch November 21, 2024 19:06
@dotnet-policy-service dotnet-policy-service bot added this to the Next milestone Nov 21, 2024
@jjonescz jjonescz modified the milestones: Next, 17.13 P2 Nov 25, 2024
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
Area-Compilers untriaged Issues and PRs which have not yet been triaged by a lead
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Casting a literal true or false to a function pointer crashes csc.exe
4 participants