roslyn icon indicating copy to clipboard operation
roslyn copied to clipboard

An assert is thrown for an erroneous code using out var

Open AlekseyTs opened this issue 1 year ago • 0 comments

        [Fact]
        public void Test()
        {
            var source =
@"
class Program
{
    static void Test(ref int x)
    {
        foreach (ref int[M(out var b)] a in new Enumerable2()) {
            b++;
        }
    }

    static int M(out int x) => throw null;
}

class Enumerable2
{
    public Enumerator2 GetEnumerator() => default;
}

class Enumerator2
{
    public ref int[] Current => throw null;
    public bool MoveNext() => false;
}
";
            var comp = CreateCompilation(source);
            comp.VerifyDiagnostics(
                );
        }

An assert is thrown, which indicates that the out variable in this erroneous code is not handled properly:

            Microsoft.CodeAnalysis.CSharp.UnitTests.RefFieldTests.Test [FAIL]
              System.InvalidOperationException : Assertion failed
              Stack Trace:
                src\Compilers\Test\Core\ThrowingTraceListener.cs(26,0): at Microsoft.CodeAnalysis.ThrowingTraceListener.Fail(String message, String detailMessage)
                   at System.Diagnostics.TraceInternal.Fail(String message, String detailMessage)
                   at System.Diagnostics.TraceInternal.TraceProvider.Fail(String message, String detailMessage)
                   at System.Diagnostics.Debug.Fail(String message, String detailMessage)
                   at System.Diagnostics.Debug.Assert(Boolean condition)
                src\Compilers\CSharp\Portable\Symbols\Source\SourceLocalSymbol.cs(878,0): at Microsoft.CodeAnalysis.CSharp.Symbols.SourceLocalSymbol.LocalSymbolWithEnclosingContext.InferTypeOfVarVariable(BindingDiagnosticBag diagnostics)
                src\Compilers\CSharp\Portable\Symbols\Source\SourceLocalSymbol.cs(425,0): at Microsoft.CodeAnalysis.CSharp.Symbols.SourceLocalSymbol.GetTypeSymbol()
                src\Compilers\CSharp\Portable\Symbols\Source\SourceLocalSymbol.cs(366,0): at Microsoft.CodeAnalysis.CSharp.Symbols.SourceLocalSymbol.get_TypeWithAnnotations()
                src\Compilers\CSharp\Portable\Symbols\SymbolExtensions.cs(513,0): at Microsoft.CodeAnalysis.CSharp.Symbols.SymbolExtensions.GetTypeOrReturnType(Symbol symbol, RefKind& refKind, TypeWithAnnotations& returnType, ImmutableArray`1& refCustomModifiers)
                src\Compilers\CSharp\Portable\Symbols\SymbolExtensions.cs(440,0): at Microsoft.CodeAnalysis.CSharp.Symbols.SymbolExtensions.GetTypeOrReturnType(Symbol symbol)
                src\Compilers\CSharp\Portable\FlowAnalysis\LocalDataFlowPass.cs(117,0): at Microsoft.CodeAnalysis.CSharp.LocalDataFlowPass`2.GetOrCreateSlot(Symbol symbol, Int32 containingSlot, Boolean forceSlotEvenIfEmpty, Boolean createIfMissing)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(2008,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.GetOrCreateSlot(Symbol symbol, Int32 containingSlot, Boolean forceSlotEvenIfEmpty, Boolean createIfMissing)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(3147,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.DeclareLocal(LocalSymbol local)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(3160,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.DeclareLocals(ImmutableArray`1 locals)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(3114,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.VisitForEachStatement(BoundForEachStatement node)
                src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(3773,0): at Microsoft.CodeAnalysis.CSharp.BoundForEachStatement.Accept(BoundTreeVisitor visitor)
                src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(151,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(370,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.VisitWithStackGuard(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(354,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.VisitAlways(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(343,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.Visit(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(3324,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.Visit(BoundNode node, Boolean expressionIsRead)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(3307,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.Visit(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(665,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.VisitStatement(BoundStatement statement)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(3333,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.VisitStatement(BoundStatement statement)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(2911,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.VisitStatementsWithLocalFunctions(BoundBlock block)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(2869,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.VisitBlock(BoundBlock node)
                src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(3028,0): at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor)
                src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(151,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(370,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.VisitWithStackGuard(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(354,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.VisitAlways(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(343,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.Visit(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(3324,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.Visit(BoundNode node, Boolean expressionIsRead)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(3307,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.Visit(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(3595,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.VisitMethodBodies(BoundBlock blockBody, BoundBlock expressionBody)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(3488,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.VisitNonConstructorMethodBody(BoundNonConstructorMethodBody node)
                src\Compilers\CSharp\Portable\Generated\BoundNodes.xml.Generated.cs(8195,0): at Microsoft.CodeAnalysis.CSharp.BoundNonConstructorMethodBody.Accept(BoundTreeVisitor visitor)
                src\Compilers\CSharp\Portable\BoundTree\BoundTreeVisitors.cs(151,0): at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(370,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.VisitWithStackGuard(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(354,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.VisitAlways(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(343,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.Visit(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(3324,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.Visit(BoundNode node, Boolean expressionIsRead)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(3307,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.Visit(BoundNode node)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(425,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.Scan(Boolean& badRegion)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(566,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.Scan(Boolean& badRegion)
                src\Compilers\CSharp\Portable\FlowAnalysis\AbstractFlowPass.cs(448,0): at Microsoft.CodeAnalysis.CSharp.AbstractFlowPass`2.Analyze(Boolean& badRegion, Optional`1 initialState)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(1696,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.Analyze(NullableWalker walker, Symbol symbol, DiagnosticBag diagnostics, Optional`1 initialState, Builder snapshotBuilderOpt, Boolean requiresAnalysis)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(1670,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.Analyze(CSharpCompilation compilation, Symbol symbol, BoundNode node, Binder binder, Conversions conversions, DiagnosticBag diagnostics, Boolean useConstructorExitWarnings, Boolean useDelegateInvokeParameterTypes, Boolean useDelegateInvokeReturnType, MethodSymbol delegateInvokeMethodOpt, VariableState initialState, MethodSymbol baseOrThisInitial
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(1297,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.Analyze(CSharpCompilation compilation, MethodSymbol method, BoundNode node, DiagnosticBag diagnostics, Boolean useConstructorExitWarnings, VariableState initialNullableState, Boolean getFinalNullableState, MethodSymbol baseOrThisInitializer, VariableState& finalNullableState, Boolean requiresAnalysis)
                src\Compilers\CSharp\Portable\FlowAnalysis\NullableWalker.cs(1266,0): at Microsoft.CodeAnalysis.CSharp.NullableWalker.AnalyzeIfNeeded(CSharpCompilation compilation, MethodSymbol method, BoundNode node, DiagnosticBag diagnostics, Boolean useConstructorExitWarnings, VariableState initialNullableState, Boolean getFinalNullableState, MethodSymbol baseOrThisInitializer, VariableState& finalNullableState)
                src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(1808,0): 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)
                src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(1042,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState)
                src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(530,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType)
                src\Compilers\CSharp\Portable\Compiler\MethodCompiler.cs(424,0): at Microsoft.CodeAnalysis.CSharp.MethodCompiler.<>c__DisplayClass25_0.<CompileNamedTypeAsync>b__0()
                src\Compilers\Core\Portable\InternalUtilities\UICultureUtilities.cs(139,0): at Roslyn.Utilities.UICultureUtilities.<>c__DisplayClass5_0.<WithCurrentUICulture>b__0()

AlekseyTs avatar Sep 21 '22 18:09 AlekseyTs