diff --git a/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs b/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs index f13bb9b83a3c90b53b830d8fbacf45a609bc8744..d49359a7e02867f4cd50444e558454dc5da7ef8e 100644 --- a/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs +++ b/src/Compilers/CSharp/Portable/Operations/CSharpOperationFactory.cs @@ -1173,13 +1173,13 @@ private IDoLoopStatement CreateBoundDoStatementOperation(BoundDoStatement boundD DoLoopKind doLoopKind = DoLoopKind.DoWhileBottomLoop; Lazy condition = new Lazy(() => Create(boundDoStatement.Condition)); Lazy body = new Lazy(() => Create(boundDoStatement.Body)); - Lazy invalidCondition = new Lazy(() => null); + Lazy ignoredCondition = new Lazy(() => null); ImmutableArray locals = boundDoStatement.Locals.As(); SyntaxNode syntax = boundDoStatement.Syntax; ITypeSymbol type = null; Optional constantValue = default(Optional); bool isImplicit = boundDoStatement.WasCompilerGenerated; - return new LazyDoLoopStatement(doLoopKind, condition, body, invalidCondition, locals, _semanticModel, syntax, type, constantValue, isImplicit); + return new LazyDoLoopStatement(doLoopKind, condition, body, ignoredCondition, locals, _semanticModel, syntax, type, constantValue, isImplicit); } private IForLoopStatement CreateBoundForStatementOperation(BoundForStatement boundForStatement) diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IForEachLoopStatement.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IForEachLoopStatement.cs index c61f327e72123757eeaca848d0f4b075e6e920ae..9de66a434796e345d45e689e1ce02827a7015cea 100644 --- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IForEachLoopStatement.cs +++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IForEachLoopStatement.cs @@ -5,7 +5,6 @@ using Roslyn.Test.Utilities; using Xunit; - namespace Microsoft.CodeAnalysis.CSharp.UnitTests { public partial class IOperationTests : SemanticModelTestBase @@ -883,6 +882,38 @@ public static void M((int, int)[] x) VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics); } + [CompilerTrait(CompilerFeature.IOperation)] + [Fact, WorkItem(17602, "https://github.com/dotnet/roslyn/issues/17602")] + public void IForEachLoopStatement_WithNestedDeconstructDeclaration() + { + string source = @" +class X +{ + public static void M((int, (int, int))[] x) + { + /**/foreach (var (a, (b, c)) in x) + { + }/**/ + } +} +"; + string expectedOperationTree = @" +IForEachLoopStatement (LoopKind.ForEach) (OperationKind.LoopStatement) (Syntax: 'foreach (va ... }') + Locals: Local_1: System.Int32 a + Local_2: System.Int32 b + Local_3: System.Int32 c + LoopControlVariable: IOperation: (OperationKind.None) (Syntax: 'var (a, (b, c))') + Collection: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Collections.IEnumerable) (Syntax: 'x') + Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: True, IsUserDefined: False) (MethodSymbol: null) + Operand: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: (System.Int32, (System.Int32, System.Int32))[]) (Syntax: 'x') + Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }') + NextVariables(0) +"; + var expectedDiagnostics = DiagnosticDescription.None; + + VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics); + } + [CompilerTrait(CompilerFeature.IOperation)] [Fact, WorkItem(17602, "https://github.com/dotnet/roslyn/issues/17602")] public void IForEachLoopStatement_WithInvalidLoopControlVariable() @@ -956,5 +987,37 @@ public static void M((int, int)[] x) VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics); } + + [CompilerTrait(CompilerFeature.IOperation)] + [Fact, WorkItem(17602, "https://github.com/dotnet/roslyn/issues/17602")] + public void IForEachLoopStatement_WithInvalidLoopControlVariable_02() + { + string source = @" +class X +{ + public static void M(int[] x) + /**/{ + foreach (x[0] in x) + { + } + }/**/ +} +"; + string expectedOperationTree = @" +IBlockStatement (1 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: '{ ... }') + IForEachLoopStatement (LoopKind.ForEach) (OperationKind.LoopStatement, IsInvalid) (Syntax: 'foreach (x[ ... }') + LoopControlVariable: null + Collection: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Collections.IEnumerable) (Syntax: 'x') + Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: True, IsUserDefined: False) (MethodSymbol: null) + Operand: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32[]) (Syntax: 'x') + Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }') + NextVariables(0) +"; + var expectedDiagnostics = new DiagnosticDescription[] { + Diagnostic(ErrorCode.ERR_BadForeachDecl, "in").WithLocation(6, 23) + }; + + VerifyOperationTreeAndDiagnosticsForTest(source, expectedOperationTree, expectedDiagnostics); + } } } diff --git a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.cs b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.cs index 7f31fbac32f90664d1ae5ad8a0eb3976bb2c6334..482f5373076d509f8f47eb294e9461528aba119e 100644 --- a/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.cs +++ b/src/Compilers/CSharp/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.cs @@ -37,7 +37,7 @@ static void Main() Condition: IBinaryOperatorExpression (BinaryOperatorKind.LessThan) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i < 4') Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i') Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 4) (Syntax: '4') - InvalidCondition: null + IgnoredCondition: null Body: IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'sum += ids[i];') Expression: ICompoundAssignmentExpression (BinaryOperatorKind.Add) (OperationKind.CompoundAssignmentExpression, Type: System.Int32) (Syntax: 'sum += ids[i]') @@ -1065,7 +1065,7 @@ static bool TakeOutParam(T y, out T x) Operand: ILocalReferenceExpression: x1 (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'x1') InConversion: null OutConversion: null - InvalidCondition: null + IgnoredCondition: null Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'f = false;') Expression: ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Boolean) (Syntax: 'f = false') diff --git a/src/Compilers/Core/Portable/Generated/Operations.xml.Generated.cs b/src/Compilers/Core/Portable/Generated/Operations.xml.Generated.cs index b281c4675bec2cc7dc6074847bb1a6c5fd09016a..c86b866c70418a0964f3b2aeff44b748f280a0d5 100644 --- a/src/Compilers/Core/Portable/Generated/Operations.xml.Generated.cs +++ b/src/Compilers/Core/Portable/Generated/Operations.xml.Generated.cs @@ -5040,16 +5040,16 @@ internal abstract partial class BaseDoLoopStatement : LoopStatement, IDoLoopStat /// public DoLoopKind DoLoopKind { get; } protected abstract IOperation ConditionImpl { get; } - protected abstract IOperation InvalidConditionImpl { get; } + protected abstract IOperation IgnoredConditionImpl { get; } public override IEnumerable Children { get { yield return Condition; yield return Body; - if (InvalidCondition != null) + if (IgnoredCondition != null) { - yield return InvalidCondition; + yield return IgnoredCondition; } } } @@ -5058,12 +5058,12 @@ public override IEnumerable Children /// public IOperation Condition => Operation.SetParentOperation(ConditionImpl, this); /// - /// Additional conditional supplied for loop in error cases. + /// Additional conditional supplied for loop in error cases, which is ignored by the compiler. /// For example, for VB 'Do While' or 'Do Until' loop with syntax errors where both the top and bottom conditions are provided. - /// The top condition is preferred and exposed as and the bottom condition is exposed by this property. + /// The top condition is preferred and exposed as and the bottom condition is ignored and exposed by this property. /// This property should be null for all non-error cases. /// - public IOperation InvalidCondition => Operation.SetParentOperation(InvalidConditionImpl, this); + public IOperation IgnoredCondition => Operation.SetParentOperation(IgnoredConditionImpl, this); public override void Accept(OperationVisitor visitor) { visitor.VisitDoLoopStatement(this); @@ -5079,16 +5079,16 @@ public override void Accept(OperationVisitor visitor) /// internal sealed partial class DoLoopStatement : BaseDoLoopStatement, IDoLoopStatement { - public DoLoopStatement(DoLoopKind doLoopKind, IOperation condition, IOperation body, IOperation invalidConditionOpt, ImmutableArray locals, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : + public DoLoopStatement(DoLoopKind doLoopKind, IOperation condition, IOperation body, IOperation ignoredConditionOpt, ImmutableArray locals, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : base(doLoopKind, locals, semanticModel, syntax, type, constantValue, isImplicit) { ConditionImpl = condition; BodyImpl = body; - InvalidConditionImpl = invalidConditionOpt; + IgnoredConditionImpl = ignoredConditionOpt; } protected override IOperation ConditionImpl { get; } protected override IOperation BodyImpl { get; } - protected override IOperation InvalidConditionImpl { get; } + protected override IOperation IgnoredConditionImpl { get; } } /// @@ -5098,18 +5098,18 @@ internal sealed partial class LazyDoLoopStatement : BaseDoLoopStatement, IDoLoop { private readonly Lazy _lazyCondition; private readonly Lazy _lazyBody; - private readonly Lazy _lazyInvalidCondition; + private readonly Lazy _lazyIgnoredCondition; - public LazyDoLoopStatement(DoLoopKind doLoopKind, Lazy condition, Lazy body, Lazy invalidCondition, ImmutableArray locals, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : + public LazyDoLoopStatement(DoLoopKind doLoopKind, Lazy condition, Lazy body, Lazy ignoredCondition, ImmutableArray locals, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional constantValue, bool isImplicit) : base(doLoopKind, locals, semanticModel, syntax, type, constantValue, isImplicit) { _lazyCondition = condition ?? throw new System.ArgumentNullException(nameof(condition)); _lazyBody = body ?? throw new System.ArgumentNullException(nameof(body)); - _lazyInvalidCondition = invalidCondition ?? throw new System.ArgumentNullException(nameof(invalidCondition)); + _lazyIgnoredCondition = ignoredCondition ?? throw new System.ArgumentNullException(nameof(ignoredCondition)); } protected override IOperation ConditionImpl => _lazyCondition.Value; protected override IOperation BodyImpl => _lazyBody.Value; - protected override IOperation InvalidConditionImpl => _lazyInvalidCondition.Value; + protected override IOperation IgnoredConditionImpl => _lazyIgnoredCondition.Value; } /// diff --git a/src/Compilers/Core/Portable/Operations/Loops/IDoLoopStatement.cs b/src/Compilers/Core/Portable/Operations/Loops/IDoLoopStatement.cs index b3693ade6a17b0688c8a2226e0a10df5352d1255..0d7818dc686457b865401e687f4ddebec54c833d 100644 --- a/src/Compilers/Core/Portable/Operations/Loops/IDoLoopStatement.cs +++ b/src/Compilers/Core/Portable/Operations/Loops/IDoLoopStatement.cs @@ -22,12 +22,12 @@ public interface IDoLoopStatement : ILoopStatement DoLoopKind DoLoopKind { get; } /// - /// Additional conditional supplied for loop in error cases. + /// Additional conditional supplied for loop in error cases, which is ignored by the compiler. /// For example, for VB 'Do While' or 'Do Until' loop with syntax errors where both the top and bottom conditions are provided. - /// The top condition is preferred and exposed as and the bottom condition is exposed by this property. + /// The top condition is preferred and exposed as and the bottom condition is ignored and exposed by this property. /// This property should be null for all non-error cases. /// - IOperation InvalidCondition { get; } + IOperation IgnoredCondition { get; } } } diff --git a/src/Compilers/Core/Portable/Operations/Loops/ILoopStatement.cs b/src/Compilers/Core/Portable/Operations/Loops/ILoopStatement.cs index 2c52e216298078d953a3e420eac983cd801e9617..d8a0e6515f1d14dd10b54b5816d2d2ea5b046238 100644 --- a/src/Compilers/Core/Portable/Operations/Loops/ILoopStatement.cs +++ b/src/Compilers/Core/Portable/Operations/Loops/ILoopStatement.cs @@ -22,7 +22,7 @@ public interface ILoopStatement : IOperation /// IOperation Body { get; } /// - /// Declarations local to the loop. + /// Declared locals. /// ImmutableArray Locals { get; } } diff --git a/src/Compilers/Core/Portable/Operations/OperationCloner.cs b/src/Compilers/Core/Portable/Operations/OperationCloner.cs index 38eb9ef40b79e7d57ce27fe908484080896117ba..23de13abe72912e53422d71e9bfc08b1f52194db 100644 --- a/src/Compilers/Core/Portable/Operations/OperationCloner.cs +++ b/src/Compilers/Core/Portable/Operations/OperationCloner.cs @@ -86,7 +86,7 @@ public override IOperation VisitIfStatement(IIfStatement operation, object argum public override IOperation VisitDoLoopStatement(IDoLoopStatement operation, object argument) { - return new DoLoopStatement(operation.DoLoopKind, Visit(operation.Condition), Visit(operation.Body), Visit(operation.InvalidCondition), operation.Locals, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit); + return new DoLoopStatement(operation.DoLoopKind, Visit(operation.Condition), Visit(operation.Body), Visit(operation.IgnoredCondition), operation.Locals, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit); } public override IOperation VisitWhileLoopStatement(IWhileLoopStatement operation, object argument) diff --git a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb index 34c455060f4e6cb360c82ef7987ac8662e21489d..140047d4376e88a8c23ed4f0bfebf96086b24a02 100644 --- a/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb +++ b/src/Compilers/VisualBasic/Portable/Operations/VisualBasicOperationFactory.vb @@ -924,7 +924,7 @@ Namespace Microsoft.CodeAnalysis.Semantics Dim doLoopKind As DoLoopKind = GetDoLoopKind(boundDoLoopStatement) Dim condition As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundDoLoopStatement.ConditionOpt)) Dim body As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundDoLoopStatement.Body)) - Dim invalidConditionOpt As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() + Dim ignoredConditionOpt As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() If doLoopKind = DoLoopKind.Invalid Then Debug.Assert(boundDoLoopStatement.TopConditionOpt IsNot Nothing) Debug.Assert(boundDoLoopStatement.BottomConditionOpt IsNot Nothing) @@ -940,7 +940,7 @@ Namespace Microsoft.CodeAnalysis.Semantics Dim type As ITypeSymbol = Nothing Dim constantValue As [Optional](Of Object) = New [Optional](Of Object)() Dim isImplicit As Boolean = boundDoLoopStatement.WasCompilerGenerated - Return New LazyDoLoopStatement(doLoopKind, condition, body, invalidConditionOpt, locals, _semanticModel, syntax, type, constantValue, isImplicit) + Return New LazyDoLoopStatement(doLoopKind, condition, body, ignoredConditionOpt, locals, _semanticModel, syntax, type, constantValue, isImplicit) End Function Private Shared Function GetDoLoopKind(boundDoLoopStatement As BoundDoLoopStatement) As DoLoopKind @@ -964,7 +964,9 @@ Namespace Microsoft.CodeAnalysis.Semantics End Function Private Function CreateBoundForToStatementOperation(boundForToStatement As BoundForToStatement) As IForToLoopStatement - Dim locals As ImmutableArray(Of ILocalSymbol) = If(boundForToStatement.DeclaredOrInferredLocalOpt IsNot Nothing, ImmutableArray.Create(Of ILocalSymbol)(boundForToStatement.DeclaredOrInferredLocalOpt), ImmutableArray(Of ILocalSymbol).Empty) + Dim locals As ImmutableArray(Of ILocalSymbol) = If(boundForToStatement.DeclaredOrInferredLocalOpt IsNot Nothing, + ImmutableArray.Create(Of ILocalSymbol)(boundForToStatement.DeclaredOrInferredLocalOpt), + ImmutableArray(Of ILocalSymbol).Empty) Dim loopControlVariable As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForToStatement.ControlVariable)) Dim initialValue As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForToStatement.InitialValue)) Dim limitValue As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForToStatement.LimitValue)) @@ -984,7 +986,9 @@ Namespace Microsoft.CodeAnalysis.Semantics End Function Private Function CreateBoundForEachStatementOperation(boundForEachStatement As BoundForEachStatement) As IForEachLoopStatement - Dim locals As ImmutableArray(Of ILocalSymbol) = If(boundForEachStatement.DeclaredOrInferredLocalOpt IsNot Nothing, ImmutableArray.Create(Of ILocalSymbol)(boundForEachStatement.DeclaredOrInferredLocalOpt), ImmutableArray(Of ILocalSymbol).Empty) + Dim locals As ImmutableArray(Of ILocalSymbol) = If(boundForEachStatement.DeclaredOrInferredLocalOpt IsNot Nothing, + ImmutableArray.Create(Of ILocalSymbol)(boundForEachStatement.DeclaredOrInferredLocalOpt), + ImmutableArray(Of ILocalSymbol).Empty) Dim loopControlVariable As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForEachStatement.ControlVariable)) Dim collection As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForEachStatement.Collection)) Dim body As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForEachStatement.Body)) diff --git a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.vb b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.vb index c0bf5c0b8011302016a54bad6f2fcefc7a8dd800..3f440a2d12b9d1b49662150e4c77ad931cf35faf 100644 --- a/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.vb +++ b/src/Compilers/VisualBasic/Test/Semantic/IOperation/IOperationTests_IWhileUntilLoopStatement.vb @@ -1,4 +1,4 @@ -' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. Imports Microsoft.CodeAnalysis.Semantics Imports Microsoft.CodeAnalysis.Test.Utilities @@ -34,7 +34,7 @@ IDoLoopStatement (DoLoopKind: DoWhileBottomLoop) (LoopKind.Do) (OperationKind.Lo Condition: IBinaryOperatorExpression (BinaryOperatorKind.LessThan, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i < 4') Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i') Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 4) (Syntax: '4') - InvalidCondition: null + IgnoredCondition: null Body: IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: 'Do'BIND:"Do ... While i < 4') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'sum += ids(i)') Expression: ICompoundAssignmentExpression (BinaryOperatorKind.Add, Checked) (OperationKind.CompoundAssignmentExpression, Type: System.Int32) (Syntax: 'sum += ids(i)') @@ -71,7 +71,7 @@ IDoLoopStatement (DoLoopKind: DoUntilTopLoop) (LoopKind.Do) (OperationKind.LoopS Left: IFieldReferenceExpression: C.X As System.Int32 (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'X') Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'X') Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0') - InvalidCondition: null + IgnoredCondition: null Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do Until X ... Loop') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'X = X - 1') Expression: ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'X = X - 1') @@ -973,7 +973,7 @@ IDoLoopStatement (DoLoopKind: DoWhileTopLoop) (LoopKind.Do) (OperationKind.LoopS Condition: IInvocationExpression ( Function C.G() As System.Boolean) (OperationKind.InvocationExpression, Type: System.Boolean) (Syntax: 'G()') Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'G') Arguments(0) - InvalidCondition: null + IgnoredCondition: null Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do While G( ... Loop') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Console.WriteLine(1)') Expression: IInvocationExpression (Sub System.Console.WriteLine(value As System.Int32)) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'Console.WriteLine(1)') @@ -1012,7 +1012,7 @@ IDoLoopStatement (DoLoopKind: DoWhileBottomLoop) (LoopKind.Do) (OperationKind.Lo Condition: IInvocationExpression ( Function C.G() As System.Boolean) (OperationKind.InvocationExpression, Type: System.Boolean) (Syntax: 'G()') Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'G') Arguments(0) - InvalidCondition: null + IgnoredCondition: null Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do'BIND:"Do ... p While G()') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Console.WriteLine(1)') Expression: IInvocationExpression (Sub System.Console.WriteLine(value As System.Int32)) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'Console.WriteLine(1)') @@ -1046,7 +1046,7 @@ IDoLoopStatement (DoLoopKind: DoUntilBottomLoop) (LoopKind.Do) (OperationKind.Lo Left: IFieldReferenceExpression: C.X As System.Int32 (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'X') Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'X') Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0') - InvalidCondition: null + IgnoredCondition: null Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do'BIND:"Do ... Until X < 0') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'X = X - 1') Expression: ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'X = X - 1') @@ -1128,7 +1128,7 @@ IDoLoopStatement (DoLoopKind: Invalid) (LoopKind.Do) (OperationKind.LoopStatemen Condition: IBinaryOperatorExpression (BinaryOperatorKind.GreaterThan, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i > 0') Left: IParameterReferenceExpression: i (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'i') Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0') - InvalidCondition: IBinaryOperatorExpression (BinaryOperatorKind.LessThanOrEqual, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i <= 0') + IgnoredCondition: IBinaryOperatorExpression (BinaryOperatorKind.LessThanOrEqual, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i <= 0') Left: IParameterReferenceExpression: i (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'i') Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0') Body: IBlockStatement (1 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: 'Do While i ... ntil i <= 0') diff --git a/src/Test/Utilities/Portable/Compilation/OperationTreeVerifier.cs b/src/Test/Utilities/Portable/Compilation/OperationTreeVerifier.cs index 7fdd544365876e8acc57b7f650c3241953d69106..4930ee0b974fc6d54169b75a4e2657f5fc6e5a00 100644 --- a/src/Test/Utilities/Portable/Compilation/OperationTreeVerifier.cs +++ b/src/Test/Utilities/Portable/Compilation/OperationTreeVerifier.cs @@ -414,7 +414,7 @@ public override void VisitDoLoopStatement(IDoLoopStatement operation) LogLoopStatementHeader(operation); Visit(operation.Condition, "Condition"); - Visit(operation.InvalidCondition, "InvalidCondition"); + Visit(operation.IgnoredCondition, "IgnoredCondition"); Visit(operation.Body, "Body"); }