diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Assignment.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Assignment.cs index f3e2e510cd64..6f6b4609f050 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Assignment.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Expressions/Assignment.cs @@ -23,15 +23,12 @@ public static Assignment Create(ExpressionNodeInfo info) protected override void PopulateExpression(TextWriter trapFile) { var operatorKind = OperatorKind; + // TODO: THIS CHECK CAN BE SIMPLIFIED - As we now always consider this to be an operator invocation. if (operatorKind.HasValue) { - // Convert assignment such as `a += b` into `a = a + b`. - var simpleAssignExpr = new Expression(new ExpressionInfo(Context, Type, Location, ExprKind.SIMPLE_ASSIGN, this, 2, isCompilerGenerated: true, null)); - Create(Context, Syntax.Left, simpleAssignExpr, 1); - var opexpr = new Expression(new ExpressionInfo(Context, Type, Location, operatorKind.Value, simpleAssignExpr, 0, isCompilerGenerated: true, null)); - Create(Context, Syntax.Left, opexpr, 0, isCompilerGenerated: true); - Create(Context, Syntax.Right, opexpr, 1); - opexpr.OperatorCall(trapFile, Syntax); + Create(Context, Syntax.Left, this, 0); + Create(Context, Syntax.Right, this, 1); + OperatorCall(trapFile, Syntax); } else { diff --git a/csharp/ql/lib/semmle/code/csharp/Assignable.qll b/csharp/ql/lib/semmle/code/csharp/Assignable.qll index 3c7170a6f846..98278cc19ded 100644 --- a/csharp/ql/lib/semmle/code/csharp/Assignable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Assignable.qll @@ -78,6 +78,8 @@ class AssignableRead extends AssignableAccess { this.isRefArgument() or this = any(AssignableDefinitions::AddressOfDefinition def).getTargetAccess() + or + this = any(AssignableDefinitions::AssignOperationDefinition def).getTargetAccess() ) and not nameOfChild(_, this) } @@ -271,6 +273,8 @@ module AssignableInternal { def = TAddressOfDefinition(result) or def = TPatternDefinition(result) + or + def = TAssignOperationDefinition(result) } /** A local variable declaration at the top-level of a pattern. */ @@ -286,7 +290,10 @@ module AssignableInternal { private module Cached { cached newtype TAssignableDefinition = - TAssignmentDefinition(Assignment a) { not a.getLValue() instanceof TupleExpr } or + TAssignmentDefinition(Assignment a) { + not a.getLValue() instanceof TupleExpr and + not a instanceof AssignOperation + } or TTupleAssignmentDefinition(AssignExpr ae, Expr leaf) { tupleAssignmentDefinition(ae, leaf) } or TOutRefDefinition(AssignableAccess aa) { aa.isOutArgument() @@ -309,7 +316,8 @@ module AssignableInternal { ) } or TAddressOfDefinition(AddressOfExpr aoe) or - TPatternDefinition(TopLevelPatternDecl tlpd) + TPatternDefinition(TopLevelPatternDecl tlpd) or + TAssignOperationDefinition(AssignOperation ao) /** * Gets the source expression assigned in tuple definition `def`, if any. @@ -355,6 +363,8 @@ module AssignableInternal { def = TMutationDefinition(any(MutatorOperation mo | mo.getOperand() = result)) or def = TAddressOfDefinition(any(AddressOfExpr aoe | aoe.getOperand() = result)) + or + def = TAssignOperationDefinition(any(AssignOperation ao | ao.getLeftOperand() = result)) } /** @@ -369,8 +379,10 @@ module AssignableInternal { or exists(Assignment ass | ac = ass.getLValue() | result = ass.getRValue() and - not ass.(AssignOperation).hasExpandedAssignment() + not ass instanceof AssignOperation ) + or + exists(AssignOperation ao | ac = ao.getLeftOperand() | result = ao) } } @@ -388,8 +400,9 @@ private import AssignableInternal * a mutation update (`AssignableDefinitions::MutationDefinition`), a local variable * declaration without an initializer (`AssignableDefinitions::LocalVariableDefinition`), * an implicit parameter definition (`AssignableDefinitions::ImplicitParameterDefinition`), - * an address-of definition (`AssignableDefinitions::AddressOfDefinition`), or a pattern - * definition (`AssignableDefinitions::PatternDefinition`). + * an address-of definition (`AssignableDefinitions::AddressOfDefinition`), a pattern + * definition (`AssignableDefinitions::PatternDefinition`), or a compound assignment + * operation definition (`AssignableDefinitions::AssignOperationDefinition`) */ class AssignableDefinition extends TAssignableDefinition { /** @@ -511,7 +524,7 @@ module AssignableDefinitions { override Expr getSource() { result = a.getRValue() and - not a instanceof AssignOperation + not a instanceof AddOrRemoveEventExpr } override string toString() { result = a.toString() } @@ -735,4 +748,17 @@ module AssignableDefinitions { /** Gets the assignable (field or property) being initialized. */ Assignable getAssignable() { result = fieldOrProp } } + + /** + * A definition by a compound assignment operation, for example `x += y`. + */ + class AssignOperationDefinition extends AssignableDefinition, TAssignOperationDefinition { + AssignOperation ao; + + AssignOperationDefinition() { this = TAssignOperationDefinition(ao) } + + override Expr getSource() { result = ao } + + override string toString() { result = ao.toString() } + } } diff --git a/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll b/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll index aa834ef91038..3ce937316a84 100644 --- a/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll +++ b/csharp/ql/lib/semmle/code/csharp/ExprOrStmtParent.qll @@ -20,7 +20,7 @@ class ExprOrStmtParent extends Element, @exprorstmt_parent { /** Gets the `i`th child expression of this element (zero-based). */ final Expr getChildExpr(int i) { - expr_parent_adjusted(result, i, this) or + expr_parent(result, i, this) or expr_parent_top_level_adjusted(result, i, this) } @@ -119,66 +119,14 @@ private module Cached { } /** - * The `expr_parent()` relation adjusted for expandable assignments. For example, - * the assignment `x += y` is extracted as - * - * ``` - * += - * | - * 2 - * | - * = - * / \ - * 1 0 - * / \ - * x + - * / \ - * 1 0 - * / \ - * x y - * ``` - * - * in order to be able to retrieve the expanded assignment `x = x + y` as the 2nd - * child. This predicate changes the diagram above into - * - * ``` - * += - * / \ - * 1 0 - * / \ - * x y - * ``` + * Use `expr_parent` instead. */ cached - predicate expr_parent_adjusted(Expr child, int i, ControlFlowElement parent) { - if parent instanceof AssignOperation - then - parent = - any(AssignOperation ao | - exists(AssignExpr ae | ae = ao.getExpandedAssignment() | - i = 0 and - exists(Expr right | - // right = `x + y` - expr_parent(right, 0, ae) - | - expr_parent(child, 1, right) - ) - or - i = 1 and - expr_parent(child, 1, ae) - ) - or - not ao.hasExpandedAssignment() and - expr_parent(child, i, parent) - ) - else expr_parent(child, i, parent) - } + deprecated predicate expr_parent_adjusted(Expr child, int i, ControlFlowElement parent) { none() } private Expr getAChildExpr(ExprOrStmtParent parent) { result = parent.getAChildExpr() and not result = parent.(DeclarationWithGetSetAccessors).getExpressionBody() - or - result = parent.(AssignOperation).getExpandedAssignment() } private ControlFlowElement getAChild(ExprOrStmtParent parent) { diff --git a/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll b/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll index bdf9e5585394..f2d39f9dcc7c 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/Strings.qll @@ -49,6 +49,16 @@ class ImplicitToStringExpr extends Expr { this = add.getOtherOperand(o).stripImplicit() ) or + // s1 += s2 for where the left hand side is a string, call an operator +(string, object) + exists(AssignAddExpr add, Operator o, Parameter p0, Parameter p1 | + o = add.getTarget() and + o.getName() = "+" and + p0 = o.getParameter(0) and + p1 = o.getParameter(1) and + p0.getType() instanceof StringType and + this = getAnAssignedArgumentOrParam(p1).stripImplicit() + ) + or this = any(InterpolatedStringExpr ise).getAnInsert().stripImplicit() } } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll index 40ec3722edd2..0dc04f70f3b5 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll @@ -296,6 +296,10 @@ private module LogicInput implements GuardsImpl::LogicInputSig { v1.isNullValue() and v2 = v1 or + g2 = g1.(AssignCoalesceExpr).getAnOperand() and + v1.isNullValue() and + v2 = v1 + or exists(Assertion assert, AssertMethod target, int i | assert.getAssertMethod() = target and g1 = assert and @@ -841,6 +845,8 @@ module Internal { e1 = e2.(Cast).getExpr() or e2 = e1.(NullCoalescingExpr).getAnOperand() + or + e2 = e1.(AssignCoalesceExpr).getAnOperand() } /** Holds if expression `e3` is a `null` value whenever `e1` and `e2` are. */ @@ -848,6 +854,8 @@ module Internal { e3 = any(ConditionalExpr ce | e1 = ce.getThen() and e2 = ce.getElse()) or e3 = any(NullCoalescingExpr nce | e1 = nce.getLeftOperand() and e2 = nce.getRightOperand()) + or + e3 = any(AssignCoalesceExpr ace | e1 = ace.getLeftOperand() and e2 = ace.getRightOperand()) } predicate nullValueImplied(Expr e) { @@ -922,11 +930,10 @@ module Internal { /** Holds if expression `e2` is a non-`null` value whenever `e1` is. */ predicate nonNullValueImpliedUnary(Expr e1, Expr e2) { - e1 = e2.(CastExpr).getExpr() - or - e1 = e2.(AssignExpr).getRValue() - or - e1 = e2.(NullCoalescingExpr).getAnOperand() + e1 = e2.(CastExpr).getExpr() or + e1 = e2.(AssignExpr).getRValue() or + e1 = e2.(NullCoalescingExpr).getAnOperand() or + e1 = e2.(AssignCoalesceExpr).getAnOperand() } /** @@ -953,10 +960,13 @@ module Internal { ) or // In C#, `null + 1` has type `int?` with value `null` - exists(BinaryArithmeticOperation bao, Expr o | - result = bao and - bao.getAnOperand() = e and - bao.getAnOperand() = o and + exists(BinaryOperation bo, Expr o | + bo instanceof BinaryArithmeticOperation or + bo instanceof AssignArithmeticOperation + | + result = bo and + bo.getAnOperand() = e and + bo.getAnOperand() = o and // The other operand must be provably non-null in order // for `only if` to hold nonNullValueImplied(o) and @@ -972,10 +982,10 @@ module Internal { any(QualifiableExpr qe | qe.isConditional() and result = qe.getQualifier() - ) - or + ) or // In C#, `null + 1` has type `int?` with value `null` - e = any(BinaryArithmeticOperation bao | result = bao.getAnOperand()) + e = any(BinaryArithmeticOperation bao | result = bao.getAnOperand()) or + e = any(AssignArithmeticOperation aao | result = aao.getAnOperand()) } deprecated predicate isGuard(Expr e, GuardValue val) { diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll index 1696869e5911..ea3007e3a839 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll @@ -89,18 +89,13 @@ class CfgScope extends Element, @top_level_exprorstmt_parent { private class TAstNode = @callable or @control_flow_element; -private Element getAChild(Element p) { - result = p.getAChild() or - result = p.(AssignOperation).getExpandedAssignment() -} - pragma[nomagic] private predicate astNode(Element e) { e = any(@top_level_exprorstmt_parent p | not p instanceof Attribute) or exists(Element parent | astNode(parent) and - e = getAChild(parent) + e = parent.getAChild() ) } @@ -486,6 +481,7 @@ module Expressions { result = qe.getChild(i) ) or + // TODO: This can be fixed if the extracted indexes are fixed. e = any(Assignment a | // The left-hand side of an assignment is evaluated before the right-hand side @@ -520,7 +516,6 @@ module Expressions { not this instanceof LogicalOrExpr and not this instanceof NullCoalescingExpr and not this instanceof ConditionalExpr and - not this instanceof AssignOperationWithExpandedAssignment and not this instanceof ConditionallyQualifiedExpr and not this instanceof ThrowExpr and not this instanceof ObjectCreation and @@ -618,7 +613,7 @@ module Expressions { def.getExpr() = this and def.getTargetAccess().(WriteAccess) instanceof QualifiableExpr and not def instanceof AssignableDefinitions::OutRefDefinition and - not this instanceof AssignOperationWithExpandedAssignment + not def instanceof AssignableDefinitions::AssignOperationDefinition } /** @@ -801,26 +796,6 @@ module Expressions { } } - /** - * An assignment operation that has an expanded version. We use the expanded - * version in the control flow graph in order to get better data flow / taint - * tracking. - */ - private class AssignOperationWithExpandedAssignment extends ControlFlowTree instanceof AssignOperation - { - private Expr expanded; - - AssignOperationWithExpandedAssignment() { expanded = this.getExpandedAssignment() } - - final override predicate first(AstNode first) { first(expanded, first) } - - final override predicate last(AstNode last, Completion c) { last(expanded, last, c) } - - final override predicate propagatesAbnormal(AstNode child) { none() } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - /** A conditionally qualified expression. */ private class ConditionallyQualifiedExpr extends PostOrderTree instanceof QualifiableExpr { private Expr qualifier; @@ -1578,7 +1553,7 @@ module Statements { /** Gets a child of `cfe` that is in CFG scope `scope`. */ pragma[noinline] private ControlFlowElement getAChildInScope(AstNode cfe, Callable scope) { - result = getAChild(cfe) and + result = cfe.getAChild() and scope = result.getEnclosingCallable() } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll index 70161a6fc477..4817b56b864d 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -1579,6 +1579,15 @@ private module ArgumentNodes { scope = def.getExpr() ) else scope = e2 + or + e1.(Argument).isArgumentOf(e2, _) and + exists(AssignableDefinitions::AssignOperationDefinition def | + def.getTargetAccess() = e2 and + def.getExpr() = e1 + ) and + exactScope = false and + isSuccessor = false and + scope = e1 } } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll index bb08c8f7e2ca..3f0090d4791c 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll @@ -60,6 +60,9 @@ private class LocalTaintExprStepConfiguration extends ControlFlowReachabilityCon e1 = e2.(AddExpr).getAnOperand() and scope = e2 or + e1 = e2.(AssignAddExpr).getAnOperand() and + scope = e2 + or // A comparison expression where taint can flow from one of the // operands if the other operand is a constant value. exists(ComparisonTest ct, Expr other | diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll index 71d177a48bb1..b50f5cb00016 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/RangeUtils.qll @@ -33,7 +33,9 @@ private module Impl { /** Holds if SSA definition `def` equals `e + delta`. */ predicate ssaUpdateStep(ExplicitDefinition def, ExprNode e, int delta) { exists(ControlFlow::Node cfn | cfn = def.getControlFlowNode() | - e = cfn.(ExprNode::Assignment).getRValue() and delta = 0 + e = cfn.(ExprNode::Assignment).getRValue() and + delta = 0 and + not cfn instanceof ExprNode::AssignOperation or e = cfn.(ExprNode::PostIncrExpr).getOperand() and delta = 1 or @@ -66,12 +68,24 @@ private module Impl { x.getIntValue() = delta ) or + exists(ConstantIntegerExpr x | + e2.(ExprNode::AssignAddExpr).getLeftOperand() = e1 and + e2.(ExprNode::AssignAddExpr).getRightOperand() = x and + x.getIntValue() = delta + ) + or exists(ConstantIntegerExpr x | e2.(ExprNode::SubExpr).getLeftOperand() = e1 and e2.(ExprNode::SubExpr).getRightOperand() = x and x.getIntValue() = -delta ) or + exists(ConstantIntegerExpr x | + e2.(ExprNode::AssignSubExpr).getLeftOperand() = e1 and + e2.(ExprNode::AssignSubExpr).getRightOperand() = x and + x.getIntValue() = -delta + ) + or // Conditional expressions with only one branch can happen either // because of pruning or because of Boolean splitting. In such cases // the conditional expression has the same value as the branch. @@ -230,6 +244,11 @@ module ExprNode { override CS::AssignExpr e; } + /** A compound assignment operation. */ + class AssignOperation extends Assignment, BinaryOperation { + override CS::AssignOperation e; + } + /** A unary operation. */ class UnaryOperation extends ExprNode { override CS::UnaryOperation e; @@ -397,6 +416,90 @@ module ExprNode { override TUnsignedRightShiftOp getOp() { any() } } + /** A compound addition assignment operation. */ + class AssignAddExpr extends AssignOperation { + override CS::AssignAddExpr e; + + override TAddOp getOp() { any() } + } + + /** A compound subtraction assignment operation. */ + class AssignSubExpr extends AssignOperation { + override CS::AssignSubExpr e; + + override TSubOp getOp() { any() } + } + + /** A compound multiplication assignment operation. */ + class AssignMulExpr extends AssignOperation { + override CS::AssignMulExpr e; + + override TMulOp getOp() { any() } + } + + /** A compound division assignment operation. */ + class AssignDivExpr extends AssignOperation { + override CS::AssignDivExpr e; + + override TDivOp getOp() { any() } + } + + /** A compound remainder assignment operation. */ + class AssignRemExpr extends AssignOperation { + override CS::AssignRemExpr e; + + override TRemOp getOp() { any() } + } + + /** A compound bitwise assignment operation. */ + class AssignBitwiseOperation extends AssignOperation { + override CS::AssignBitwiseOperation e; + + override TBinarySignOperation getOp() { none() } + } + + /** A compound bitwise-and assignment operation. */ + class AssignAndExpr extends AssignOperation { + override CS::AssignAndExpr e; + + override TBitAndOp getOp() { any() } + } + + /** A compound bitwise-or assignment operation. */ + class AssignOrExpr extends AssignOperation { + override CS::AssignOrExpr e; + + override TBitOrOp getOp() { any() } + } + + /** A compound bitwise-xor assignment operation. */ + class AssignXorExpr extends AssignOperation { + override CS::AssignXorExpr e; + + override TBitXorOp getOp() { any() } + } + + /** A compound left-shift assignment operation. */ + class AssignLeftShiftExpr extends AssignOperation { + override CS::AssignLeftShiftExpr e; + + override TLeftShiftOp getOp() { any() } + } + + /** A compound right-shift assignment operation. */ + class AssignRightShiftExpr extends AssignOperation { + override CS::AssignRightShiftExpr e; + + override TRightShiftOp getOp() { any() } + } + + /** A compound unsigned right-shift assignment operation. */ + class AssignUnsignedRightShiftExpr extends AssignOperation { + override CS::AssignUnsighedRightShiftExpr e; + + override TUnsignedRightShiftOp getOp() { any() } + } + /** A conditional expression. */ class ConditionalExpr extends ExprNode { override CS::ConditionalExpr e; diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll index 1bd86e19f34d..01511d348a47 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisSpecific.qll @@ -130,6 +130,11 @@ private module Impl { adef = def.getADefinition() and hasChild(adef.getExpr(), adef.getSource(), def.getControlFlowNode(), result) ) + or + exists(AssignableDefinitions::AssignOperationDefinition adef | + adef = def.getADefinition() and + result.getExpr() = adef.getSource() + ) } /** Holds if `def` can have any sign. */ diff --git a/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll b/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll index a83967441d74..f7f6c7a50be4 100644 --- a/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll +++ b/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll @@ -202,11 +202,9 @@ private module Internal { private predicate isPotentialEventCall( AssignArithmeticOperation aao, DynamicMemberAccess dma, string name ) { - exists(DynamicOperatorCall doc, AssignExpr ae | - ae = aao.getExpandedAssignment() and - dma = ae.getLValue() and - doc = ae.getRValue() - | + aao instanceof DynamicOperatorCall and + dma = aao.getLeftOperand() and + ( aao instanceof AssignAddExpr and name = "add_" + dma.getLateBoundTargetName() or diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll index 9fa2a93724d4..3cce72515d45 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Assignment.qll @@ -64,33 +64,31 @@ class AssignExpr extends Assignment, @simple_assign_expr { /** * An assignment operation. Either an arithmetic assignment operation - * (`AssignArithmeticOperation`), a bitwise assignment operation - * (`AssignBitwiseOperation`), or an event assignment (`AddOrRemoveEventExpr`). + * (`AssignArithmeticOperation`), a bitwise assignment operation or + * (`AssignBitwiseOperation`). */ -class AssignOperation extends Assignment, @assign_op_expr { +class AssignOperation extends Assignment, OperatorCall, @assign_op_expr { override string getOperator() { none() } /** - * Gets the expanded version of this assignment operation, if any. - * - * For example, if this assignment operation is `x += y` then - * the expanded assignment is `x = x + y`. - * - * If an expanded version exists, then it is used in the control - * flow graph. + * Expanded versions of compound assignments are no longer extracted. */ - AssignExpr getExpandedAssignment() { expr_parent(result, 2, this) } + deprecated AssignExpr getExpandedAssignment() { none() } /** - * Holds if this assignment operation has an expanded version. - * - * For example, if this assignment operation is `x += y` then - * it has the expanded version `x = x + y`. - * - * If an expanded version exists, then it is used in the control - * flow graph. + * Expanded versions of compound assignments are no longer extracted. */ - predicate hasExpandedAssignment() { exists(this.getExpandedAssignment()) } + deprecated predicate hasExpandedAssignment() { none() } + + override Expr getLeftOperand() { result = this.getChild(0) } + + override Expr getRightOperand() { result = this.getChild(1) } + + /** Gets the left operand of this assignment. */ + override Expr getLValue() { result = this.getChild(0) } + + /** Gets the right operand of this assignment. */ + override Expr getRValue() { result = this.getChild(1) } override string toString() { result = "... " + this.getOperator() + " ..." } } @@ -218,13 +216,21 @@ class AssignUnsighedRightShiftExpr extends AssignBitwiseOperation, @assign_urshi * An event assignment. Either an event addition (`AddEventExpr`) or an event * removal (`RemoveEventExpr`). */ -class AddOrRemoveEventExpr extends AssignOperation, @assign_event_expr { +class AddOrRemoveEventExpr extends Assignment, @assign_event_expr { + override string getOperator() { none() } + /** Gets the event targeted by this event assignment. */ Event getTarget() { result = this.getLValue().getTarget() } override EventAccess getLValue() { result = this.getChild(1) } override Expr getRValue() { result = this.getChild(0) } + + override EventAccess getLeftOperand() { result = this.getChild(1) } + + override Expr getRightOperand() { result = this.getChild(0) } + + override string toString() { result = "... " + this.getOperator() + " ..." } } /** diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll index f8b51a990ed1..912cb23e06b7 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Call.qll @@ -493,12 +493,16 @@ class ConstructorInitializer extends Call, @constructor_init_expr { * } * ``` */ -class OperatorCall extends Call, LateBindableExpr, @operator_invocation_expr { +class OperatorCall extends Call, LateBindableExpr, @op_invoke_expr { override Operator getTarget() { expr_call(this, result) } override Operator getARuntimeTarget() { result = Call.super.getARuntimeTarget() } - override string toString() { result = "call to operator " + this.getTarget().getName() } + override string toString() { + if this instanceof DynamicOperatorCall + then result = "dynamic call to operator " + this.getLateBoundTargetName() + else result = "call to operator " + this.getTarget().getName() + } override string getAPrimaryQlClass() { result = "OperatorCall" } } diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Dynamic.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Dynamic.qll index 04ea9f062a50..bfc5c36ff37c 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Dynamic.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Dynamic.qll @@ -96,13 +96,7 @@ class DynamicMethodCall extends DynamicExpr, MethodCall { * Unlike an ordinary call to a user-defined operator (`OperatorCall`), the * target operator may not be known at compile-time (as in the example above). */ -class DynamicOperatorCall extends DynamicExpr, OperatorCall { - override string toString() { - result = "dynamic call to operator " + this.getLateBoundTargetName() - } - - override string getAPrimaryQlClass() { result = "DynamicOperatorCall" } -} +class DynamicOperatorCall extends DynamicExpr, OperatorCall { } /** * A call to a user-defined mutator operator where the operand is a `dynamic` diff --git a/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll index c3b9bcc363b3..7b5176278ce4 100644 --- a/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll +++ b/csharp/ql/lib/semmle/code/csharp/exprs/Expr.qll @@ -65,25 +65,11 @@ class Expr extends ControlFlowElement, @expr { /** Gets the enclosing callable of this expression, if any. */ override Callable getEnclosingCallable() { enclosingCallable(this, result) } - pragma[nomagic] - private predicate isExpandedAssignmentRValueDescendant() { - this = - any(AssignOperation op).getExpandedAssignment().getRValue().getChildExpr(0).getAChildExpr() - or - exists(Expr parent | - parent.isExpandedAssignmentRValueDescendant() and - this = parent.getAChildExpr() - ) - } - /** * Holds if this expression is generated by the compiler and does not appear * explicitly in the source code. */ - final predicate isImplicit() { - compiler_generated(this) or - this.isExpandedAssignmentRValueDescendant() - } + final predicate isImplicit() { compiler_generated(this) } /** * Gets an expression that is the result of stripping (recursively) all diff --git a/csharp/ql/lib/semmlecode.csharp.dbscheme b/csharp/ql/lib/semmlecode.csharp.dbscheme index e73ca2c93df8..eadfb04c00fc 100644 --- a/csharp/ql/lib/semmlecode.csharp.dbscheme +++ b/csharp/ql/lib/semmlecode.csharp.dbscheme @@ -1215,8 +1215,8 @@ case @expr.kind of @literal_expr = @bool_literal_expr | @char_literal_expr | @integer_literal_expr | @real_literal_expr | @string_literal_expr | @null_literal_expr; -@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr; -@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_event_expr | @assign_coalesce_expr; +@assign_expr = @simple_assign_expr | @assign_op_expr | @local_var_decl_expr | @assign_event_expr; +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr | @assign_coalesce_expr; @assign_event_expr = @add_event_expr | @remove_event_expr; @assign_arith_expr = @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr @@ -1270,14 +1270,15 @@ case @expr.kind of @anonymous_function_expr = @lambda_expr | @anonymous_method_expr; -@call = @method_invocation_expr | @constructor_init_expr | @operator_invocation_expr +@op_invoke_expr = @operator_invocation_expr | @assign_op_expr +@call = @method_invocation_expr | @constructor_init_expr | @op_invoke_expr | @delegate_invocation_expr | @object_creation_expr | @call_access_expr | @local_function_invocation_expr | @function_pointer_invocation_expr; @call_access_expr = @property_access_expr | @event_access_expr | @indexer_access_expr; @late_bindable_expr = @dynamic_element_access_expr | @dynamic_member_access_expr - | @object_creation_expr | @method_invocation_expr | @operator_invocation_expr; + | @object_creation_expr | @method_invocation_expr | @op_invoke_expr; @throw_element = @throw_expr | @throw_stmt; diff --git a/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql b/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql index 0f6e6d11fb2c..59816a18b3fb 100644 --- a/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql +++ b/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql @@ -84,6 +84,8 @@ class RelevantDefinition extends AssignableDefinition { ) or this instanceof AssignableDefinitions::PatternDefinition + or + this instanceof AssignableDefinitions::AssignOperationDefinition } /** Holds if this assignment may be live. */ diff --git a/csharp/ql/src/Likely Bugs/DangerousNonShortCircuitLogic.ql b/csharp/ql/src/Likely Bugs/DangerousNonShortCircuitLogic.ql index b980bfba1aea..53bf2599a551 100644 --- a/csharp/ql/src/Likely Bugs/DangerousNonShortCircuitLogic.ql +++ b/csharp/ql/src/Likely Bugs/DangerousNonShortCircuitLogic.ql @@ -18,14 +18,9 @@ import csharp /** A use of `&` or `|` on operands of type boolean. */ class NonShortCircuit extends BinaryBitwiseOperation { NonShortCircuit() { - ( - this instanceof BitwiseAndExpr - or - this instanceof BitwiseOrExpr - ) and - not exists(AssignBitwiseOperation abo | abo.getExpandedAssignment().getRValue() = this) and - this.getLeftOperand().getType() instanceof BoolType and - this.getRightOperand().getType() instanceof BoolType + this instanceof BitwiseAndExpr + or + this instanceof BitwiseOrExpr } pragma[nomagic] diff --git a/csharp/ql/src/Performance/StringConcatenationInLoop.ql b/csharp/ql/src/Performance/StringConcatenationInLoop.ql index a015771610d5..3b3228588a4b 100644 --- a/csharp/ql/src/Performance/StringConcatenationInLoop.ql +++ b/csharp/ql/src/Performance/StringConcatenationInLoop.ql @@ -23,7 +23,6 @@ class StringCat extends AddExpr { * where `v` is a simple variable (and not, for example, a property). */ predicate isSelfConcatAssignExpr(AssignExpr e, Variable v) { - not e = any(AssignAddExpr a).getExpandedAssignment() and exists(VariableAccess use | stringCatContains(e.getRValue(), use) and use.getTarget() = e.getTargetVariable() and diff --git a/csharp/ql/src/Security Features/InsecureRandomness.ql b/csharp/ql/src/Security Features/InsecureRandomness.ql index 2c2df7010c67..8237afdff130 100644 --- a/csharp/ql/src/Security Features/InsecureRandomness.ql +++ b/csharp/ql/src/Security Features/InsecureRandomness.ql @@ -89,11 +89,7 @@ module Random { e = any(SensitiveLibraryParameter v).getAnAssignedArgument() or // Assignment operation, e.g. += or similar - exists(AssignOperation ao | - ao.getRValue() = e and - // "expanded" assignments will be covered by simple assignment - not ao.hasExpandedAssignment() - | + exists(AssignOperation ao | ao.getRValue() = e | ao.getLValue() = any(SensitiveVariable v).getAnAccess() or ao.getLValue() = any(SensitiveProperty v).getAnAccess() or ao.getLValue() = any(SensitiveLibraryParameter v).getAnAccess() diff --git a/csharp/ql/test/library-tests/arguments/argumentByName.expected b/csharp/ql/test/library-tests/arguments/argumentByName.expected index 6fcb9021d17d..065d70703120 100644 --- a/csharp/ql/test/library-tests/arguments/argumentByName.expected +++ b/csharp/ql/test/library-tests/arguments/argumentByName.expected @@ -33,14 +33,16 @@ | arguments.cs:59:16:59:25 | access to indexer | arguments.cs:59:21:59:21 | 3 | a | | arguments.cs:59:16:59:25 | access to indexer | arguments.cs:59:24:59:24 | 4 | b | | arguments.cs:59:16:59:25 | access to indexer | arguments.cs:59:34:59:34 | 6 | value | -| arguments.cs:61:9:61:12 | access to property Prop | arguments.cs:61:9:61:17 | ... + ... | value | +| arguments.cs:61:9:61:12 | access to property Prop | arguments.cs:61:9:61:17 | ... += ... | value | +| arguments.cs:61:9:61:17 | ... += ... | arguments.cs:61:9:61:12 | access to property Prop | left | +| arguments.cs:61:9:61:17 | ... += ... | arguments.cs:61:17:61:17 | 7 | right | | arguments.cs:62:9:62:18 | access to indexer | arguments.cs:62:14:62:14 | 8 | a | | arguments.cs:62:9:62:18 | access to indexer | arguments.cs:62:17:62:17 | 9 | b | -| arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:9:63:26 | ... + ... | value | +| arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:9:63:26 | ... += ... | value | | arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:14:63:15 | 10 | a | -| arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:14:63:15 | 10 | a | -| arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:18:63:19 | 11 | b | | arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:18:63:19 | 11 | b | +| arguments.cs:63:9:63:26 | ... += ... | arguments.cs:63:9:63:20 | access to indexer | left | +| arguments.cs:63:9:63:26 | ... += ... | arguments.cs:63:25:63:26 | 12 | right | | arguments.cs:65:16:65:27 | access to indexer | arguments.cs:65:21:65:22 | 15 | a | | arguments.cs:65:16:65:27 | access to indexer | arguments.cs:65:25:65:26 | 16 | b | | arguments.cs:76:9:76:31 | call to method f8`1 | arguments.cs:76:12:76:12 | 0 | o | diff --git a/csharp/ql/test/library-tests/arguments/argumentByParameter.expected b/csharp/ql/test/library-tests/arguments/argumentByParameter.expected index ac354d31e28e..c04658592532 100644 --- a/csharp/ql/test/library-tests/arguments/argumentByParameter.expected +++ b/csharp/ql/test/library-tests/arguments/argumentByParameter.expected @@ -33,12 +33,12 @@ | arguments.cs:59:16:59:25 | access to indexer | arguments.cs:59:21:59:21 | 3 | arguments.cs:53:18:53:18 | a | | arguments.cs:59:16:59:25 | access to indexer | arguments.cs:59:24:59:24 | 4 | arguments.cs:53:25:53:25 | b | | arguments.cs:59:16:59:25 | access to indexer | arguments.cs:59:34:59:34 | 6 | arguments.cs:53:44:53:46 | value | -| arguments.cs:61:9:61:12 | access to property Prop | arguments.cs:61:9:61:17 | ... + ... | arguments.cs:51:21:51:23 | value | +| arguments.cs:61:9:61:12 | access to property Prop | arguments.cs:61:9:61:17 | ... += ... | arguments.cs:51:21:51:23 | value | | arguments.cs:62:9:62:18 | access to indexer | arguments.cs:62:14:62:14 | 8 | arguments.cs:53:18:53:18 | a | | arguments.cs:62:9:62:18 | access to indexer | arguments.cs:62:14:62:14 | 8 | arguments.cs:53:18:53:18 | a | | arguments.cs:62:9:62:18 | access to indexer | arguments.cs:62:17:62:17 | 9 | arguments.cs:53:25:53:25 | b | | arguments.cs:62:9:62:18 | access to indexer | arguments.cs:62:17:62:17 | 9 | arguments.cs:53:25:53:25 | b | -| arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:9:63:26 | ... + ... | arguments.cs:53:44:53:46 | value | +| arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:9:63:26 | ... += ... | arguments.cs:53:44:53:46 | value | | arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:14:63:15 | 10 | arguments.cs:53:18:53:18 | a | | arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:14:63:15 | 10 | arguments.cs:53:18:53:18 | a | | arguments.cs:63:9:63:20 | access to indexer | arguments.cs:63:18:63:19 | 11 | arguments.cs:53:25:53:25 | b | diff --git a/csharp/ql/test/library-tests/arguments/argumentType.expected b/csharp/ql/test/library-tests/arguments/argumentType.expected index 0dac70193453..fa148e657b44 100644 --- a/csharp/ql/test/library-tests/arguments/argumentType.expected +++ b/csharp/ql/test/library-tests/arguments/argumentType.expected @@ -36,8 +36,6 @@ | arguments.cs:62:14:62:14 | 8 | 0 | | arguments.cs:62:17:62:17 | 9 | 0 | | arguments.cs:63:14:63:15 | 10 | 0 | -| arguments.cs:63:14:63:15 | 10 | 0 | -| arguments.cs:63:18:63:19 | 11 | 0 | | arguments.cs:63:18:63:19 | 11 | 0 | | arguments.cs:64:22:64:23 | 13 | 0 | | arguments.cs:64:26:64:27 | 14 | 0 | diff --git a/csharp/ql/test/library-tests/arguments/parameterGetArguments.expected b/csharp/ql/test/library-tests/arguments/parameterGetArguments.expected index 6f25b07e2e5a..9f830954efb8 100644 --- a/csharp/ql/test/library-tests/arguments/parameterGetArguments.expected +++ b/csharp/ql/test/library-tests/arguments/parameterGetArguments.expected @@ -28,7 +28,7 @@ | arguments.cs:51:21:51:23 | value | arguments.cs:57:16:57:16 | 0 | | arguments.cs:51:21:51:23 | value | arguments.cs:58:16:58:25 | access to indexer | | arguments.cs:51:21:51:23 | value | arguments.cs:59:31:59:31 | 5 | -| arguments.cs:51:21:51:23 | value | arguments.cs:61:9:61:17 | ... + ... | +| arguments.cs:51:21:51:23 | value | arguments.cs:61:9:61:17 | ... += ... | | arguments.cs:53:18:53:18 | a | arguments.cs:58:21:58:21 | 1 | | arguments.cs:53:18:53:18 | a | arguments.cs:59:21:59:21 | 3 | | arguments.cs:53:18:53:18 | a | arguments.cs:62:14:62:14 | 8 | @@ -44,7 +44,7 @@ | arguments.cs:53:25:53:25 | b | arguments.cs:63:18:63:19 | 11 | | arguments.cs:53:25:53:25 | b | arguments.cs:65:25:65:26 | 16 | | arguments.cs:53:44:53:46 | value | arguments.cs:59:34:59:34 | 6 | -| arguments.cs:53:44:53:46 | value | arguments.cs:63:9:63:26 | ... + ... | +| arguments.cs:53:44:53:46 | value | arguments.cs:63:9:63:26 | ... += ... | | arguments.cs:74:20:74:20 | o | arguments.cs:76:12:76:12 | 0 | | arguments.cs:74:20:74:20 | o | arguments.cs:77:12:77:12 | 0 | | arguments.cs:74:20:74:20 | o | arguments.cs:78:12:78:12 | 0 | diff --git a/csharp/ql/test/library-tests/assignments/AssignOperation.expected b/csharp/ql/test/library-tests/assignments/AssignOperation.expected index f6f03fd050c6..0315bbe1c906 100644 --- a/csharp/ql/test/library-tests/assignments/AssignOperation.expected +++ b/csharp/ql/test/library-tests/assignments/AssignOperation.expected @@ -1,4 +1,3 @@ | Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:14:6:14 | 1 | | Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:14:9:14 | 2 | | Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:14:12:17 | this access | -| Assignments.cs:14:9:14:35 | ... += ... | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:18:14:35 | (...) => ... | diff --git a/csharp/ql/test/library-tests/assignments/AssignOperationExpanded.expected b/csharp/ql/test/library-tests/assignments/AssignOperationExpanded.expected deleted file mode 100644 index bcc9d11c42f5..000000000000 --- a/csharp/ql/test/library-tests/assignments/AssignOperationExpanded.expected +++ /dev/null @@ -1,3 +0,0 @@ -| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:14:6:14 | 1 | -| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:14:9:14 | 2 | -| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:14:12:17 | this access | diff --git a/csharp/ql/test/library-tests/assignments/AssignOperationExpanded.ql b/csharp/ql/test/library-tests/assignments/AssignOperationExpanded.ql deleted file mode 100644 index bd67776520fb..000000000000 --- a/csharp/ql/test/library-tests/assignments/AssignOperationExpanded.ql +++ /dev/null @@ -1,22 +0,0 @@ -import csharp - -predicate getExpandedOperatorArgs(Expr e, Expr left, Expr right) { - e = - any(BinaryArithmeticOperation bo | - bo.getLeftOperand() = left and - bo.getRightOperand() = right - ) - or - e = - any(OperatorCall oc | - oc.getArgument(0) = left and - oc.getArgument(1) = right - ) -} - -from AssignOperation ao, AssignExpr ae, Expr op, Expr left, Expr right -where - ae = ao.getExpandedAssignment() and - op = ae.getRValue() and - getExpandedOperatorArgs(op, left, right) -select ao, ae, ae.getLValue(), op, left, right diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected index 30f2b1051551..9802f2b01955 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected @@ -7,11 +7,11 @@ | AccessorCalls.cs:19:10:19:11 | enter M2 | AccessorCalls.cs:19:10:19:11 | exit M2 | 42 | | AccessorCalls.cs:28:10:28:11 | enter M3 | AccessorCalls.cs:28:10:28:11 | exit M3 | 17 | | AccessorCalls.cs:35:10:35:11 | enter M4 | AccessorCalls.cs:35:10:35:11 | exit M4 | 20 | -| AccessorCalls.cs:42:10:42:11 | enter M5 | AccessorCalls.cs:42:10:42:11 | exit M5 | 34 | -| AccessorCalls.cs:49:10:49:11 | enter M6 | AccessorCalls.cs:49:10:49:11 | exit M6 | 43 | +| AccessorCalls.cs:42:10:42:11 | enter M5 | AccessorCalls.cs:42:10:42:11 | exit M5 | 24 | +| AccessorCalls.cs:49:10:49:11 | enter M6 | AccessorCalls.cs:49:10:49:11 | exit M6 | 30 | | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:56:10:56:11 | exit M7 | 25 | | AccessorCalls.cs:61:10:61:11 | enter M8 | AccessorCalls.cs:61:10:61:11 | exit M8 | 31 | -| AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | exit M9 | 58 | +| AccessorCalls.cs:66:10:66:11 | enter M9 | AccessorCalls.cs:66:10:66:11 | exit M9 | 51 | | ArrayCreation.cs:1:7:1:19 | enter ArrayCreation | ArrayCreation.cs:1:7:1:19 | exit ArrayCreation | 7 | | ArrayCreation.cs:3:11:3:12 | enter M1 | ArrayCreation.cs:3:11:3:12 | exit M1 | 5 | | ArrayCreation.cs:5:12:5:13 | enter M2 | ArrayCreation.cs:5:12:5:13 | exit M2 | 6 | @@ -164,7 +164,7 @@ | Assert.cs:138:10:138:12 | exit M13 (abnormal) | Assert.cs:138:10:138:12 | exit M13 (abnormal) | 1 | | Assert.cs:141:9:141:15 | return ...; | Assert.cs:138:10:138:12 | exit M13 (normal) | 2 | | Assignments.cs:1:7:1:17 | enter Assignments | Assignments.cs:1:7:1:17 | exit Assignments | 7 | -| Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | exit M | 34 | +| Assignments.cs:3:10:3:10 | enter M | Assignments.cs:3:10:3:10 | exit M | 31 | | Assignments.cs:14:18:14:35 | enter (...) => ... | Assignments.cs:14:18:14:35 | exit (...) => ... | 4 | | Assignments.cs:17:40:17:40 | enter + | Assignments.cs:17:40:17:40 | exit + | 6 | | Assignments.cs:27:10:27:23 | enter SetParamSingle | Assignments.cs:27:10:27:23 | exit SetParamSingle | 7 | @@ -250,7 +250,6 @@ | ConditionalAccess.cs:42:9:42:11 | enter get_Item | ConditionalAccess.cs:42:9:42:11 | exit get_Item | 6 | | ConditionalAccess.cs:43:9:43:11 | enter set_Item | ConditionalAccess.cs:43:9:43:11 | exit set_Item | 4 | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | 4 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:46:10:46:11 | exit M9 | 2 | | ConditionalAccess.cs:48:24:48:25 | 42 | ConditionalAccess.cs:48:12:48:25 | ... = ... | 3 | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:49:9:49:10 | access to parameter ca | 2 | | ConditionalAccess.cs:49:26:49:32 | "Hello" | ConditionalAccess.cs:49:12:49:32 | ... = ... | 3 | @@ -262,14 +261,11 @@ | ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:52:9:52:16 | access to property Prop | 1 | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | 2 | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:18:52:38 | ... = ... | 3 | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | 1 | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:20 | access to field IntField | 1 | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | 2 | -| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:12:53:25 | ... = ... | 4 | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | 1 | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | 4 | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | 1 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | 2 | -| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:12:54:29 | ... = ... | 4 | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:46:10:46:11 | exit M9 | 4 | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith | 8 | | Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | exit Conditions | 7 | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:5:13:5:15 | access to parameter inc | 4 | @@ -331,12 +327,12 @@ | Conditions.cs:97:17:97:20 | ...; | Conditions.cs:97:17:97:19 | ...++ | 3 | | Conditions.cs:99:16:99:16 | access to local variable x | Conditions.cs:86:9:86:10 | exit M7 | 4 | | Conditions.cs:102:12:102:13 | enter M8 | Conditions.cs:105:13:105:13 | access to parameter b | 8 | -| Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:19 | ... = ... | 5 | +| Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:19 | ... += ... | 4 | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:107:13:107:24 | ... > ... | 5 | | Conditions.cs:108:13:109:24 | if (...) ... | Conditions.cs:108:18:108:18 | access to parameter b | 2 | | Conditions.cs:108:17:108:18 | [false] !... | Conditions.cs:108:17:108:18 | [false] !... | 1 | | Conditions.cs:108:17:108:18 | [true] !... | Conditions.cs:108:17:108:18 | [true] !... | 1 | -| Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:23 | ... = ... | 5 | +| Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:23 | ... += ... | 4 | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:102:12:102:13 | exit M8 | 4 | | Conditions.cs:113:10:113:11 | enter M9 | Conditions.cs:116:18:116:22 | Int32 i = ... | 8 | | Conditions.cs:113:10:113:11 | exit M9 (normal) | Conditions.cs:113:10:113:11 | exit M9 | 2 | @@ -533,7 +529,7 @@ | Finally.cs:254:13:254:45 | ...; | Finally.cs:254:13:254:44 | call to method WriteLine | 3 | | Finally.cs:257:9:259:9 | {...} | Finally.cs:258:13:258:46 | call to method WriteLine | 4 | | Finally.cs:260:9:260:34 | ...; | Finally.cs:233:10:233:12 | exit M12 (normal) | 4 | -| Finally.cs:263:10:263:12 | enter M13 | Finally.cs:272:13:272:18 | ... = ... | 16 | +| Finally.cs:263:10:263:12 | enter M13 | Finally.cs:272:13:272:18 | ... += ... | 15 | | Finally.cs:263:10:263:12 | exit M13 | Finally.cs:263:10:263:12 | exit M13 | 1 | | Finally.cs:263:10:263:12 | exit M13 (abnormal) | Finally.cs:263:10:263:12 | exit M13 (abnormal) | 1 | | Finally.cs:263:10:263:12 | exit M13 (normal) | Finally.cs:263:10:263:12 | exit M13 (normal) | 1 | @@ -1130,7 +1126,7 @@ | cflow.cs:201:9:205:9 | {...} | cflow.cs:193:10:193:17 | exit Booleans (abnormal) | 5 | | cflow.cs:208:10:208:11 | enter Do | cflow.cs:210:9:221:36 | do ... while (...); | 3 | | cflow.cs:208:10:208:11 | exit Do (normal) | cflow.cs:208:10:208:11 | exit Do | 2 | -| cflow.cs:211:9:221:9 | {...} | cflow.cs:213:17:213:32 | ... > ... | 15 | +| cflow.cs:211:9:221:9 | {...} | cflow.cs:213:17:213:32 | ... > ... | 12 | | cflow.cs:214:13:216:13 | {...} | cflow.cs:215:17:215:25 | continue; | 2 | | cflow.cs:217:13:220:13 | if (...) ... | cflow.cs:217:17:217:32 | ... < ... | 6 | | cflow.cs:218:13:220:13 | {...} | cflow.cs:219:17:219:22 | break; | 2 | @@ -1138,7 +1134,7 @@ | cflow.cs:224:10:224:16 | enter Foreach | cflow.cs:226:27:226:64 | call to method Repeat | 5 | | cflow.cs:224:10:224:16 | exit Foreach (normal) | cflow.cs:224:10:224:16 | exit Foreach | 2 | | cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | cflow.cs:226:9:237:9 | foreach (... ... in ...) ... | 1 | -| cflow.cs:226:22:226:22 | String x | cflow.cs:229:17:229:32 | ... > ... | 16 | +| cflow.cs:226:22:226:22 | String x | cflow.cs:229:17:229:32 | ... > ... | 13 | | cflow.cs:230:13:232:13 | {...} | cflow.cs:231:17:231:25 | continue; | 2 | | cflow.cs:233:13:236:13 | if (...) ... | cflow.cs:233:17:233:32 | ... < ... | 6 | | cflow.cs:234:13:236:13 | {...} | cflow.cs:235:17:235:22 | break; | 2 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Condition.expected b/csharp/ql/test/library-tests/controlflow/graph/Condition.expected index 3ef1d481abe8..cda25b6abd12 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Condition.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Condition.expected @@ -100,14 +100,8 @@ conditionBlock | ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:52:32:52:38 | "World" | false | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | false | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | false | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:20 | access to field IntField | false | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | false | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | false | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | false | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | false | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | false | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | false | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | false | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | false | | Conditions.cs:3:10:3:19 | enter IncrOrDecr | Conditions.cs:6:13:6:16 | ...; | true | | Conditions.cs:7:9:8:16 | if (...) ... | Conditions.cs:7:13:7:16 | [false] !... | true | | Conditions.cs:7:9:8:16 | if (...) ... | Conditions.cs:7:13:7:16 | [true] !... | false | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected index 204092c6df23..072d874d8d4f 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected @@ -129,77 +129,54 @@ dominance | AccessorCalls.cs:42:10:42:11 | enter M5 | AccessorCalls.cs:43:5:47:5 | {...} | | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | AccessorCalls.cs:42:10:42:11 | exit M5 | | AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:44:9:44:33 | ...; | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | | AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:18 | access to field Field | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... = ... | | AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:23:44:26 | this access | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:44:9:44:18 | access to field Field | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:45:9:45:31 | ...; | +| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:45:9:45:31 | ...; | | AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:44:9:44:12 | this access | | AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:44:23:44:32 | access to field Field | -| AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... + ... | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | +| AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... += ... | | AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:17 | access to property Prop | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... = ... | | AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:22:45:25 | this access | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:45:9:45:17 | access to property Prop | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:46:9:46:27 | ...; | +| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:46:9:46:27 | ...; | | AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:45:9:45:12 | this access | | AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:45:22:45:30 | access to property Prop | -| AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... + ... | +| AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... += ... | | AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:14:46:14 | 0 | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:14:46:14 | 0 | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... = ... | | AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:20:46:23 | this access | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:46:9:46:15 | access to indexer | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | +| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | | AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:46:9:46:12 | this access | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:12 | this access | | AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:15 | access to indexer | | AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:46:25:46:25 | 0 | -| AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... + ... | +| AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... += ... | | AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:46:20:46:26 | access to indexer | | AccessorCalls.cs:49:10:49:11 | enter M6 | AccessorCalls.cs:50:5:54:5 | {...} | | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | AccessorCalls.cs:49:10:49:11 | exit M6 | | AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:51:9:51:37 | ...; | | AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:14 | access to field x | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:14 | access to field x | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:20 | access to field Field | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... = ... | | AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:25:51:28 | this access | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:51:9:51:20 | access to field Field | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:52:9:52:35 | ...; | +| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:52:9:52:35 | ...; | | AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:51:25:51:30 | access to field x | | AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:51:25:51:36 | access to field Field | -| AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... + ... | +| AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... += ... | | AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:14 | access to field x | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:14 | access to field x | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:19 | access to property Prop | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... = ... | | AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:24:52:27 | this access | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:52:9:52:19 | access to property Prop | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:53:9:53:31 | ...; | +| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:53:9:53:31 | ...; | | AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:52:24:52:29 | access to field x | | AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:52:24:52:34 | access to property Prop | -| AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... + ... | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:14 | access to field x | +| AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... += ... | | AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:14 | access to field x | | AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:16:53:16 | 0 | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:16:53:16 | 0 | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... = ... | | AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:22:53:25 | this access | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:53:9:53:17 | access to indexer | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | +| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | | AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:12 | this access | | AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:17 | access to indexer | | AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:53:22:53:27 | access to field x | | AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:53:29:53:29 | 0 | -| AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... + ... | +| AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... += ... | | AccessorCalls.cs:53:29:53:29 | 0 | AccessorCalls.cs:53:22:53:30 | access to indexer | | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:57:5:59:5 | {...} | | AccessorCalls.cs:56:10:56:11 | exit M7 (normal) | AccessorCalls.cs:56:10:56:11 | exit M7 | @@ -271,25 +248,18 @@ dominance | AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:71:9:71:26 | ...; | | AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:70:9:70:9 | access to local variable d | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | | AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:25 | ... = ... | | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:25:71:25 | access to parameter e | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:72:9:72:21 | ...; | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | +| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:72:9:72:21 | ...; | | AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:71:9:71:9 | access to local variable d | -| AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:11:72:11 | 0 | +| AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:9:71:25 | ... += ... | | AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:11:72:11 | 0 | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | ... = ... | | AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:17:72:17 | access to local variable d | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:73:9:73:84 | ...; | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:72:9:72:12 | dynamic access to element | +| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:73:9:73:84 | ...; | | AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:72:9:72:9 | access to local variable d | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:9 | access to local variable d | | AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:12 | dynamic access to element | | AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:72:19:72:19 | 1 | -| AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | +| AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | ... += ... | | AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:72:17:72:20 | dynamic access to element | | AccessorCalls.cs:73:9:73:44 | (..., ...) | AccessorCalls.cs:73:49:73:49 | access to local variable d | | AccessorCalls.cs:73:9:73:83 | ... = ... | AccessorCalls.cs:66:10:66:11 | exit M9 (normal) | @@ -732,27 +702,24 @@ dominance | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:6:9:6:15 | ...; | | Assignments.cs:5:17:5:17 | 0 | Assignments.cs:5:13:5:17 | Int32 x = ... | | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:14:6:14 | 1 | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:9:6:14 | ... = ... | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:8:9:8:22 | ... ...; | +| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:8:9:8:22 | ... ...; | | Assignments.cs:6:9:6:15 | ...; | Assignments.cs:6:9:6:9 | access to local variable x | -| Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:9:6:14 | ... + ... | +| Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:9:6:14 | ... += ... | | Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:8:21:8:21 | 0 | | Assignments.cs:8:17:8:21 | dynamic d = ... | Assignments.cs:9:9:9:15 | ...; | | Assignments.cs:8:21:8:21 | 0 | Assignments.cs:8:21:8:21 | (...) ... | | Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:8:17:8:21 | dynamic d = ... | | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:14:9:14 | 2 | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:11:9:11:34 | ... ...; | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:9:9:14 | ... = ... | +| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:11:9:11:34 | ... ...; | | Assignments.cs:9:9:9:15 | ...; | Assignments.cs:9:9:9:9 | access to local variable d | -| Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:9:9:14 | dynamic call to operator - | +| Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:9:9:14 | ... -= ... | | Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:11:17:11:33 | object creation of type Assignments | | Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:12:9:12:18 | ...; | | Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:11:13:11:33 | Assignments a = ... | | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:14:12:17 | this access | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:14:9:14:36 | ...; | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:9:12:17 | ... = ... | +| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:14:9:14:36 | ...; | | Assignments.cs:12:9:12:18 | ...; | Assignments.cs:12:9:12:9 | access to local variable a | -| Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:9:12:17 | call to operator + | +| Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:9:12:17 | ... += ... | | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:9:14:35 | ... += ... | | Assignments.cs:14:9:14:13 | this access | Assignments.cs:14:18:14:35 | (...) => ... | | Assignments.cs:14:9:14:35 | ... += ... | Assignments.cs:3:10:3:10 | exit M (normal) | @@ -1058,22 +1025,16 @@ dominance | ConditionalAccess.cs:52:9:52:28 | access to property StringProp | ConditionalAccess.cs:52:18:52:38 | ... = ... | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:9:52:28 | access to property StringProp | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:30 | ...; | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:12:53:25 | ... = ... | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:53:9:53:20 | access to field IntField | -| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:12:53:25 | ... - ... | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | +| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:54:9:54:30 | ...; | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:12:53:25 | ... -= ... | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:27:54:29 | "!" | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:12:54:29 | ... = ... | | ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:12:54:29 | ... + ... | +| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:12:54:29 | ... += ... | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith (normal) | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith | | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | ConditionalAccess.cs:60:75:60:78 | ", " | @@ -1295,9 +1256,8 @@ dominance | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:106:13:106:20 | ...; | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:107:9:109:24 | if (...) ... | | Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:106:18:106:19 | "" | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:106:13:106:19 | ... = ... | | Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:13 | access to local variable x | -| Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:13:106:19 | ... + ... | +| Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:13:106:19 | ... += ... | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:107:13:107:13 | access to local variable x | | Conditions.cs:107:13:107:13 | access to local variable x | Conditions.cs:107:13:107:20 | access to property Length | | Conditions.cs:107:13:107:20 | access to property Length | Conditions.cs:107:24:107:24 | 0 | @@ -1309,9 +1269,8 @@ dominance | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:17:108:18 | [false] !... | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:17:108:18 | [true] !... | | Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:109:22:109:23 | "" | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:109:17:109:23 | ... = ... | | Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:17 | access to local variable x | -| Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:23 | ... + ... | +| Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:23 | ... += ... | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:102:12:102:13 | exit M8 (normal) | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:9:110:17 | return ...; | | Conditions.cs:113:10:113:11 | enter M9 | Conditions.cs:114:5:124:5 | {...} | @@ -1939,11 +1898,10 @@ dominance | Finally.cs:271:13:271:35 | ...; | Finally.cs:271:31:271:33 | "3" | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:34 | call to method WriteLine | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:18:272:18 | 3 | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:18 | ... = ... | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (normal) | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:263:10:263:12 | exit M13 (normal) | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:13 | access to parameter i | -| Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... + ... | +| Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... += ... | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | {...} | | Foreach.cs:4:7:4:13 | call to method | Foreach.cs:4:7:4:13 | call to constructor Object | | Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | this access | @@ -3819,14 +3777,11 @@ dominance | cflow.cs:209:5:222:5 | {...} | cflow.cs:210:9:221:36 | do ... while (...); | | cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:211:9:221:9 | {...} | | cflow.cs:211:9:221:9 | {...} | cflow.cs:212:13:212:25 | ...; | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:24 | ... = ... | | cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:22:212:24 | "a" | | cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | access to field Field | -| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:212:13:212:17 | access to field Field | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:213:13:216:13 | if (...) ... | +| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:213:13:216:13 | if (...) ... | | cflow.cs:212:13:212:25 | ...; | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:22:212:24 | "a" | cflow.cs:212:13:212:24 | ... + ... | +| cflow.cs:212:22:212:24 | "a" | cflow.cs:212:13:212:24 | ... += ... | | cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:213:17:213:21 | this access | | cflow.cs:213:17:213:21 | access to field Field | cflow.cs:213:17:213:28 | access to property Length | | cflow.cs:213:17:213:21 | this access | cflow.cs:213:17:213:21 | access to field Field | @@ -3856,14 +3811,11 @@ dominance | cflow.cs:226:57:226:59 | "a" | cflow.cs:226:62:226:63 | 10 | | cflow.cs:226:62:226:63 | 10 | cflow.cs:226:27:226:64 | call to method Repeat | | cflow.cs:227:9:237:9 | {...} | cflow.cs:228:13:228:23 | ...; | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:22 | ... = ... | | cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:22:228:22 | access to local variable x | | cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | access to field Field | -| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:228:13:228:17 | access to field Field | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:229:13:232:13 | if (...) ... | +| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:229:13:232:13 | if (...) ... | | cflow.cs:228:13:228:23 | ...; | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:13:228:22 | ... + ... | +| cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:13:228:22 | ... += ... | | cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:229:17:229:21 | this access | | cflow.cs:229:17:229:21 | access to field Field | cflow.cs:229:17:229:28 | access to property Length | | cflow.cs:229:17:229:21 | this access | cflow.cs:229:17:229:21 | access to field Field | @@ -4138,75 +4090,52 @@ postDominance | AccessorCalls.cs:39:9:39:20 | ...; | AccessorCalls.cs:38:9:38:21 | ...++ | | AccessorCalls.cs:39:16:39:16 | 0 | AccessorCalls.cs:39:9:39:14 | access to field x | | AccessorCalls.cs:42:10:42:11 | exit M5 | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | -| AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | AccessorCalls.cs:46:9:46:26 | ... = ... | +| AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | AccessorCalls.cs:46:9:46:26 | ... += ... | | AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:42:10:42:11 | enter M5 | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | | AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:33 | ...; | | AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:12 | this access | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... + ... | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:44:23:44:32 | access to field Field | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:44:9:44:18 | access to field Field | +| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:44:23:44:32 | access to field Field | | AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:43:5:47:5 | {...} | | AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:44:9:44:18 | access to field Field | | AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:23:44:26 | this access | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | | AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:31 | ...; | | AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:12 | this access | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... + ... | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:45:22:45:30 | access to property Prop | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:45:9:45:17 | access to property Prop | -| AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:44:9:44:32 | ... = ... | +| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:45:22:45:30 | access to property Prop | +| AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:44:9:44:32 | ... += ... | | AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:45:9:45:17 | access to property Prop | | AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:22:45:25 | this access | | AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:9:46:27 | ...; | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:14:46:14 | 0 | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... + ... | | AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:14:46:14 | 0 | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:46:20:46:26 | access to indexer | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:46:9:46:15 | access to indexer | -| AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:45:9:45:30 | ... = ... | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:12 | this access | +| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:46:20:46:26 | access to indexer | +| AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:45:9:45:30 | ... += ... | | AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:12 | this access | | AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:46:9:46:15 | access to indexer | | AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:25:46:25 | 0 | | AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:46:20:46:23 | this access | | AccessorCalls.cs:49:10:49:11 | exit M6 | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | -| AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | AccessorCalls.cs:53:9:53:30 | ... = ... | +| AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | AccessorCalls.cs:53:9:53:30 | ... += ... | | AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:49:10:49:11 | enter M6 | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:14 | access to field x | | AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:37 | ...; | | AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:14 | access to field x | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... + ... | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:51:25:51:36 | access to field Field | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:51:9:51:20 | access to field Field | +| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:51:25:51:36 | access to field Field | | AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:50:5:54:5 | {...} | | AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:51:9:51:20 | access to field Field | | AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:51:25:51:28 | this access | | AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:25:51:30 | access to field x | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:14 | access to field x | | AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:35 | ...; | | AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:14 | access to field x | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... + ... | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:52:24:52:34 | access to property Prop | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:52:9:52:19 | access to property Prop | -| AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:51:9:51:36 | ... = ... | +| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:52:24:52:34 | access to property Prop | +| AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:51:9:51:36 | ... += ... | | AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:52:9:52:19 | access to property Prop | | AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:52:24:52:27 | this access | | AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:24:52:29 | access to field x | | AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:31 | ...; | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:16:53:16 | 0 | | AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... + ... | | AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:16:53:16 | 0 | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:53:22:53:30 | access to indexer | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:53:9:53:17 | access to indexer | -| AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:52:9:52:34 | ... = ... | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:14 | access to field x | +| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:53:22:53:30 | access to indexer | +| AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:52:9:52:34 | ... += ... | | AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:14 | access to field x | | AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:53:9:53:17 | access to indexer | | AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:53:22:53:25 | this access | @@ -4282,29 +4211,22 @@ postDominance | AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | AccessorCalls.cs:70:9:70:9 | access to local variable d | | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | | AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:69:9:69:35 | ... = ... | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | | AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:26 | ...; | | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:9 | access to local variable d | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:71:25:71:25 | access to parameter e | +| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:71:25:71:25 | access to parameter e | | AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | | AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | | AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:9:72:21 | ...; | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:11:72:11 | 0 | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | | AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:11:72:11 | 0 | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:72:9:72:12 | dynamic access to element | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:72:17:72:20 | dynamic access to element | -| AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:71:9:71:25 | ... = ... | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:9 | access to local variable d | +| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:72:17:72:20 | dynamic access to element | +| AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:71:9:71:25 | ... += ... | | AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:9 | access to local variable d | | AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:72:9:72:12 | dynamic access to element | | AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:19:72:19 | 1 | | AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:72:17:72:17 | access to local variable d | | AccessorCalls.cs:73:9:73:44 | (..., ...) | AccessorCalls.cs:73:35:73:43 | (..., ...) | | AccessorCalls.cs:73:9:73:83 | ... = ... | AccessorCalls.cs:73:39:73:42 | dynamic access to element | -| AccessorCalls.cs:73:9:73:84 | ...; | AccessorCalls.cs:72:9:72:20 | ... = ... | +| AccessorCalls.cs:73:9:73:84 | ...; | AccessorCalls.cs:72:9:72:20 | ... += ... | | AccessorCalls.cs:73:10:73:10 | access to local variable d | AccessorCalls.cs:73:9:73:84 | ...; | | AccessorCalls.cs:73:10:73:21 | dynamic access to member MaybeProp1 | AccessorCalls.cs:73:48:73:83 | (..., ...) | | AccessorCalls.cs:73:24:73:27 | this access | AccessorCalls.cs:73:10:73:10 | access to local variable d | @@ -4730,31 +4652,28 @@ postDominance | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:5:17:5:17 | 0 | | Assignments.cs:5:17:5:17 | 0 | Assignments.cs:5:9:5:18 | ... ...; | | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:9:6:15 | ...; | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:14:6:14 | 1 | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:6:9:6:14 | ... + ... | +| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:6:14:6:14 | 1 | | Assignments.cs:6:9:6:15 | ...; | Assignments.cs:5:13:5:17 | Int32 x = ... | | Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:9:6:9 | access to local variable x | -| Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:6:9:6:14 | ... = ... | +| Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:6:9:6:14 | ... += ... | | Assignments.cs:8:17:8:21 | dynamic d = ... | Assignments.cs:8:21:8:21 | (...) ... | | Assignments.cs:8:21:8:21 | 0 | Assignments.cs:8:9:8:22 | ... ...; | | Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:8:21:8:21 | 0 | | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:9:9:15 | ...; | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:9:9:9:14 | dynamic call to operator - | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:14:9:14 | 2 | +| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:9:14:9:14 | 2 | | Assignments.cs:9:9:9:15 | ...; | Assignments.cs:8:17:8:21 | dynamic d = ... | | Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:9:9:9 | access to local variable d | -| Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:9:9:9:14 | ... = ... | +| Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:9:9:9:14 | ... -= ... | | Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:11:17:11:33 | object creation of type Assignments | | Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:11:9:11:34 | ... ...; | | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:9:12:18 | ...; | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:12:9:12:17 | call to operator + | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:14:12:17 | this access | +| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:12:14:12:17 | this access | | Assignments.cs:12:9:12:18 | ...; | Assignments.cs:11:13:11:33 | Assignments a = ... | | Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:9:12:9 | access to local variable a | | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:18:14:35 | (...) => ... | | Assignments.cs:14:9:14:13 | this access | Assignments.cs:14:9:14:36 | ...; | | Assignments.cs:14:9:14:35 | ... += ... | Assignments.cs:14:9:14:13 | access to event Event | -| Assignments.cs:14:9:14:36 | ...; | Assignments.cs:12:9:12:17 | ... = ... | +| Assignments.cs:14:9:14:36 | ...; | Assignments.cs:12:9:12:17 | ... += ... | | Assignments.cs:14:18:14:35 | (...) => ... | Assignments.cs:14:9:14:13 | this access | | Assignments.cs:14:18:14:35 | exit (...) => ... | Assignments.cs:14:18:14:35 | exit (...) => ... (normal) | | Assignments.cs:14:18:14:35 | exit (...) => ... (normal) | Assignments.cs:14:33:14:35 | {...} | @@ -5022,8 +4941,7 @@ postDominance | ConditionalAccess.cs:43:9:43:11 | exit set_Item (normal) | ConditionalAccess.cs:43:13:43:15 | {...} | | ConditionalAccess.cs:43:13:43:15 | {...} | ConditionalAccess.cs:43:9:43:11 | enter set_Item | | ConditionalAccess.cs:46:10:46:11 | exit M9 | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:12:54:29 | ... = ... | +| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:12:54:29 | ... += ... | | ConditionalAccess.cs:47:5:55:5 | {...} | ConditionalAccess.cs:46:10:46:11 | enter M9 | | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | ConditionalAccess.cs:48:9:48:26 | ...; | | ConditionalAccess.cs:48:9:48:20 | access to field IntField | ConditionalAccess.cs:48:24:48:25 | 42 | @@ -5052,20 +4970,15 @@ postDominance | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:51:18:51:31 | ... = ... | | ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:52:9:52:28 | access to property StringProp | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:26 | ...; | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:12:53:25 | ... - ... | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:52:18:52:38 | ... = ... | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:53:9:53:20 | access to field IntField | +| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:53:25:53:25 | 1 | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:30 | ...; | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:12:54:29 | ... + ... | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:12:53:25 | ... = ... | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:54:27:54:29 | "!" | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | +| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:12:53:25 | ... -= ... | +| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith (normal) | @@ -5287,25 +5200,23 @@ postDominance | Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:104:13:104:28 | String x = ... | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:105:9:106:20 | if (...) ... | | Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:106:13:106:20 | ...; | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:106:18:106:19 | "" | -| Conditions.cs:106:13:106:19 | ... = ... | Conditions.cs:106:13:106:19 | ... + ... | +| Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:106:18:106:19 | "" | | Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:13:106:13 | access to local variable x | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:105:13:105:13 | access to parameter b | -| Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:106:13:106:19 | ... = ... | +| Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:106:13:106:19 | ... += ... | | Conditions.cs:107:13:107:13 | access to local variable x | Conditions.cs:107:9:109:24 | if (...) ... | | Conditions.cs:107:13:107:20 | access to property Length | Conditions.cs:107:13:107:13 | access to local variable x | | Conditions.cs:107:13:107:24 | ... > ... | Conditions.cs:107:24:107:24 | 0 | | Conditions.cs:107:24:107:24 | 0 | Conditions.cs:107:13:107:20 | access to property Length | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:13:109:24 | if (...) ... | | Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:109:17:109:24 | ...; | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:109:22:109:23 | "" | -| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:109:17:109:23 | ... + ... | +| Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:109:22:109:23 | "" | | Conditions.cs:109:17:109:24 | ...; | Conditions.cs:108:17:108:18 | [true] !... | | Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:17 | access to local variable x | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:110:16:110:16 | access to local variable x | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:107:13:107:24 | ... > ... | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:108:17:108:18 | [false] !... | -| Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:109:17:109:23 | ... = ... | +| Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:109:17:109:23 | ... += ... | | Conditions.cs:113:10:113:11 | exit M9 | Conditions.cs:113:10:113:11 | exit M9 (normal) | | Conditions.cs:113:10:113:11 | exit M9 (normal) | Conditions.cs:116:25:116:39 | ... < ... | | Conditions.cs:114:5:124:5 | {...} | Conditions.cs:113:10:113:11 | enter M9 | @@ -5890,7 +5801,7 @@ postDominance | Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:260:27:260:32 | "Done" | | Finally.cs:260:9:260:34 | ...; | Finally.cs:258:13:258:46 | call to method WriteLine | | Finally.cs:260:27:260:32 | "Done" | Finally.cs:260:9:260:34 | ...; | -| Finally.cs:263:10:263:12 | exit M13 (normal) | Finally.cs:272:13:272:18 | ... = ... | +| Finally.cs:263:10:263:12 | exit M13 (normal) | Finally.cs:272:13:272:18 | ... += ... | | Finally.cs:264:5:274:5 | {...} | Finally.cs:263:10:263:12 | enter M13 | | Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:264:5:274:5 | {...} | | Finally.cs:266:9:268:9 | {...} | Finally.cs:265:9:273:9 | try {...} ... | @@ -5902,8 +5813,7 @@ postDominance | Finally.cs:271:13:271:35 | ...; | Finally.cs:270:9:273:9 | {...} | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:35 | ...; | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:13:272:19 | ...; | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:18:272:18 | 3 | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:272:13:272:18 | ... + ... | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:272:18:272:18 | 3 | | Finally.cs:272:13:272:19 | ...; | Finally.cs:271:13:271:34 | call to method WriteLine | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:13 | access to parameter i | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | call to method | @@ -7720,14 +7630,11 @@ postDominance | cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:209:5:222:5 | {...} | | cflow.cs:211:9:221:9 | {...} | cflow.cs:210:9:221:36 | do ... while (...); | | cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:24 | ... + ... | -| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | | cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:25 | ...; | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:212:22:212:24 | "a" | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:212:13:212:17 | access to field Field | +| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:212:22:212:24 | "a" | | cflow.cs:212:13:212:25 | ...; | cflow.cs:211:9:221:9 | {...} | | cflow.cs:212:22:212:24 | "a" | cflow.cs:212:13:212:17 | access to field Field | -| cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:212:13:212:24 | ... = ... | +| cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:212:13:212:24 | ... += ... | | cflow.cs:213:17:213:21 | access to field Field | cflow.cs:213:17:213:21 | this access | | cflow.cs:213:17:213:21 | this access | cflow.cs:213:13:216:13 | if (...) ... | | cflow.cs:213:17:213:28 | access to property Length | cflow.cs:213:17:213:21 | access to field Field | @@ -7756,14 +7663,11 @@ postDominance | cflow.cs:226:62:226:63 | 10 | cflow.cs:226:57:226:59 | "a" | | cflow.cs:227:9:237:9 | {...} | cflow.cs:226:22:226:22 | String x | | cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:22 | ... + ... | -| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | | cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:23 | ...; | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:228:22:228:22 | access to local variable x | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:228:13:228:17 | access to field Field | +| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:228:22:228:22 | access to local variable x | | cflow.cs:228:13:228:23 | ...; | cflow.cs:227:9:237:9 | {...} | | cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:13:228:17 | access to field Field | -| cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:228:13:228:22 | ... = ... | +| cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:228:13:228:22 | ... += ... | | cflow.cs:229:17:229:21 | access to field Field | cflow.cs:229:17:229:21 | this access | | cflow.cs:229:17:229:21 | this access | cflow.cs:229:13:232:13 | if (...) ... | | cflow.cs:229:17:229:28 | access to property Length | cflow.cs:229:17:229:21 | access to field Field | @@ -9077,7 +8981,6 @@ blockDominance | ConditionalAccess.cs:42:9:42:11 | enter get_Item | ConditionalAccess.cs:42:9:42:11 | enter get_Item | | ConditionalAccess.cs:43:9:43:11 | enter set_Item | ConditionalAccess.cs:43:9:43:11 | enter set_Item | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:46:10:46:11 | enter M9 | -| ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:48:24:48:25 | 42 | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:49:9:49:33 | ...; | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:49:26:49:32 | "Hello" | @@ -9089,17 +8992,12 @@ blockDominance | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:54:9:54:30 | ...; | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:54:27:54:29 | "!" | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | ConditionalAccess.cs:48:24:48:25 | 42 | ConditionalAccess.cs:48:24:48:25 | 42 | -| ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:49:9:49:33 | ...; | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:49:26:49:32 | "Hello" | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:50:9:50:24 | ...; | @@ -9110,16 +9008,12 @@ blockDominance | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:49:26:49:32 | "Hello" | ConditionalAccess.cs:49:26:49:32 | "Hello" | -| ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:50:9:50:24 | ...; | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:50:13:50:13 | 0 | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:51:9:51:16 | access to property Prop | @@ -9128,71 +9022,47 @@ blockDominance | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | | ConditionalAccess.cs:50:9:50:24 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:50:13:50:13 | 0 | ConditionalAccess.cs:50:13:50:13 | 0 | | ConditionalAccess.cs:51:9:51:16 | access to property Prop | ConditionalAccess.cs:51:9:51:16 | access to property Prop | | ConditionalAccess.cs:51:9:51:16 | access to property Prop | ConditionalAccess.cs:51:30:51:31 | 84 | -| ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:51:9:51:16 | access to property Prop | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:51:9:51:32 | ...; | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:51:30:51:31 | 84 | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | | ConditionalAccess.cs:51:9:51:32 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:51:30:51:31 | 84 | ConditionalAccess.cs:51:30:51:31 | 84 | | ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:20 | access to field IntField | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:25:53:25 | 1 | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:20 | access to field IntField | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:27:54:29 | "!" | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | | Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | enter Conditions | @@ -13005,27 +12875,6 @@ postBlockDominance | ConditionalAccess.cs:42:9:42:11 | enter get_Item | ConditionalAccess.cs:42:9:42:11 | enter get_Item | | ConditionalAccess.cs:43:9:43:11 | enter set_Item | ConditionalAccess.cs:43:9:43:11 | enter set_Item | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:46:10:46:11 | enter M9 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:46:10:46:11 | enter M9 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:48:24:48:25 | 42 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:49:9:49:33 | ...; | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:49:26:49:32 | "Hello" | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:50:9:50:24 | ...; | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:50:13:50:13 | 0 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:51:9:51:16 | access to property Prop | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:51:9:51:32 | ...; | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:51:30:51:31 | 84 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:52:9:52:16 | access to property Prop | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:52:9:52:39 | ...; | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:53:9:53:20 | access to field IntField | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:53:9:53:26 | ...; | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:9:54:30 | ...; | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:48:24:48:25 | 42 | ConditionalAccess.cs:48:24:48:25 | 42 | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:46:10:46:11 | enter M9 | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:48:24:48:25 | 42 | @@ -13058,7 +12907,6 @@ postBlockDominance | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:51:30:51:31 | 84 | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:46:10:46:11 | enter M9 | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:48:24:48:25 | 42 | @@ -13073,29 +12921,37 @@ postBlockDominance | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | -| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:46:10:46:11 | enter M9 | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:48:24:48:25 | 42 | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:49:9:49:33 | ...; | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:49:26:49:32 | "Hello" | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:50:9:50:24 | ...; | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:50:13:50:13 | 0 | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:51:9:51:16 | access to property Prop | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:51:9:51:32 | ...; | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:51:30:51:31 | 84 | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:52:9:52:16 | access to property Prop | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:52:9:52:39 | ...; | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:52:32:52:38 | "World" | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:9:53:20 | access to field IntField | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:9:53:26 | ...; | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:46:10:46:11 | enter M9 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:48:24:48:25 | 42 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:49:9:49:33 | ...; | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:49:26:49:32 | "Hello" | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:50:9:50:24 | ...; | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:50:13:50:13 | 0 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:51:9:51:16 | access to property Prop | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:51:9:51:32 | ...; | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:51:30:51:31 | 84 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:52:9:52:16 | access to property Prop | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:52:9:52:39 | ...; | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:52:32:52:38 | "World" | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:9:53:20 | access to field IntField | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:53:25:53:25 | 1 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | -| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:46:10:46:11 | enter M9 | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:48:24:48:25 | 42 | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:49:9:49:33 | ...; | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:49:26:49:32 | "Hello" | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:50:9:50:24 | ...; | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:50:13:50:13 | 0 | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:51:9:51:16 | access to property Prop | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:51:9:51:32 | ...; | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:51:30:51:31 | 84 | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:52:9:52:16 | access to property Prop | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:52:9:52:39 | ...; | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:52:32:52:38 | "World" | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:53:9:53:20 | access to field IntField | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:53:9:53:26 | ...; | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:53:25:53:25 | 1 | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected index 8f48cd46fc3b..99f8c25b49e2 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected @@ -140,32 +140,22 @@ nodeEnclosing | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:42:10:42:11 | M5 | +| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:42:10:42:11 | M5 | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:42:10:42:11 | M5 | | AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:42:10:42:11 | M5 | @@ -174,40 +164,27 @@ nodeEnclosing | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:49:10:49:11 | M6 | +| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:49:10:49:11 | M6 | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:49:10:49:11 | M6 | | AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:49:10:49:11 | M6 | @@ -286,22 +263,15 @@ nodeEnclosing | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:66:10:66:11 | M9 | +| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:66:10:66:11 | M9 | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:66:10:66:11 | M9 | | AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:66:10:66:11 | M9 | @@ -803,8 +773,7 @@ nodeEnclosing | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:3:10:3:10 | M | | Assignments.cs:5:17:5:17 | 0 | Assignments.cs:3:10:3:10 | M | | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:3:10:3:10 | M | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:3:10:3:10 | M | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:3:10:3:10 | M | | Assignments.cs:6:9:6:15 | ...; | Assignments.cs:3:10:3:10 | M | | Assignments.cs:6:14:6:14 | 1 | Assignments.cs:3:10:3:10 | M | | Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:3:10:3:10 | M | @@ -812,16 +781,14 @@ nodeEnclosing | Assignments.cs:8:21:8:21 | 0 | Assignments.cs:3:10:3:10 | M | | Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:3:10:3:10 | M | | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:3:10:3:10 | M | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:3:10:3:10 | M | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:3:10:3:10 | M | | Assignments.cs:9:9:9:15 | ...; | Assignments.cs:3:10:3:10 | M | | Assignments.cs:9:14:9:14 | 2 | Assignments.cs:3:10:3:10 | M | | Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:3:10:3:10 | M | | Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:3:10:3:10 | M | | Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:3:10:3:10 | M | | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:3:10:3:10 | M | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:3:10:3:10 | M | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:3:10:3:10 | M | +| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:3:10:3:10 | M | | Assignments.cs:12:9:12:18 | ...; | Assignments.cs:3:10:3:10 | M | | Assignments.cs:12:14:12:17 | this access | Assignments.cs:3:10:3:10 | M | | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:3:10:3:10 | M | @@ -1165,20 +1132,14 @@ nodeEnclosing | ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:46:10:46:11 | M9 | +| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:46:10:46:11 | M9 | +| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | CommaJoinWith | | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | CommaJoinWith | @@ -1412,8 +1373,7 @@ nodeEnclosing | Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:102:12:102:13 | M8 | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:102:12:102:13 | M8 | -| Conditions.cs:106:13:106:19 | ... = ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:106:13:106:20 | ...; | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:106:18:106:19 | "" | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:102:12:102:13 | M8 | @@ -1426,8 +1386,7 @@ nodeEnclosing | Conditions.cs:108:17:108:18 | [true] !... | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:102:12:102:13 | M8 | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:102:12:102:13 | M8 | -| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:102:12:102:13 | M8 | +| Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:109:17:109:24 | ...; | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:109:22:109:23 | "" | Conditions.cs:102:12:102:13 | M8 | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:102:12:102:13 | M8 | @@ -2131,8 +2090,7 @@ nodeEnclosing | Finally.cs:271:13:271:35 | ...; | Finally.cs:263:10:263:12 | M13 | | Finally.cs:271:31:271:33 | "3" | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:13:272:19 | ...; | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:18:272:18 | 3 | Finally.cs:263:10:263:12 | M13 | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | Foreach | @@ -4204,11 +4162,8 @@ nodeEnclosing | cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:208:10:208:11 | Do | | cflow.cs:211:9:221:9 | {...} | cflow.cs:208:10:208:11 | Do | | cflow.cs:212:13:212:17 | access to field Field | cflow.cs:208:10:208:11 | Do | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:208:10:208:11 | Do | -| cflow.cs:212:13:212:17 | this access | cflow.cs:208:10:208:11 | Do | | cflow.cs:212:13:212:17 | this access | cflow.cs:208:10:208:11 | Do | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:208:10:208:11 | Do | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:208:10:208:11 | Do | +| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:208:10:208:11 | Do | | cflow.cs:212:13:212:25 | ...; | cflow.cs:208:10:208:11 | Do | | cflow.cs:212:22:212:24 | "a" | cflow.cs:208:10:208:11 | Do | | cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:208:10:208:11 | Do | @@ -4243,11 +4198,8 @@ nodeEnclosing | cflow.cs:226:62:226:63 | 10 | cflow.cs:224:10:224:16 | Foreach | | cflow.cs:227:9:237:9 | {...} | cflow.cs:224:10:224:16 | Foreach | | cflow.cs:228:13:228:17 | access to field Field | cflow.cs:224:10:224:16 | Foreach | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:224:10:224:16 | Foreach | -| cflow.cs:228:13:228:17 | this access | cflow.cs:224:10:224:16 | Foreach | | cflow.cs:228:13:228:17 | this access | cflow.cs:224:10:224:16 | Foreach | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:224:10:224:16 | Foreach | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:224:10:224:16 | Foreach | +| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:224:10:224:16 | Foreach | | cflow.cs:228:13:228:23 | ...; | cflow.cs:224:10:224:16 | Foreach | | cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:224:10:224:16 | Foreach | | cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:224:10:224:16 | Foreach | @@ -4666,7 +4618,6 @@ blockEnclosing | ConditionalAccess.cs:42:9:42:11 | enter get_Item | ConditionalAccess.cs:42:9:42:11 | get_Item | | ConditionalAccess.cs:43:9:43:11 | enter set_Item | ConditionalAccess.cs:43:9:43:11 | set_Item | | ConditionalAccess.cs:46:10:46:11 | enter M9 | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:48:24:48:25 | 42 | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:49:9:49:33 | ...; | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:49:26:49:32 | "Hello" | ConditionalAccess.cs:46:10:46:11 | M9 | @@ -4678,13 +4629,10 @@ blockEnclosing | ConditionalAccess.cs:52:9:52:16 | access to property Prop | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:46:10:46:11 | M9 | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:46:10:46:11 | M9 | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:26:60:38 | CommaJoinWith | | Conditions.cs:1:7:1:16 | enter Conditions | Conditions.cs:1:7:1:16 | Conditions | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected index 410916afabdf..248562dbc833 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EntryElement.expected @@ -109,77 +109,48 @@ | AccessorCalls.cs:39:16:39:16 | 0 | AccessorCalls.cs:39:16:39:16 | 0 | | AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:43:5:47:5 | {...} | | AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:12 | this access | | AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:12 | this access | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:44:9:44:12 | this access | | AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:44:9:44:12 | this access | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:44:9:44:12 | this access | | AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:44:9:44:33 | ...; | | AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:44:23:44:26 | this access | | AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:23:44:26 | this access | | AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:12 | this access | | AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:12 | this access | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:45:9:45:12 | this access | | AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:45:9:45:12 | this access | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:45:9:45:12 | this access | | AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:45:9:45:31 | ...; | | AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:45:22:45:25 | this access | | AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:22:45:25 | this access | | AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:9:46:12 | this access | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:9:46:12 | this access | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:12 | this access | | AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:12 | this access | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:46:9:46:12 | this access | | AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:46:9:46:12 | this access | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:46:9:46:12 | this access | | AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:46:9:46:27 | ...; | | AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:14:46:14 | 0 | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:14:46:14 | 0 | | AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:46:20:46:23 | this access | | AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:20:46:23 | this access | | AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:46:25:46:25 | 0 | | AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:50:5:54:5 | {...} | | AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:12 | this access | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:12 | this access | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:51:9:51:12 | this access | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:51:9:51:12 | this access | | AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:51:9:51:37 | ...; | | AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:51:25:51:28 | this access | | AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:51:25:51:28 | this access | | AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:25:51:28 | this access | | AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:12 | this access | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:12 | this access | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:12 | this access | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:12 | this access | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:52:9:52:12 | this access | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:52:9:52:12 | this access | | AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:52:9:52:35 | ...; | | AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:52:24:52:27 | this access | | AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:52:24:52:27 | this access | | AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:24:52:27 | this access | | AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:12 | this access | | AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:12 | this access | | AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:53:9:53:12 | this access | | AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:53:9:53:12 | this access | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:53:9:53:12 | this access | | AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:53:9:53:31 | ...; | | AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:16:53:16 | 0 | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:16:53:16 | 0 | | AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:53:22:53:25 | this access | | AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:53:22:53:25 | this access | | AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:53:22:53:25 | this access | @@ -249,24 +220,15 @@ | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:70:9:70:9 | access to local variable d | | AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:70:9:70:22 | ...; | | AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:9 | access to local variable d | | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:9 | access to local variable d | | AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:71:9:71:9 | access to local variable d | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:71:9:71:9 | access to local variable d | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:71:9:71:9 | access to local variable d | | AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:71:9:71:26 | ...; | | AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:25:71:25 | access to parameter e | | AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:9:72:9 | access to local variable d | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:9:72:9 | access to local variable d | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:9 | access to local variable d | | AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:9 | access to local variable d | | AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:72:9:72:9 | access to local variable d | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:72:9:72:9 | access to local variable d | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:72:9:72:9 | access to local variable d | | AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:72:9:72:21 | ...; | | AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:11:72:11 | 0 | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:11:72:11 | 0 | | AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:72:17:72:17 | access to local variable d | | AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:17:72:17 | access to local variable d | | AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:72:19:72:19 | 1 | @@ -689,9 +651,7 @@ | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:5:17:5:17 | 0 | | Assignments.cs:5:17:5:17 | 0 | Assignments.cs:5:17:5:17 | 0 | | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:9:6:9 | access to local variable x | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:9:6:9 | access to local variable x | | Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:6:9:6:9 | access to local variable x | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:6:9:6:9 | access to local variable x | | Assignments.cs:6:9:6:15 | ...; | Assignments.cs:6:9:6:15 | ...; | | Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:14:6:14 | 1 | | Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:8:9:8:22 | ... ...; | @@ -700,8 +660,6 @@ | Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:8:21:8:21 | 0 | | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:9:9:9 | access to local variable d | | Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:9:9:9:9 | access to local variable d | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:9:9:9:9 | access to local variable d | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:9:9:9 | access to local variable d | | Assignments.cs:9:9:9:15 | ...; | Assignments.cs:9:9:9:15 | ...; | | Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:14:9:14 | 2 | | Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:11:9:11:34 | ... ...; | @@ -709,8 +667,6 @@ | Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:11:17:11:33 | object creation of type Assignments | | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:9:12:9 | access to local variable a | | Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:12:9:12:9 | access to local variable a | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:12:9:12:9 | access to local variable a | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:9:12:9 | access to local variable a | | Assignments.cs:12:9:12:18 | ...; | Assignments.cs:12:9:12:18 | ...; | | Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:14:12:17 | this access | | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:9:14:13 | this access | @@ -966,22 +922,14 @@ | ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:32:52:38 | "World" | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:26 | ...; | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:25:53:25 | 1 | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:30 | ...; | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:27:54:29 | "!" | | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | | ConditionalAccess.cs:60:70:60:78 | ... + ... | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | @@ -1180,9 +1128,7 @@ | Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:105:9:106:20 | if (...) ... | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:105:13:105:13 | access to parameter b | | Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:106:13:106:13 | access to local variable x | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:106:13:106:13 | access to local variable x | | Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:106:13:106:13 | access to local variable x | -| Conditions.cs:106:13:106:19 | ... = ... | Conditions.cs:106:13:106:13 | access to local variable x | | Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:20 | ...; | | Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:18:106:19 | "" | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:107:9:109:24 | if (...) ... | @@ -1194,9 +1140,7 @@ | Conditions.cs:108:17:108:18 | !... | Conditions.cs:108:18:108:18 | access to parameter b | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:18:108:18 | access to parameter b | | Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:109:17:109:17 | access to local variable x | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:109:17:109:17 | access to local variable x | | Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:109:17:109:17 | access to local variable x | -| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:109:17:109:17 | access to local variable x | | Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:24 | ...; | | Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:22:109:23 | "" | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:110:16:110:16 | access to local variable x | @@ -1776,9 +1720,7 @@ | Finally.cs:271:13:271:35 | ...; | Finally.cs:271:13:271:35 | ...; | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:31:271:33 | "3" | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:13:272:13 | access to parameter i | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:13 | access to parameter i | | Finally.cs:272:13:272:18 | ... += ... | Finally.cs:272:13:272:13 | access to parameter i | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:272:13:272:13 | access to parameter i | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:19 | ...; | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:18:272:18 | 3 | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | call to constructor Object | @@ -3417,12 +3359,8 @@ | cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:210:9:221:36 | do ... while (...); | | cflow.cs:211:9:221:9 | {...} | cflow.cs:211:9:221:9 | {...} | | cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:17 | this access | | cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:212:13:212:17 | this access | | cflow.cs:212:13:212:24 | ... += ... | cflow.cs:212:13:212:17 | this access | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:212:13:212:17 | this access | | cflow.cs:212:13:212:25 | ...; | cflow.cs:212:13:212:25 | ...; | | cflow.cs:212:22:212:24 | "a" | cflow.cs:212:22:212:24 | "a" | | cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:213:13:216:13 | if (...) ... | @@ -3454,12 +3392,8 @@ | cflow.cs:226:62:226:63 | 10 | cflow.cs:226:62:226:63 | 10 | | cflow.cs:227:9:237:9 | {...} | cflow.cs:227:9:237:9 | {...} | | cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | | cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:228:13:228:17 | this access | | cflow.cs:228:13:228:22 | ... += ... | cflow.cs:228:13:228:17 | this access | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:228:13:228:17 | this access | | cflow.cs:228:13:228:23 | ...; | cflow.cs:228:13:228:23 | ...; | | cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:22:228:22 | access to local variable x | | cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:229:13:232:13 | if (...) ... | diff --git a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected index a6794112ebda..602dd8c2a528 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/ExitElement.expected @@ -107,78 +107,49 @@ | AccessorCalls.cs:39:9:39:19 | ...++ | AccessorCalls.cs:39:9:39:19 | ...++ | normal | | AccessorCalls.cs:39:9:39:20 | ...; | AccessorCalls.cs:39:9:39:19 | ...++ | normal | | AccessorCalls.cs:39:16:39:16 | 0 | AccessorCalls.cs:39:16:39:16 | 0 | normal | -| AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:46:9:46:26 | ... = ... | normal | +| AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:46:9:46:26 | ... += ... | normal | | AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | normal | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | normal | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:12 | this access | normal | | AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:18 | access to field Field | normal | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:44:9:44:32 | ... + ... | normal | -| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:44:9:44:32 | ... = ... | normal | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:44:9:44:32 | ... = ... | normal | -| AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:44:9:44:32 | ... = ... | normal | +| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:44:9:44:32 | ... += ... | normal | +| AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:44:9:44:32 | ... += ... | normal | | AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:44:23:44:26 | this access | normal | | AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:23:44:32 | access to field Field | normal | | AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | normal | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | normal | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:12 | this access | normal | | AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:17 | access to property Prop | normal | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:45:9:45:30 | ... + ... | normal | -| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:45:9:45:30 | ... = ... | normal | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:45:9:45:30 | ... = ... | normal | -| AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:45:9:45:30 | ... = ... | normal | +| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:45:9:45:30 | ... += ... | normal | +| AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:45:9:45:30 | ... += ... | normal | | AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:45:22:45:25 | this access | normal | | AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:22:45:30 | access to property Prop | normal | | AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:9:46:12 | this access | normal | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:9:46:12 | this access | normal | | AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:15 | access to indexer | normal | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:14:46:14 | 0 | normal | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:46:9:46:26 | ... + ... | normal | -| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:46:9:46:26 | ... = ... | normal | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:46:9:46:26 | ... = ... | normal | -| AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:46:9:46:26 | ... = ... | normal | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:14:46:14 | 0 | normal | +| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:46:9:46:26 | ... += ... | normal | +| AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:46:9:46:26 | ... += ... | normal | | AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:14:46:14 | 0 | normal | | AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:46:20:46:23 | this access | normal | | AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:20:46:26 | access to indexer | normal | | AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:46:25:46:25 | 0 | normal | -| AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:53:9:53:30 | ... = ... | normal | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:12 | this access | normal | +| AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:53:9:53:30 | ... += ... | normal | | AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:12 | this access | normal | | AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:14 | access to field x | normal | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:14 | access to field x | normal | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:14 | access to field x | normal | | AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:20 | access to field Field | normal | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:51:9:51:36 | ... + ... | normal | -| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:51:9:51:36 | ... = ... | normal | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:51:9:51:36 | ... = ... | normal | -| AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:51:9:51:36 | ... = ... | normal | +| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:51:9:51:36 | ... += ... | normal | +| AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:51:9:51:36 | ... += ... | normal | | AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:51:25:51:28 | this access | normal | | AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:51:25:51:30 | access to field x | normal | | AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:25:51:36 | access to field Field | normal | | AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:12 | this access | normal | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:12 | this access | normal | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:14 | access to field x | normal | | AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:14 | access to field x | normal | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:14 | access to field x | normal | | AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:19 | access to property Prop | normal | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:52:9:52:34 | ... + ... | normal | -| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:52:9:52:34 | ... = ... | normal | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:52:9:52:34 | ... = ... | normal | -| AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:52:9:52:34 | ... = ... | normal | +| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:52:9:52:34 | ... += ... | normal | +| AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:52:9:52:34 | ... += ... | normal | | AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:52:24:52:27 | this access | normal | | AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:52:24:52:29 | access to field x | normal | | AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:24:52:34 | access to property Prop | normal | | AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:12 | this access | normal | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:12 | this access | normal | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:14 | access to field x | normal | | AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:9:53:14 | access to field x | normal | | AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:17 | access to indexer | normal | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:16:53:16 | 0 | normal | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:53:9:53:30 | ... + ... | normal | -| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:53:9:53:30 | ... = ... | normal | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:53:9:53:30 | ... = ... | normal | -| AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:53:9:53:30 | ... = ... | normal | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:16:53:16 | 0 | normal | +| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:53:9:53:30 | ... += ... | normal | +| AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:53:9:53:30 | ... += ... | normal | | AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:16:53:16 | 0 | normal | | AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:53:22:53:25 | this access | normal | | AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:53:22:53:27 | access to field x | normal | @@ -249,23 +220,14 @@ | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | normal | | AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | normal | | AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | normal | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | normal | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:9 | access to local variable d | normal | | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | normal | -| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:71:9:71:25 | ... = ... | normal | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:71:9:71:25 | ... = ... | normal | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | normal | -| AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:71:9:71:25 | ... = ... | normal | +| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:71:9:71:25 | ... += ... | normal | +| AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:71:9:71:25 | ... += ... | normal | | AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:25:71:25 | access to parameter e | normal | | AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:9:72:9 | access to local variable d | normal | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:9:72:9 | access to local variable d | normal | | AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:12 | dynamic access to element | normal | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:11:72:11 | 0 | normal | -| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:72:9:72:20 | ... = ... | normal | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:72:9:72:20 | ... = ... | normal | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | normal | -| AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:72:9:72:20 | ... = ... | normal | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:11:72:11 | 0 | normal | +| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:72:9:72:20 | ... += ... | normal | +| AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:72:9:72:20 | ... += ... | normal | | AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:11:72:11 | 0 | normal | | AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:72:17:72:17 | access to local variable d | normal | | AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:17:72:20 | dynamic access to element | normal | @@ -788,29 +750,23 @@ | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:5:13:5:17 | Int32 x = ... | normal | | Assignments.cs:5:17:5:17 | 0 | Assignments.cs:5:17:5:17 | 0 | normal | | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:9:6:9 | access to local variable x | normal | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:9:6:14 | ... + ... | normal | -| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:6:9:6:14 | ... = ... | normal | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:6:9:6:14 | ... = ... | normal | -| Assignments.cs:6:9:6:15 | ...; | Assignments.cs:6:9:6:14 | ... = ... | normal | +| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:6:9:6:14 | ... += ... | normal | +| Assignments.cs:6:9:6:15 | ...; | Assignments.cs:6:9:6:14 | ... += ... | normal | | Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:14:6:14 | 1 | normal | | Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:8:17:8:21 | dynamic d = ... | normal | | Assignments.cs:8:17:8:21 | dynamic d = ... | Assignments.cs:8:17:8:21 | dynamic d = ... | normal | | Assignments.cs:8:21:8:21 | 0 | Assignments.cs:8:21:8:21 | 0 | normal | | Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:8:21:8:21 | (...) ... | normal | | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:9:9:9 | access to local variable d | normal | -| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:9:9:9:14 | ... = ... | normal | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:9:9:9:14 | ... = ... | normal | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:9:9:14 | dynamic call to operator - | normal | -| Assignments.cs:9:9:9:15 | ...; | Assignments.cs:9:9:9:14 | ... = ... | normal | +| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:9:9:9:14 | ... -= ... | normal | +| Assignments.cs:9:9:9:15 | ...; | Assignments.cs:9:9:9:14 | ... -= ... | normal | | Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:14:9:14 | 2 | normal | | Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:11:13:11:33 | Assignments a = ... | normal | | Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:11:13:11:33 | Assignments a = ... | normal | | Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:11:17:11:33 | object creation of type Assignments | normal | | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:9:12:9 | access to local variable a | normal | -| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:12:9:12:17 | ... = ... | normal | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:12:9:12:17 | ... = ... | normal | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:9:12:17 | call to operator + | normal | -| Assignments.cs:12:9:12:18 | ...; | Assignments.cs:12:9:12:17 | ... = ... | normal | +| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:12:9:12:17 | ... += ... | normal | +| Assignments.cs:12:9:12:18 | ...; | Assignments.cs:12:9:12:17 | ... += ... | normal | | Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:14:12:17 | this access | normal | | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:9:14:13 | this access | normal | | Assignments.cs:14:9:14:13 | this access | Assignments.cs:14:9:14:13 | this access | normal | @@ -1120,8 +1076,7 @@ | ConditionalAccess.cs:42:15:42:26 | return ...; | ConditionalAccess.cs:42:15:42:26 | return ...; | return | | ConditionalAccess.cs:42:22:42:25 | null | ConditionalAccess.cs:42:22:42:25 | null | normal | | ConditionalAccess.cs:43:13:43:15 | {...} | ConditionalAccess.cs:43:13:43:15 | {...} | normal | -| ConditionalAccess.cs:47:5:55:5 | {...} | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:47:5:55:5 | {...} | ConditionalAccess.cs:54:12:54:29 | ... = ... | normal | +| ConditionalAccess.cs:47:5:55:5 | {...} | ConditionalAccess.cs:54:12:54:29 | ... += ... | normal | | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | non-null | | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | null | | ConditionalAccess.cs:48:9:48:20 | access to field IntField | ConditionalAccess.cs:48:9:48:10 | access to parameter ca | non-null | @@ -1181,36 +1136,18 @@ | ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:52:18:52:38 | ... = ... | normal | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:32:52:38 | "World" | normal | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:9:53:20 | access to field IntField | normal | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:12:53:25 | ... = ... | normal | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:53:12:53:25 | ... - ... | normal | -| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:53:12:53:25 | ... = ... | normal | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | null | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:53:12:53:25 | ... = ... | normal | +| ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:12:53:25 | ... -= ... | normal | +| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:53:12:53:25 | ... -= ... | normal | | ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:25:53:25 | 1 | normal | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | non-null | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | normal | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:12:54:29 | ... = ... | normal | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:54:12:54:29 | ... + ... | normal | -| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:54:12:54:29 | ... = ... | normal | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | null | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:54:12:54:29 | ... = ... | normal | +| ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:12:54:29 | ... += ... | normal | +| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:54:12:54:29 | ... += ... | normal | | ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:27:54:29 | "!" | normal | | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | normal | | ConditionalAccess.cs:60:70:60:78 | ... + ... | ConditionalAccess.cs:60:70:60:78 | ... + ... | normal | @@ -1458,34 +1395,30 @@ | Conditions.cs:104:17:104:17 | access to parameter b | Conditions.cs:104:17:104:17 | access to parameter b | normal | | Conditions.cs:104:17:104:28 | call to method ToString | Conditions.cs:104:17:104:28 | call to method ToString | normal | | Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:105:13:105:13 | access to parameter b | false | -| Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:106:13:106:19 | ... = ... | normal | +| Conditions.cs:105:9:106:20 | if (...) ... | Conditions.cs:106:13:106:19 | ... += ... | normal | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:105:13:105:13 | access to parameter b | false | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:105:13:105:13 | access to parameter b | true | | Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:106:13:106:13 | access to local variable x | normal | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:106:13:106:19 | ... + ... | normal | -| Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:106:13:106:19 | ... = ... | normal | -| Conditions.cs:106:13:106:19 | ... = ... | Conditions.cs:106:13:106:19 | ... = ... | normal | -| Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:19 | ... = ... | normal | +| Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:106:13:106:19 | ... += ... | normal | +| Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:19 | ... += ... | normal | | Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:18:106:19 | "" | normal | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:107:13:107:24 | ... > ... | false | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:108:17:108:18 | !... | false | -| Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:109:17:109:23 | ... = ... | normal | +| Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:109:17:109:23 | ... += ... | normal | | Conditions.cs:107:13:107:13 | access to local variable x | Conditions.cs:107:13:107:13 | access to local variable x | normal | | Conditions.cs:107:13:107:20 | access to property Length | Conditions.cs:107:13:107:20 | access to property Length | normal | | Conditions.cs:107:13:107:24 | ... > ... | Conditions.cs:107:13:107:24 | ... > ... | false | | Conditions.cs:107:13:107:24 | ... > ... | Conditions.cs:107:13:107:24 | ... > ... | true | | Conditions.cs:107:24:107:24 | 0 | Conditions.cs:107:24:107:24 | 0 | normal | | Conditions.cs:108:13:109:24 | if (...) ... | Conditions.cs:108:17:108:18 | !... | false | -| Conditions.cs:108:13:109:24 | if (...) ... | Conditions.cs:109:17:109:23 | ... = ... | normal | +| Conditions.cs:108:13:109:24 | if (...) ... | Conditions.cs:109:17:109:23 | ... += ... | normal | | Conditions.cs:108:17:108:18 | !... | Conditions.cs:108:17:108:18 | !... | false | | Conditions.cs:108:17:108:18 | !... | Conditions.cs:108:17:108:18 | !... | true | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:18:108:18 | access to parameter b | false | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:18:108:18 | access to parameter b | true | | Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:109:17:109:17 | access to local variable x | normal | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:109:17:109:23 | ... + ... | normal | -| Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:109:17:109:23 | ... = ... | normal | -| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:109:17:109:23 | ... = ... | normal | -| Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:23 | ... = ... | normal | +| Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:109:17:109:23 | ... += ... | normal | +| Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:23 | ... += ... | normal | | Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:22:109:23 | "" | normal | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:110:9:110:17 | return ...; | return | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:16:110:16 | access to local variable x | normal | @@ -2405,10 +2338,10 @@ | Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:260:9:260:33 | call to method WriteLine | normal | | Finally.cs:260:9:260:34 | ...; | Finally.cs:260:9:260:33 | call to method WriteLine | normal | | Finally.cs:260:27:260:32 | "Done" | Finally.cs:260:27:260:32 | "Done" | normal | -| Finally.cs:264:5:274:5 | {...} | Finally.cs:272:13:272:18 | ... = ... | normal | -| Finally.cs:264:5:274:5 | {...} | Finally.cs:272:13:272:18 | ... = ... | throw(Exception) [normal] (0) | -| Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:272:13:272:18 | ... = ... | normal | -| Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:272:13:272:18 | ... = ... | throw(Exception) [normal] (0) | +| Finally.cs:264:5:274:5 | {...} | Finally.cs:272:13:272:18 | ... += ... | normal | +| Finally.cs:264:5:274:5 | {...} | Finally.cs:272:13:272:18 | ... += ... | throw(Exception) [normal] (0) | +| Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:272:13:272:18 | ... += ... | normal | +| Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:272:13:272:18 | ... += ... | throw(Exception) [normal] (0) | | Finally.cs:266:9:268:9 | {...} | Finally.cs:267:13:267:34 | call to method WriteLine | normal | | Finally.cs:266:9:268:9 | {...} | Finally.cs:267:13:267:34 | call to method WriteLine | throw(Exception) | | Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:267:13:267:34 | call to method WriteLine | normal | @@ -2416,15 +2349,13 @@ | Finally.cs:267:13:267:35 | ...; | Finally.cs:267:13:267:34 | call to method WriteLine | normal | | Finally.cs:267:13:267:35 | ...; | Finally.cs:267:13:267:34 | call to method WriteLine | throw(Exception) | | Finally.cs:267:31:267:33 | "1" | Finally.cs:267:31:267:33 | "1" | normal | -| Finally.cs:270:9:273:9 | {...} | Finally.cs:272:13:272:18 | ... = ... | normal | +| Finally.cs:270:9:273:9 | {...} | Finally.cs:272:13:272:18 | ... += ... | normal | | Finally.cs:271:13:271:34 | call to method WriteLine | Finally.cs:271:13:271:34 | call to method WriteLine | normal | | Finally.cs:271:13:271:35 | ...; | Finally.cs:271:13:271:34 | call to method WriteLine | normal | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:31:271:33 | "3" | normal | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:13:272:13 | access to parameter i | normal | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:18 | ... + ... | normal | -| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:272:13:272:18 | ... = ... | normal | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:272:13:272:18 | ... = ... | normal | -| Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:18 | ... = ... | normal | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:272:13:272:18 | ... += ... | normal | +| Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:18 | ... += ... | normal | | Finally.cs:272:18:272:18 | 3 | Finally.cs:272:18:272:18 | 3 | normal | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | call to constructor Object | normal | | Foreach.cs:4:7:4:13 | call to method | Foreach.cs:4:7:4:13 | call to method | normal | @@ -4403,13 +4334,9 @@ | cflow.cs:211:9:221:9 | {...} | cflow.cs:217:17:217:32 | ... < ... | false | | cflow.cs:211:9:221:9 | {...} | cflow.cs:219:17:219:22 | break; | break | | cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:17 | access to field Field | normal | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:17 | this access | normal | | cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | normal | -| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | normal | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:212:13:212:24 | ... + ... | normal | -| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:212:13:212:24 | ... = ... | normal | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:212:13:212:24 | ... = ... | normal | -| cflow.cs:212:13:212:25 | ...; | cflow.cs:212:13:212:24 | ... = ... | normal | +| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:212:13:212:24 | ... += ... | normal | +| cflow.cs:212:13:212:25 | ...; | cflow.cs:212:13:212:24 | ... += ... | normal | | cflow.cs:212:22:212:24 | "a" | cflow.cs:212:22:212:24 | "a" | normal | | cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:213:17:213:32 | ... > ... | false | | cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:215:17:215:25 | continue; | continue | @@ -4449,13 +4376,9 @@ | cflow.cs:227:9:237:9 | {...} | cflow.cs:233:17:233:32 | ... < ... | false | | cflow.cs:227:9:237:9 | {...} | cflow.cs:235:17:235:22 | break; | break | | cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:17 | access to field Field | normal | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:17 | this access | normal | -| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | normal | | cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | normal | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:228:13:228:22 | ... + ... | normal | -| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:228:13:228:22 | ... = ... | normal | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:228:13:228:22 | ... = ... | normal | -| cflow.cs:228:13:228:23 | ...; | cflow.cs:228:13:228:22 | ... = ... | normal | +| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:228:13:228:22 | ... += ... | normal | +| cflow.cs:228:13:228:23 | ...; | cflow.cs:228:13:228:22 | ... += ... | normal | | cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:22:228:22 | access to local variable x | normal | | cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:229:17:229:32 | ... > ... | false | | cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:231:17:231:25 | continue; | continue | diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected index 4ce98d5096ff..544bc1bd776c 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected @@ -128,77 +128,54 @@ | AccessorCalls.cs:42:10:42:11 | enter M5 | AccessorCalls.cs:43:5:47:5 | {...} | | | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | AccessorCalls.cs:42:10:42:11 | exit M5 | | | AccessorCalls.cs:43:5:47:5 | {...} | AccessorCalls.cs:44:9:44:33 | ...; | | -| AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:12 | this access | | | AccessorCalls.cs:44:9:44:12 | this access | AccessorCalls.cs:44:9:44:18 | access to field Field | | -| AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... = ... | | | AccessorCalls.cs:44:9:44:18 | access to field Field | AccessorCalls.cs:44:23:44:26 | this access | | -| AccessorCalls.cs:44:9:44:32 | ... + ... | AccessorCalls.cs:44:9:44:18 | access to field Field | | -| AccessorCalls.cs:44:9:44:32 | ... = ... | AccessorCalls.cs:45:9:45:31 | ...; | | +| AccessorCalls.cs:44:9:44:32 | ... += ... | AccessorCalls.cs:45:9:45:31 | ...; | | | AccessorCalls.cs:44:9:44:33 | ...; | AccessorCalls.cs:44:9:44:12 | this access | | | AccessorCalls.cs:44:23:44:26 | this access | AccessorCalls.cs:44:23:44:32 | access to field Field | | -| AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... + ... | | -| AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:12 | this access | | +| AccessorCalls.cs:44:23:44:32 | access to field Field | AccessorCalls.cs:44:9:44:32 | ... += ... | | | AccessorCalls.cs:45:9:45:12 | this access | AccessorCalls.cs:45:9:45:17 | access to property Prop | | -| AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... = ... | | | AccessorCalls.cs:45:9:45:17 | access to property Prop | AccessorCalls.cs:45:22:45:25 | this access | | -| AccessorCalls.cs:45:9:45:30 | ... + ... | AccessorCalls.cs:45:9:45:17 | access to property Prop | | -| AccessorCalls.cs:45:9:45:30 | ... = ... | AccessorCalls.cs:46:9:46:27 | ...; | | +| AccessorCalls.cs:45:9:45:30 | ... += ... | AccessorCalls.cs:46:9:46:27 | ...; | | | AccessorCalls.cs:45:9:45:31 | ...; | AccessorCalls.cs:45:9:45:12 | this access | | | AccessorCalls.cs:45:22:45:25 | this access | AccessorCalls.cs:45:22:45:30 | access to property Prop | | -| AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... + ... | | +| AccessorCalls.cs:45:22:45:30 | access to property Prop | AccessorCalls.cs:45:9:45:30 | ... += ... | | | AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:14:46:14 | 0 | | -| AccessorCalls.cs:46:9:46:12 | this access | AccessorCalls.cs:46:14:46:14 | 0 | | -| AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... = ... | | | AccessorCalls.cs:46:9:46:15 | access to indexer | AccessorCalls.cs:46:20:46:23 | this access | | -| AccessorCalls.cs:46:9:46:26 | ... + ... | AccessorCalls.cs:46:9:46:15 | access to indexer | | -| AccessorCalls.cs:46:9:46:26 | ... = ... | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | | +| AccessorCalls.cs:46:9:46:26 | ... += ... | AccessorCalls.cs:42:10:42:11 | exit M5 (normal) | | | AccessorCalls.cs:46:9:46:27 | ...; | AccessorCalls.cs:46:9:46:12 | this access | | -| AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:12 | this access | | | AccessorCalls.cs:46:14:46:14 | 0 | AccessorCalls.cs:46:9:46:15 | access to indexer | | | AccessorCalls.cs:46:20:46:23 | this access | AccessorCalls.cs:46:25:46:25 | 0 | | -| AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... + ... | | +| AccessorCalls.cs:46:20:46:26 | access to indexer | AccessorCalls.cs:46:9:46:26 | ... += ... | | | AccessorCalls.cs:46:25:46:25 | 0 | AccessorCalls.cs:46:20:46:26 | access to indexer | | | AccessorCalls.cs:49:10:49:11 | enter M6 | AccessorCalls.cs:50:5:54:5 | {...} | | | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | AccessorCalls.cs:49:10:49:11 | exit M6 | | | AccessorCalls.cs:50:5:54:5 | {...} | AccessorCalls.cs:51:9:51:37 | ...; | | | AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:14 | access to field x | | -| AccessorCalls.cs:51:9:51:12 | this access | AccessorCalls.cs:51:9:51:14 | access to field x | | -| AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:12 | this access | | | AccessorCalls.cs:51:9:51:14 | access to field x | AccessorCalls.cs:51:9:51:20 | access to field Field | | -| AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... = ... | | | AccessorCalls.cs:51:9:51:20 | access to field Field | AccessorCalls.cs:51:25:51:28 | this access | | -| AccessorCalls.cs:51:9:51:36 | ... + ... | AccessorCalls.cs:51:9:51:20 | access to field Field | | -| AccessorCalls.cs:51:9:51:36 | ... = ... | AccessorCalls.cs:52:9:52:35 | ...; | | +| AccessorCalls.cs:51:9:51:36 | ... += ... | AccessorCalls.cs:52:9:52:35 | ...; | | | AccessorCalls.cs:51:9:51:37 | ...; | AccessorCalls.cs:51:9:51:12 | this access | | | AccessorCalls.cs:51:25:51:28 | this access | AccessorCalls.cs:51:25:51:30 | access to field x | | | AccessorCalls.cs:51:25:51:30 | access to field x | AccessorCalls.cs:51:25:51:36 | access to field Field | | -| AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... + ... | | -| AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:14 | access to field x | | +| AccessorCalls.cs:51:25:51:36 | access to field Field | AccessorCalls.cs:51:9:51:36 | ... += ... | | | AccessorCalls.cs:52:9:52:12 | this access | AccessorCalls.cs:52:9:52:14 | access to field x | | -| AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:12 | this access | | | AccessorCalls.cs:52:9:52:14 | access to field x | AccessorCalls.cs:52:9:52:19 | access to property Prop | | -| AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... = ... | | | AccessorCalls.cs:52:9:52:19 | access to property Prop | AccessorCalls.cs:52:24:52:27 | this access | | -| AccessorCalls.cs:52:9:52:34 | ... + ... | AccessorCalls.cs:52:9:52:19 | access to property Prop | | -| AccessorCalls.cs:52:9:52:34 | ... = ... | AccessorCalls.cs:53:9:53:31 | ...; | | +| AccessorCalls.cs:52:9:52:34 | ... += ... | AccessorCalls.cs:53:9:53:31 | ...; | | | AccessorCalls.cs:52:9:52:35 | ...; | AccessorCalls.cs:52:9:52:12 | this access | | | AccessorCalls.cs:52:24:52:27 | this access | AccessorCalls.cs:52:24:52:29 | access to field x | | | AccessorCalls.cs:52:24:52:29 | access to field x | AccessorCalls.cs:52:24:52:34 | access to property Prop | | -| AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... + ... | | +| AccessorCalls.cs:52:24:52:34 | access to property Prop | AccessorCalls.cs:52:9:52:34 | ... += ... | | | AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:14 | access to field x | | -| AccessorCalls.cs:53:9:53:12 | this access | AccessorCalls.cs:53:9:53:14 | access to field x | | -| AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:16:53:16 | 0 | | | AccessorCalls.cs:53:9:53:14 | access to field x | AccessorCalls.cs:53:16:53:16 | 0 | | -| AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... = ... | | | AccessorCalls.cs:53:9:53:17 | access to indexer | AccessorCalls.cs:53:22:53:25 | this access | | -| AccessorCalls.cs:53:9:53:30 | ... + ... | AccessorCalls.cs:53:9:53:17 | access to indexer | | -| AccessorCalls.cs:53:9:53:30 | ... = ... | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | | +| AccessorCalls.cs:53:9:53:30 | ... += ... | AccessorCalls.cs:49:10:49:11 | exit M6 (normal) | | | AccessorCalls.cs:53:9:53:31 | ...; | AccessorCalls.cs:53:9:53:12 | this access | | -| AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:12 | this access | | | AccessorCalls.cs:53:16:53:16 | 0 | AccessorCalls.cs:53:9:53:17 | access to indexer | | | AccessorCalls.cs:53:22:53:25 | this access | AccessorCalls.cs:53:22:53:27 | access to field x | | | AccessorCalls.cs:53:22:53:27 | access to field x | AccessorCalls.cs:53:29:53:29 | 0 | | -| AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... + ... | | +| AccessorCalls.cs:53:22:53:30 | access to indexer | AccessorCalls.cs:53:9:53:30 | ... += ... | | | AccessorCalls.cs:53:29:53:29 | 0 | AccessorCalls.cs:53:22:53:30 | access to indexer | | | AccessorCalls.cs:56:10:56:11 | enter M7 | AccessorCalls.cs:57:5:59:5 | {...} | | | AccessorCalls.cs:56:10:56:11 | exit M7 (normal) | AccessorCalls.cs:56:10:56:11 | exit M7 | | @@ -270,25 +247,18 @@ | AccessorCalls.cs:70:9:70:19 | dynamic access to member MaybeProp | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | | | AccessorCalls.cs:70:9:70:21 | dynamic call to operator ++ | AccessorCalls.cs:71:9:71:26 | ...; | | | AccessorCalls.cs:70:9:70:22 | ...; | AccessorCalls.cs:70:9:70:9 | access to local variable d | | -| AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:9 | access to local variable d | | | AccessorCalls.cs:71:9:71:9 | access to local variable d | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | | -| AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:9:71:25 | ... = ... | | | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | AccessorCalls.cs:71:25:71:25 | access to parameter e | | -| AccessorCalls.cs:71:9:71:25 | ... = ... | AccessorCalls.cs:72:9:72:21 | ...; | | -| AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | AccessorCalls.cs:71:9:71:20 | dynamic access to member MaybeEvent | | +| AccessorCalls.cs:71:9:71:25 | ... += ... | AccessorCalls.cs:72:9:72:21 | ...; | | | AccessorCalls.cs:71:9:71:26 | ...; | AccessorCalls.cs:71:9:71:9 | access to local variable d | | -| AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:9:71:25 | dynamic call to operator + | | -| AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:11:72:11 | 0 | | +| AccessorCalls.cs:71:25:71:25 | access to parameter e | AccessorCalls.cs:71:9:71:25 | ... += ... | | | AccessorCalls.cs:72:9:72:9 | access to local variable d | AccessorCalls.cs:72:11:72:11 | 0 | | -| AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | ... = ... | | | AccessorCalls.cs:72:9:72:12 | dynamic access to element | AccessorCalls.cs:72:17:72:17 | access to local variable d | | -| AccessorCalls.cs:72:9:72:20 | ... = ... | AccessorCalls.cs:73:9:73:84 | ...; | | -| AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | AccessorCalls.cs:72:9:72:12 | dynamic access to element | | +| AccessorCalls.cs:72:9:72:20 | ... += ... | AccessorCalls.cs:73:9:73:84 | ...; | | | AccessorCalls.cs:72:9:72:21 | ...; | AccessorCalls.cs:72:9:72:9 | access to local variable d | | -| AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:9 | access to local variable d | | | AccessorCalls.cs:72:11:72:11 | 0 | AccessorCalls.cs:72:9:72:12 | dynamic access to element | | | AccessorCalls.cs:72:17:72:17 | access to local variable d | AccessorCalls.cs:72:19:72:19 | 1 | | -| AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | dynamic call to operator + | | +| AccessorCalls.cs:72:17:72:20 | dynamic access to element | AccessorCalls.cs:72:9:72:20 | ... += ... | | | AccessorCalls.cs:72:19:72:19 | 1 | AccessorCalls.cs:72:17:72:20 | dynamic access to element | | | AccessorCalls.cs:73:9:73:44 | (..., ...) | AccessorCalls.cs:73:49:73:49 | access to local variable d | | | AccessorCalls.cs:73:9:73:83 | ... = ... | AccessorCalls.cs:66:10:66:11 | exit M9 (normal) | | @@ -819,27 +789,24 @@ | Assignments.cs:5:13:5:17 | Int32 x = ... | Assignments.cs:6:9:6:15 | ...; | | | Assignments.cs:5:17:5:17 | 0 | Assignments.cs:5:13:5:17 | Int32 x = ... | | | Assignments.cs:6:9:6:9 | access to local variable x | Assignments.cs:6:14:6:14 | 1 | | -| Assignments.cs:6:9:6:14 | ... + ... | Assignments.cs:6:9:6:14 | ... = ... | | -| Assignments.cs:6:9:6:14 | ... = ... | Assignments.cs:8:9:8:22 | ... ...; | | +| Assignments.cs:6:9:6:14 | ... += ... | Assignments.cs:8:9:8:22 | ... ...; | | | Assignments.cs:6:9:6:15 | ...; | Assignments.cs:6:9:6:9 | access to local variable x | | -| Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:9:6:14 | ... + ... | | +| Assignments.cs:6:14:6:14 | 1 | Assignments.cs:6:9:6:14 | ... += ... | | | Assignments.cs:8:9:8:22 | ... ...; | Assignments.cs:8:21:8:21 | 0 | | | Assignments.cs:8:17:8:21 | dynamic d = ... | Assignments.cs:9:9:9:15 | ...; | | | Assignments.cs:8:21:8:21 | 0 | Assignments.cs:8:21:8:21 | (...) ... | | | Assignments.cs:8:21:8:21 | (...) ... | Assignments.cs:8:17:8:21 | dynamic d = ... | | | Assignments.cs:9:9:9:9 | access to local variable d | Assignments.cs:9:14:9:14 | 2 | | -| Assignments.cs:9:9:9:14 | ... = ... | Assignments.cs:11:9:11:34 | ... ...; | | -| Assignments.cs:9:9:9:14 | dynamic call to operator - | Assignments.cs:9:9:9:14 | ... = ... | | +| Assignments.cs:9:9:9:14 | ... -= ... | Assignments.cs:11:9:11:34 | ... ...; | | | Assignments.cs:9:9:9:15 | ...; | Assignments.cs:9:9:9:9 | access to local variable d | | -| Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:9:9:14 | dynamic call to operator - | | +| Assignments.cs:9:14:9:14 | 2 | Assignments.cs:9:9:9:14 | ... -= ... | | | Assignments.cs:11:9:11:34 | ... ...; | Assignments.cs:11:17:11:33 | object creation of type Assignments | | | Assignments.cs:11:13:11:33 | Assignments a = ... | Assignments.cs:12:9:12:18 | ...; | | | Assignments.cs:11:17:11:33 | object creation of type Assignments | Assignments.cs:11:13:11:33 | Assignments a = ... | | | Assignments.cs:12:9:12:9 | access to local variable a | Assignments.cs:12:14:12:17 | this access | | -| Assignments.cs:12:9:12:17 | ... = ... | Assignments.cs:14:9:14:36 | ...; | | -| Assignments.cs:12:9:12:17 | call to operator + | Assignments.cs:12:9:12:17 | ... = ... | | +| Assignments.cs:12:9:12:17 | ... += ... | Assignments.cs:14:9:14:36 | ...; | | | Assignments.cs:12:9:12:18 | ...; | Assignments.cs:12:9:12:9 | access to local variable a | | -| Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:9:12:17 | call to operator + | | +| Assignments.cs:12:14:12:17 | this access | Assignments.cs:12:9:12:17 | ... += ... | | | Assignments.cs:14:9:14:13 | access to event Event | Assignments.cs:14:9:14:35 | ... += ... | | | Assignments.cs:14:9:14:13 | this access | Assignments.cs:14:18:14:35 | (...) => ... | | | Assignments.cs:14:9:14:35 | ... += ... | Assignments.cs:3:10:3:10 | exit M (normal) | | @@ -1187,26 +1154,18 @@ | ConditionalAccess.cs:52:9:52:39 | ...; | ConditionalAccess.cs:52:9:52:10 | access to parameter ca | | | ConditionalAccess.cs:52:18:52:38 | ... = ... | ConditionalAccess.cs:53:9:53:26 | ...; | | | ConditionalAccess.cs:52:32:52:38 | "World" | ConditionalAccess.cs:52:9:52:28 | access to property StringProp | | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | non-null | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:9:53:20 | access to field IntField | non-null | | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:53:25:53:25 | 1 | null | -| ConditionalAccess.cs:53:9:53:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:30 | ...; | null | -| ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:12:53:25 | ... = ... | | | ConditionalAccess.cs:53:9:53:20 | access to field IntField | ConditionalAccess.cs:53:25:53:25 | 1 | | | ConditionalAccess.cs:53:9:53:26 | ...; | ConditionalAccess.cs:53:9:53:10 | access to parameter ca | | -| ConditionalAccess.cs:53:12:53:25 | ... - ... | ConditionalAccess.cs:53:9:53:20 | access to field IntField | | -| ConditionalAccess.cs:53:12:53:25 | ... = ... | ConditionalAccess.cs:54:9:54:30 | ...; | | -| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:12:53:25 | ... - ... | | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | null | -| ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | non-null | +| ConditionalAccess.cs:53:12:53:25 | ... -= ... | ConditionalAccess.cs:54:9:54:30 | ...; | | +| ConditionalAccess.cs:53:25:53:25 | 1 | ConditionalAccess.cs:53:12:53:25 | ... -= ... | | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | non-null | | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | ConditionalAccess.cs:54:27:54:29 | "!" | null | -| ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:12:54:29 | ... = ... | | | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | ConditionalAccess.cs:54:27:54:29 | "!" | | | ConditionalAccess.cs:54:9:54:30 | ...; | ConditionalAccess.cs:54:9:54:10 | access to parameter ca | | -| ConditionalAccess.cs:54:12:54:29 | ... + ... | ConditionalAccess.cs:54:9:54:22 | access to property StringProp | | -| ConditionalAccess.cs:54:12:54:29 | ... = ... | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | -| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:12:54:29 | ... + ... | | +| ConditionalAccess.cs:54:12:54:29 | ... += ... | ConditionalAccess.cs:46:10:46:11 | exit M9 (normal) | | +| ConditionalAccess.cs:54:27:54:29 | "!" | ConditionalAccess.cs:54:12:54:29 | ... += ... | | | ConditionalAccess.cs:60:26:60:38 | enter CommaJoinWith | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | | | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith (normal) | ConditionalAccess.cs:60:26:60:38 | exit CommaJoinWith | | | ConditionalAccess.cs:60:70:60:71 | access to parameter s1 | ConditionalAccess.cs:60:75:60:78 | ", " | | @@ -1453,10 +1412,9 @@ | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:106:13:106:20 | ...; | true | | Conditions.cs:105:13:105:13 | access to parameter b | Conditions.cs:107:9:109:24 | if (...) ... | false | | Conditions.cs:106:13:106:13 | access to local variable x | Conditions.cs:106:18:106:19 | "" | | -| Conditions.cs:106:13:106:19 | ... + ... | Conditions.cs:106:13:106:19 | ... = ... | | -| Conditions.cs:106:13:106:19 | ... = ... | Conditions.cs:107:9:109:24 | if (...) ... | | +| Conditions.cs:106:13:106:19 | ... += ... | Conditions.cs:107:9:109:24 | if (...) ... | | | Conditions.cs:106:13:106:20 | ...; | Conditions.cs:106:13:106:13 | access to local variable x | | -| Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:13:106:19 | ... + ... | | +| Conditions.cs:106:18:106:19 | "" | Conditions.cs:106:13:106:19 | ... += ... | | | Conditions.cs:107:9:109:24 | if (...) ... | Conditions.cs:107:13:107:13 | access to local variable x | | | Conditions.cs:107:13:107:13 | access to local variable x | Conditions.cs:107:13:107:20 | access to property Length | | | Conditions.cs:107:13:107:20 | access to property Length | Conditions.cs:107:24:107:24 | 0 | | @@ -1469,10 +1427,9 @@ | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:17:108:18 | [false] !... | true | | Conditions.cs:108:18:108:18 | access to parameter b | Conditions.cs:108:17:108:18 | [true] !... | false | | Conditions.cs:109:17:109:17 | access to local variable x | Conditions.cs:109:22:109:23 | "" | | -| Conditions.cs:109:17:109:23 | ... + ... | Conditions.cs:109:17:109:23 | ... = ... | | -| Conditions.cs:109:17:109:23 | ... = ... | Conditions.cs:110:16:110:16 | access to local variable x | | +| Conditions.cs:109:17:109:23 | ... += ... | Conditions.cs:110:16:110:16 | access to local variable x | | | Conditions.cs:109:17:109:24 | ...; | Conditions.cs:109:17:109:17 | access to local variable x | | -| Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:23 | ... + ... | | +| Conditions.cs:109:22:109:23 | "" | Conditions.cs:109:17:109:23 | ... += ... | | | Conditions.cs:110:9:110:17 | return ...; | Conditions.cs:102:12:102:13 | exit M8 (normal) | return | | Conditions.cs:110:16:110:16 | access to local variable x | Conditions.cs:110:9:110:17 | return ...; | | | Conditions.cs:113:10:113:11 | enter M9 | Conditions.cs:114:5:124:5 | {...} | | @@ -2205,11 +2162,10 @@ | Finally.cs:271:13:271:35 | ...; | Finally.cs:271:31:271:33 | "3" | | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:34 | call to method WriteLine | | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:18:272:18 | 3 | | -| Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:18 | ... = ... | | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | exception | -| Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (normal) | | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | exception | +| Finally.cs:272:13:272:18 | ... += ... | Finally.cs:263:10:263:12 | exit M13 (normal) | | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:13 | access to parameter i | | -| Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... + ... | | +| Finally.cs:272:18:272:18 | 3 | Finally.cs:272:13:272:18 | ... += ... | | | Foreach.cs:4:7:4:13 | call to constructor Object | Foreach.cs:4:7:4:13 | {...} | | | Foreach.cs:4:7:4:13 | call to method | Foreach.cs:4:7:4:13 | call to constructor Object | | | Foreach.cs:4:7:4:13 | enter Foreach | Foreach.cs:4:7:4:13 | this access | | @@ -4305,14 +4261,11 @@ | cflow.cs:209:5:222:5 | {...} | cflow.cs:210:9:221:36 | do ... while (...); | | | cflow.cs:210:9:221:36 | do ... while (...); | cflow.cs:211:9:221:9 | {...} | | | cflow.cs:211:9:221:9 | {...} | cflow.cs:212:13:212:25 | ...; | | -| cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:13:212:24 | ... = ... | | | cflow.cs:212:13:212:17 | access to field Field | cflow.cs:212:22:212:24 | "a" | | | cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | access to field Field | | -| cflow.cs:212:13:212:17 | this access | cflow.cs:212:13:212:17 | this access | | -| cflow.cs:212:13:212:24 | ... + ... | cflow.cs:212:13:212:17 | access to field Field | | -| cflow.cs:212:13:212:24 | ... = ... | cflow.cs:213:13:216:13 | if (...) ... | | +| cflow.cs:212:13:212:24 | ... += ... | cflow.cs:213:13:216:13 | if (...) ... | | | cflow.cs:212:13:212:25 | ...; | cflow.cs:212:13:212:17 | this access | | -| cflow.cs:212:22:212:24 | "a" | cflow.cs:212:13:212:24 | ... + ... | | +| cflow.cs:212:22:212:24 | "a" | cflow.cs:212:13:212:24 | ... += ... | | | cflow.cs:213:13:216:13 | if (...) ... | cflow.cs:213:17:213:21 | this access | | | cflow.cs:213:17:213:21 | access to field Field | cflow.cs:213:17:213:28 | access to property Length | | | cflow.cs:213:17:213:21 | this access | cflow.cs:213:17:213:21 | access to field Field | | @@ -4347,14 +4300,11 @@ | cflow.cs:226:57:226:59 | "a" | cflow.cs:226:62:226:63 | 10 | | | cflow.cs:226:62:226:63 | 10 | cflow.cs:226:27:226:64 | call to method Repeat | | | cflow.cs:227:9:237:9 | {...} | cflow.cs:228:13:228:23 | ...; | | -| cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:13:228:22 | ... = ... | | | cflow.cs:228:13:228:17 | access to field Field | cflow.cs:228:22:228:22 | access to local variable x | | | cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | access to field Field | | -| cflow.cs:228:13:228:17 | this access | cflow.cs:228:13:228:17 | this access | | -| cflow.cs:228:13:228:22 | ... + ... | cflow.cs:228:13:228:17 | access to field Field | | -| cflow.cs:228:13:228:22 | ... = ... | cflow.cs:229:13:232:13 | if (...) ... | | +| cflow.cs:228:13:228:22 | ... += ... | cflow.cs:229:13:232:13 | if (...) ... | | | cflow.cs:228:13:228:23 | ...; | cflow.cs:228:13:228:17 | this access | | -| cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:13:228:22 | ... + ... | | +| cflow.cs:228:22:228:22 | access to local variable x | cflow.cs:228:13:228:22 | ... += ... | | | cflow.cs:229:13:232:13 | if (...) ... | cflow.cs:229:17:229:21 | this access | | | cflow.cs:229:17:229:21 | access to field Field | cflow.cs:229:17:229:28 | access to property Length | | | cflow.cs:229:17:229:21 | this access | cflow.cs:229:17:229:21 | access to field Field | | diff --git a/csharp/ql/test/library-tests/csharp11/operators.expected b/csharp/ql/test/library-tests/csharp11/operators.expected index 2c7bda6800d2..6bce5dfa6f5e 100644 --- a/csharp/ql/test/library-tests/csharp11/operators.expected +++ b/csharp/ql/test/library-tests/csharp11/operators.expected @@ -1,7 +1,6 @@ binarybitwise | Operators.cs:7:18:7:25 | ... >>> ... | Operators.cs:7:18:7:19 | access to local variable x1 | Operators.cs:7:25:7:25 | 2 | >>> | UnsignedRightShiftExpr | | Operators.cs:10:18:10:25 | ... >>> ... | Operators.cs:10:18:10:19 | access to local variable y1 | Operators.cs:10:25:10:25 | 3 | >>> | UnsignedRightShiftExpr | -| Operators.cs:13:9:13:16 | ... >>> ... | Operators.cs:13:9:13:9 | access to local variable z | Operators.cs:13:16:13:16 | 5 | >>> | UnsignedRightShiftExpr | assignbitwise | Operators.cs:13:9:13:16 | ... >>>= ... | Operators.cs:13:9:13:9 | access to local variable z | Operators.cs:13:16:13:16 | 5 | >>>= | AssignUnsighedRightShiftExpr | userdefined diff --git a/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.expected b/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.expected index d388d2fdb7c2..1b4f30ad6e75 100644 --- a/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.expected +++ b/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.expected @@ -1,5 +1,4 @@ nullcoalescing -| NullCoalescingAssignment.cs:8:9:8:18 | ... ?? ... | | NullableRefTypes.cs:94:17:94:25 | ... ?? ... | assignments -| NullCoalescingAssignment.cs:8:9:8:18 | ... ??= ... | NullCoalescingAssignment.cs:8:9:8:18 | ... = ... | +| NullCoalescingAssignment.cs:8:9:8:18 | ... ??= ... | diff --git a/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.ql b/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.ql index a3a8ca20e927..1a452274677c 100644 --- a/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.ql +++ b/csharp/ql/test/library-tests/csharp8/NullCoalescingAssignment.ql @@ -2,6 +2,4 @@ import csharp query predicate nullcoalescing(NullCoalescingExpr expr) { any() } -query predicate assignments(AssignCoalesceExpr expr, Expr expanded) { - expanded = expr.getExpandedAssignment() -} +query predicate assignments(AssignCoalesceExpr expr) { any() } diff --git a/csharp/ql/test/library-tests/csharp8/NullCoalescingControlFlow.expected b/csharp/ql/test/library-tests/csharp8/NullCoalescingControlFlow.expected index 2657c450d681..463002be5414 100644 --- a/csharp/ql/test/library-tests/csharp8/NullCoalescingControlFlow.expected +++ b/csharp/ql/test/library-tests/csharp8/NullCoalescingControlFlow.expected @@ -4,9 +4,7 @@ | NullCoalescingAssignment.cs:7:9:7:24 | ... ...; | NullCoalescingAssignment.cs:7:20:7:23 | null | semmle.label | successor | | NullCoalescingAssignment.cs:7:16:7:23 | Object o = ... | NullCoalescingAssignment.cs:8:9:8:19 | ...; | semmle.label | successor | | NullCoalescingAssignment.cs:7:20:7:23 | null | NullCoalescingAssignment.cs:7:16:7:23 | Object o = ... | semmle.label | successor | -| NullCoalescingAssignment.cs:8:9:8:9 | access to local variable o | NullCoalescingAssignment.cs:8:9:8:18 | ... ?? ... | semmle.label | non-null | -| NullCoalescingAssignment.cs:8:9:8:9 | access to local variable o | NullCoalescingAssignment.cs:8:15:8:18 | this access | semmle.label | null | -| NullCoalescingAssignment.cs:8:9:8:18 | ... = ... | NullCoalescingAssignment.cs:5:10:5:23 | exit NullCoalescing (normal) | semmle.label | successor | -| NullCoalescingAssignment.cs:8:9:8:18 | ... ?? ... | NullCoalescingAssignment.cs:8:9:8:18 | ... = ... | semmle.label | successor | +| NullCoalescingAssignment.cs:8:9:8:9 | access to local variable o | NullCoalescingAssignment.cs:8:15:8:18 | this access | semmle.label | successor | +| NullCoalescingAssignment.cs:8:9:8:18 | ... ??= ... | NullCoalescingAssignment.cs:5:10:5:23 | exit NullCoalescing (normal) | semmle.label | successor | | NullCoalescingAssignment.cs:8:9:8:19 | ...; | NullCoalescingAssignment.cs:8:9:8:9 | access to local variable o | semmle.label | successor | -| NullCoalescingAssignment.cs:8:15:8:18 | this access | NullCoalescingAssignment.cs:8:9:8:18 | ... ?? ... | semmle.label | successor | +| NullCoalescingAssignment.cs:8:15:8:18 | this access | NullCoalescingAssignment.cs:8:9:8:18 | ... ??= ... | semmle.label | successor | diff --git a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 861e4c519a82..29533a67083f 100644 --- a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -32,13 +32,14 @@ | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | | LocalDataFlow.cs:59:21:59:25 | "abc" | LocalDataFlow.cs:59:13:59:17 | access to local variable sink1 | | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | -| LocalDataFlow.cs:60:9:60:22 | ... + ... | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | +| LocalDataFlow.cs:60:9:60:22 | ... += ... | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 | +| LocalDataFlow.cs:60:18:60:22 | [post] access to local variable sink0 | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | | LocalDataFlow.cs:61:15:61:19 | [post] access to local variable sink1 | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | | LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | -| LocalDataFlow.cs:64:9:64:25 | ... + ... | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:64:9:64:25 | ... += ... | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | LocalDataFlow.cs:65:15:65:22 | access to local variable nonSink0 | | LocalDataFlow.cs:65:15:65:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | | LocalDataFlow.cs:65:15:65:22 | access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | diff --git a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected index 0950638d8306..4be5dcf12952 100644 --- a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected +++ b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected @@ -31,19 +31,20 @@ | LocalDataFlow.cs:59:13:59:17 | access to local variable sink1 | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | | LocalDataFlow.cs:59:13:59:25 | SSA def(sink1) | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | | LocalDataFlow.cs:59:21:59:25 | "abc" | LocalDataFlow.cs:59:13:59:17 | access to local variable sink1 | -| LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | LocalDataFlow.cs:60:9:60:22 | ... + ... | +| LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | LocalDataFlow.cs:60:9:60:22 | ... += ... | | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | -| LocalDataFlow.cs:60:9:60:22 | ... + ... | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | +| LocalDataFlow.cs:60:9:60:22 | ... += ... | LocalDataFlow.cs:60:9:60:13 | access to local variable sink1 | | LocalDataFlow.cs:60:9:60:22 | SSA def(sink1) | LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 | -| LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | LocalDataFlow.cs:60:9:60:22 | ... + ... | +| LocalDataFlow.cs:60:18:60:22 | [post] access to local variable sink0 | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | +| LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | LocalDataFlow.cs:60:9:60:22 | ... += ... | | LocalDataFlow.cs:60:18:60:22 | access to local variable sink0 | LocalDataFlow.cs:168:20:168:24 | access to local variable sink0 | | LocalDataFlow.cs:61:15:61:19 | [post] access to local variable sink1 | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | | LocalDataFlow.cs:61:15:61:19 | access to local variable sink1 | LocalDataFlow.cs:68:21:68:25 | access to local variable sink1 | -| LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:25 | ... + ... | +| LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:25 | ... += ... | | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | -| LocalDataFlow.cs:64:9:64:25 | ... + ... | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | +| LocalDataFlow.cs:64:9:64:25 | ... += ... | LocalDataFlow.cs:64:9:64:16 | access to local variable nonSink0 | | LocalDataFlow.cs:64:9:64:25 | SSA def(nonSink0) | LocalDataFlow.cs:65:15:65:22 | access to local variable nonSink0 | -| LocalDataFlow.cs:64:21:64:25 | "abc" | LocalDataFlow.cs:64:9:64:25 | ... + ... | +| LocalDataFlow.cs:64:21:64:25 | "abc" | LocalDataFlow.cs:64:9:64:25 | ... += ... | | LocalDataFlow.cs:65:15:65:22 | [post] access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | | LocalDataFlow.cs:65:15:65:22 | access to local variable nonSink0 | LocalDataFlow.cs:72:20:72:27 | access to local variable nonSink0 | | LocalDataFlow.cs:68:13:68:17 | access to local variable sink5 | LocalDataFlow.cs:68:13:68:32 | SSA def(sink5) | diff --git a/csharp/ql/test/library-tests/dataflow/signanalysis/SignAnalysis.expected b/csharp/ql/test/library-tests/dataflow/signanalysis/SignAnalysis.expected index 9f87bf59eebc..4dce60d9c2d9 100644 --- a/csharp/ql/test/library-tests/dataflow/signanalysis/SignAnalysis.expected +++ b/csharp/ql/test/library-tests/dataflow/signanalysis/SignAnalysis.expected @@ -52,8 +52,7 @@ | SignAnalysis.cs:80:13:80:17 | ... = ... | strictlyNegative | | SignAnalysis.cs:80:17:80:17 | access to parameter i | strictlyNegative | | SignAnalysis.cs:81:13:81:13 | access to local variable x | strictlyNegative | -| SignAnalysis.cs:81:13:81:18 | ... + ... | strictlyNegative | -| SignAnalysis.cs:81:13:81:18 | ... = ... | strictlyNegative | +| SignAnalysis.cs:81:13:81:18 | ... += ... | strictlyNegative | | SignAnalysis.cs:81:18:81:18 | access to parameter i | strictlyNegative | | SignAnalysis.cs:82:38:82:38 | access to local variable x | strictlyNegative | | SignAnalysis.cs:87:21:87:21 | access to parameter i | strictlyNegative | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected b/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected index 13036f0f0ae5..9246392b6621 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/DefAdjacentRead.expected @@ -46,7 +46,7 @@ | DefUse.cs:89:13:89:14 | x3 | DefUse.cs:89:13:89:18 | Int32 x3 = ... | DefUse.cs:92:15:92:16 | access to local variable x3 | | DefUse.cs:89:13:89:14 | x3 | DefUse.cs:92:15:92:16 | access to local variable x3 | DefUse.cs:94:13:94:14 | access to local variable x3 | | DefUse.cs:90:13:90:14 | x4 | DefUse.cs:93:15:93:16 | access to local variable x4 | DefUse.cs:95:13:95:14 | access to local variable x4 | -| DefUse.cs:97:13:97:14 | x5 | DefUse.cs:104:9:104:15 | ... = ... | DefUse.cs:105:13:105:14 | access to local variable x5 | +| DefUse.cs:97:13:97:14 | x5 | DefUse.cs:104:9:104:15 | ... += ... | DefUse.cs:105:13:105:14 | access to local variable x5 | | DefUse.cs:118:45:118:45 | i | DefUse.cs:118:45:118:45 | i | DefUse.cs:118:65:118:65 | access to parameter i | | DefUse.cs:120:17:120:21 | Field | DefUse.cs:53:9:53:17 | ... = ... | DefUse.cs:54:13:54:17 | access to field Field | | DefUse.cs:122:16:122:21 | Field2 | DefUse.cs:63:9:63:18 | ... = ... | DefUse.cs:64:13:64:18 | access to field Field2 | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected index 4bbe88295edb..923d62a96ecb 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected @@ -76,7 +76,7 @@ | DefUse.cs:97:13:97:18 | SSA def(x5) | DefUse.cs:97:13:97:18 | Int32 x5 = ... | | DefUse.cs:98:16:98:17 | SSA phi(x5) | DefUse.cs:98:16:98:17 | access to local variable x5 | | DefUse.cs:101:13:101:23 | SSA def(x5) | DefUse.cs:101:13:101:23 | ... = ... | -| DefUse.cs:104:9:104:15 | SSA def(x5) | DefUse.cs:104:9:104:15 | ... = ... | +| DefUse.cs:104:9:104:15 | SSA def(x5) | DefUse.cs:104:9:104:15 | ... += ... | | DefUse.cs:114:47:114:52 | SSA def(i) | DefUse.cs:114:47:114:52 | ... = ... | | DefUse.cs:116:47:116:51 | SSA def(i) | DefUse.cs:116:47:116:51 | ... = ... | | DefUse.cs:118:45:118:45 | SSA param(i) | DefUse.cs:118:45:118:45 | i | @@ -245,7 +245,7 @@ | Test.cs:14:17:14:19 | SSA def(x) | Test.cs:14:17:14:19 | ++... | | Test.cs:15:13:15:17 | SSA def(z) | Test.cs:15:13:15:17 | ... = ... | | Test.cs:19:13:19:17 | SSA def(y) | Test.cs:19:13:19:17 | ... = ... | -| Test.cs:20:13:20:18 | SSA def(y) | Test.cs:20:13:20:18 | ... = ... | +| Test.cs:20:13:20:18 | SSA def(y) | Test.cs:20:13:20:18 | ... += ... | | Test.cs:21:13:21:22 | SSA def(this.field) | Test.cs:21:13:21:22 | ... = ... | | Test.cs:22:13:22:17 | SSA def(z) | Test.cs:22:13:22:17 | ... = ... | | Test.cs:24:9:24:15 | SSA phi(this.field) | Test.cs:24:9:24:15 | ...; | @@ -255,16 +255,16 @@ | Test.cs:25:16:25:16 | SSA phi(param1) | Test.cs:25:16:25:16 | access to local variable x | | Test.cs:25:16:25:16 | SSA phi(y) | Test.cs:25:16:25:16 | access to local variable x | | Test.cs:27:17:27:24 | SSA def(param1) | Test.cs:27:17:27:24 | ...++ | -| Test.cs:31:13:31:18 | SSA def(y) | Test.cs:31:13:31:18 | ... = ... | +| Test.cs:31:13:31:18 | SSA def(y) | Test.cs:31:13:31:18 | ... -= ... | | Test.cs:33:9:33:19 | SSA phi(param1) | Test.cs:33:9:33:19 | ...; | | Test.cs:34:18:34:22 | SSA def(i) | Test.cs:34:18:34:22 | Int32 i = ... | | Test.cs:34:25:34:25 | SSA phi(i) | Test.cs:34:25:34:25 | access to local variable i | | Test.cs:34:25:34:25 | SSA phi(x) | Test.cs:34:25:34:25 | access to local variable i | | Test.cs:34:33:34:35 | SSA def(i) | Test.cs:34:33:34:35 | ...++ | -| Test.cs:36:13:36:18 | SSA def(x) | Test.cs:36:13:36:18 | ... = ... | +| Test.cs:36:13:36:18 | SSA def(x) | Test.cs:36:13:36:18 | ... += ... | | Test.cs:39:9:42:9 | SSA phi(param1) | Test.cs:39:9:42:9 | foreach (... ... in ...) ... | | Test.cs:39:22:39:22 | SSA def(w) | Test.cs:39:22:39:22 | Int32 w | -| Test.cs:41:13:41:23 | SSA def(param1) | Test.cs:41:13:41:23 | ... = ... | +| Test.cs:41:13:41:23 | SSA def(param1) | Test.cs:41:13:41:23 | ... += ... | | Test.cs:46:10:46:10 | SSA entry def(this.field) | Test.cs:46:10:46:10 | g | | Test.cs:46:16:46:18 | SSA param(in) | Test.cs:46:16:46:18 | in | | Test.cs:50:13:50:20 | SSA def(out) | Test.cs:50:13:50:20 | ... = ... | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected index a8bcd3e4daf9..8582dd1cf6e0 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected @@ -47,7 +47,7 @@ | DefUse.cs:90:13:90:14 | x4 | DefUse.cs:93:15:93:16 | SSA def(x4) | DefUse.cs:93:15:93:16 | access to local variable x4 | | DefUse.cs:97:13:97:14 | x5 | DefUse.cs:97:13:97:18 | SSA def(x5) | DefUse.cs:97:13:97:18 | Int32 x5 = ... | | DefUse.cs:97:13:97:14 | x5 | DefUse.cs:101:13:101:23 | SSA def(x5) | DefUse.cs:101:13:101:23 | ... = ... | -| DefUse.cs:97:13:97:14 | x5 | DefUse.cs:104:9:104:15 | SSA def(x5) | DefUse.cs:104:9:104:15 | ... = ... | +| DefUse.cs:97:13:97:14 | x5 | DefUse.cs:104:9:104:15 | SSA def(x5) | DefUse.cs:104:9:104:15 | ... += ... | | DefUse.cs:114:42:114:42 | i | DefUse.cs:114:47:114:52 | SSA def(i) | DefUse.cs:114:47:114:52 | ... = ... | | DefUse.cs:116:42:116:42 | i | DefUse.cs:116:47:116:51 | SSA def(i) | DefUse.cs:116:47:116:51 | ... = ... | | DefUse.cs:118:45:118:45 | i | DefUse.cs:118:68:118:72 | SSA def(i) | DefUse.cs:118:68:118:72 | ... = ... | @@ -117,17 +117,17 @@ | Properties.cs:78:9:78:15 | this.xs | Properties.cs:81:9:81:22 | SSA def(this.xs) | Properties.cs:81:9:81:22 | ... = ... | | Properties.cs:78:9:78:15 | this.xs | Properties.cs:83:9:83:22 | SSA def(this.xs) | Properties.cs:83:9:83:22 | ... = ... | | Test.cs:5:15:5:20 | param1 | Test.cs:27:17:27:24 | SSA def(param1) | Test.cs:27:17:27:24 | ...++ | -| Test.cs:5:15:5:20 | param1 | Test.cs:41:13:41:23 | SSA def(param1) | Test.cs:41:13:41:23 | ... = ... | +| Test.cs:5:15:5:20 | param1 | Test.cs:41:13:41:23 | SSA def(param1) | Test.cs:41:13:41:23 | ... += ... | | Test.cs:7:9:7:13 | this.field | Test.cs:7:9:7:17 | SSA def(this.field) | Test.cs:7:9:7:17 | ... = ... | | Test.cs:7:9:7:13 | this.field | Test.cs:21:13:21:22 | SSA def(this.field) | Test.cs:21:13:21:22 | ... = ... | | Test.cs:8:13:8:13 | x | Test.cs:8:13:8:17 | SSA def(x) | Test.cs:8:13:8:17 | Int32 x = ... | | Test.cs:8:13:8:13 | x | Test.cs:13:13:13:15 | SSA def(x) | Test.cs:13:13:13:15 | ...++ | | Test.cs:8:13:8:13 | x | Test.cs:14:17:14:19 | SSA def(x) | Test.cs:14:17:14:19 | ++... | -| Test.cs:8:13:8:13 | x | Test.cs:36:13:36:18 | SSA def(x) | Test.cs:36:13:36:18 | ... = ... | +| Test.cs:8:13:8:13 | x | Test.cs:36:13:36:18 | SSA def(x) | Test.cs:36:13:36:18 | ... += ... | | Test.cs:9:13:9:13 | y | Test.cs:14:13:14:19 | SSA def(y) | Test.cs:14:13:14:19 | ... = ... | | Test.cs:9:13:9:13 | y | Test.cs:19:13:19:17 | SSA def(y) | Test.cs:19:13:19:17 | ... = ... | -| Test.cs:9:13:9:13 | y | Test.cs:20:13:20:18 | SSA def(y) | Test.cs:20:13:20:18 | ... = ... | -| Test.cs:9:13:9:13 | y | Test.cs:31:13:31:18 | SSA def(y) | Test.cs:31:13:31:18 | ... = ... | +| Test.cs:9:13:9:13 | y | Test.cs:20:13:20:18 | SSA def(y) | Test.cs:20:13:20:18 | ... += ... | +| Test.cs:9:13:9:13 | y | Test.cs:31:13:31:18 | SSA def(y) | Test.cs:31:13:31:18 | ... -= ... | | Test.cs:10:13:10:13 | z | Test.cs:15:13:15:17 | SSA def(z) | Test.cs:15:13:15:17 | ... = ... | | Test.cs:10:13:10:13 | z | Test.cs:22:13:22:17 | SSA def(z) | Test.cs:22:13:22:17 | ... = ... | | Test.cs:34:18:34:18 | i | Test.cs:34:18:34:22 | SSA def(i) | Test.cs:34:18:34:22 | Int32 i = ... | diff --git a/csharp/ql/test/library-tests/dispatch/CallContext.expected b/csharp/ql/test/library-tests/dispatch/CallContext.expected index 2ef2223ebd7d..09fe22783aaa 100644 --- a/csharp/ql/test/library-tests/dispatch/CallContext.expected +++ b/csharp/ql/test/library-tests/dispatch/CallContext.expected @@ -20,12 +20,12 @@ mayBenefitFromCallContext | ViableCallable.cs:245:9:245:15 | call to method M | | ViableCallable.cs:294:9:294:15 | call to method M | | ViableCallable.cs:297:9:297:20 | call to method M | -| ViableCallable.cs:425:9:425:18 | call to method M | -| ViableCallable.cs:469:9:469:30 | call to method M2 | -| ViableCallable.cs:475:9:475:30 | call to method M2 | -| ViableCallable.cs:577:18:577:22 | call to operator / | -| ViableCallable.cs:580:26:580:30 | call to operator checked / | -| ViableCallable.cs:586:9:586:15 | call to method M12 | -| ViableCallable.cs:619:9:619:13 | call to method M | -| ViableCallable.cs:683:9:683:16 | call to method M | -| ViableCallable.cs:687:9:687:16 | call to method M | +| ViableCallable.cs:426:9:426:18 | call to method M | +| ViableCallable.cs:470:9:470:30 | call to method M2 | +| ViableCallable.cs:476:9:476:30 | call to method M2 | +| ViableCallable.cs:578:18:578:22 | call to operator / | +| ViableCallable.cs:581:26:581:30 | call to operator checked / | +| ViableCallable.cs:587:9:587:15 | call to method M12 | +| ViableCallable.cs:620:9:620:13 | call to method M | +| ViableCallable.cs:684:9:684:16 | call to method M | +| ViableCallable.cs:688:9:688:16 | call to method M | diff --git a/csharp/ql/test/library-tests/dispatch/CallGraph.expected b/csharp/ql/test/library-tests/dispatch/CallGraph.expected index 31e2a99ae24c..b78adb1f1a52 100644 --- a/csharp/ql/test/library-tests/dispatch/CallGraph.expected +++ b/csharp/ql/test/library-tests/dispatch/CallGraph.expected @@ -218,62 +218,62 @@ | ViableCallable.cs:308:17:308:19 | Run | ViableCallable.cs:286:24:286:28 | M`1 | | ViableCallable.cs:308:17:308:19 | Run | ViableCallable.cs:303:26:303:30 | M`1 | | ViableCallable.cs:361:17:361:19 | Run | ViableCallable.cs:359:10:359:10 | M | -| ViableCallable.cs:361:17:361:19 | Run | ViableCallable.cs:375:5:375:7 | C11 | -| ViableCallable.cs:389:10:389:16 | Run`1 | ViableCallable.cs:385:33:385:33 | M | -| ViableCallable.cs:395:10:395:17 | Run2`1 | ViableCallable.cs:389:10:389:16 | Run | -| ViableCallable.cs:400:10:400:13 | Run3 | ViableCallable.cs:395:10:395:17 | Run2 | -| ViableCallable.cs:422:10:422:12 | Run | ViableCallable.cs:213:21:213:27 | Mock | -| ViableCallable.cs:422:10:422:12 | Run | ViableCallable.cs:410:36:410:40 | M`1 | -| ViableCallable.cs:422:10:422:12 | Run | ViableCallable.cs:416:53:416:57 | M`1 | -| ViableCallable.cs:422:10:422:12 | Run | ViableCallable.cs:418:42:418:46 | M`1 | -| ViableCallable.cs:444:22:444:26 | M2`1 | ViableCallable.cs:469:14:469:29 | (...) => ... | -| ViableCallable.cs:444:22:444:26 | M2`1 | ViableCallable.cs:475:14:475:29 | (...) => ... | -| ViableCallable.cs:449:10:449:11 | M1 | ViableCallable.cs:443:23:443:24 | M1 | -| ViableCallable.cs:449:10:449:11 | M1 | ViableCallable.cs:458:23:458:27 | M2`1 | -| ViableCallable.cs:458:23:458:27 | M2`1 | ViableCallable.cs:455:17:455:23 | (...) => ... | -| ViableCallable.cs:458:23:458:27 | M2`1 | ViableCallable.cs:463:14:463:20 | (...) => ... | -| ViableCallable.cs:458:23:458:27 | M2`1 | ViableCallable.cs:469:14:469:29 | (...) => ... | -| ViableCallable.cs:458:23:458:27 | M2`1 | ViableCallable.cs:475:14:475:29 | (...) => ... | -| ViableCallable.cs:460:10:460:14 | M3`1 | ViableCallable.cs:458:23:458:27 | M2`1 | -| ViableCallable.cs:466:10:466:14 | M4`1 | ViableCallable.cs:444:22:444:26 | M2`1 | -| ViableCallable.cs:466:10:466:14 | M4`1 | ViableCallable.cs:458:23:458:27 | M2`1 | -| ViableCallable.cs:472:10:472:14 | M5`1 | ViableCallable.cs:444:22:444:26 | M2`1 | -| ViableCallable.cs:472:10:472:14 | M5`1 | ViableCallable.cs:458:23:458:27 | M2`1 | -| ViableCallable.cs:489:10:489:12 | Run | ViableCallable.cs:482:10:482:11 | M2 | -| ViableCallable.cs:489:10:489:12 | Run | ViableCallable.cs:487:17:487:18 | M1 | -| ViableCallable.cs:506:10:506:12 | Run | ViableCallable.cs:501:32:501:32 | + | -| ViableCallable.cs:506:10:506:12 | Run | ViableCallable.cs:502:40:502:40 | checked + | -| ViableCallable.cs:506:10:506:12 | Run | ViableCallable.cs:503:28:503:35 | explicit conversion | -| ViableCallable.cs:506:10:506:12 | Run | ViableCallable.cs:504:28:504:35 | checked explicit conversion | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:528:39:528:39 | checked - | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:530:31:530:31 | * | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:531:39:531:39 | checked * | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:533:31:533:31 | / | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:534:39:534:39 | checked / | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:538:18:538:20 | M12 | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:540:18:540:20 | M13 | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:545:32:545:32 | + | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:546:40:546:40 | checked + | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:548:32:548:32 | - | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:550:32:550:32 | / | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:551:40:551:40 | checked / | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:553:17:553:19 | M11 | -| ViableCallable.cs:556:10:556:15 | Run`1 | ViableCallable.cs:554:17:554:19 | M12 | -| ViableCallable.cs:610:17:610:23 | Run1`1 | ViableCallable.cs:602:21:602:21 | M | -| ViableCallable.cs:616:17:616:23 | Run2`1 | ViableCallable.cs:602:21:602:21 | M | -| ViableCallable.cs:616:17:616:23 | Run2`1 | ViableCallable.cs:607:21:607:21 | M | -| ViableCallable.cs:657:17:657:20 | Run1 | ViableCallable.cs:635:21:635:21 | M | -| ViableCallable.cs:657:17:657:20 | Run1 | ViableCallable.cs:637:21:637:21 | M | -| ViableCallable.cs:668:17:668:20 | Run2 | ViableCallable.cs:651:21:651:21 | M | -| ViableCallable.cs:668:17:668:20 | Run2 | ViableCallable.cs:654:21:654:21 | M | -| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:635:21:635:21 | M | -| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:637:21:637:21 | M | -| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:646:21:646:21 | M | -| ViableCallable.cs:679:17:679:20 | Run3 | ViableCallable.cs:648:21:648:21 | M | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:704:24:704:31 | Partial1 | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:705:42:705:44 | get_Property | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:705:63:705:65 | set_Property | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:707:49:707:51 | get_Item | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:707:70:707:72 | set_Item | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:708:51:708:53 | add_Event | -| ViableCallable.cs:711:17:711:20 | Run1 | ViableCallable.cs:708:59:708:64 | remove_Event | +| ViableCallable.cs:361:17:361:19 | Run | ViableCallable.cs:376:5:376:7 | C11 | +| ViableCallable.cs:390:10:390:16 | Run`1 | ViableCallable.cs:386:33:386:33 | M | +| ViableCallable.cs:396:10:396:17 | Run2`1 | ViableCallable.cs:390:10:390:16 | Run | +| ViableCallable.cs:401:10:401:13 | Run3 | ViableCallable.cs:396:10:396:17 | Run2 | +| ViableCallable.cs:423:10:423:12 | Run | ViableCallable.cs:213:21:213:27 | Mock | +| ViableCallable.cs:423:10:423:12 | Run | ViableCallable.cs:411:36:411:40 | M`1 | +| ViableCallable.cs:423:10:423:12 | Run | ViableCallable.cs:417:53:417:57 | M`1 | +| ViableCallable.cs:423:10:423:12 | Run | ViableCallable.cs:419:42:419:46 | M`1 | +| ViableCallable.cs:445:22:445:26 | M2`1 | ViableCallable.cs:470:14:470:29 | (...) => ... | +| ViableCallable.cs:445:22:445:26 | M2`1 | ViableCallable.cs:476:14:476:29 | (...) => ... | +| ViableCallable.cs:450:10:450:11 | M1 | ViableCallable.cs:444:23:444:24 | M1 | +| ViableCallable.cs:450:10:450:11 | M1 | ViableCallable.cs:459:23:459:27 | M2`1 | +| ViableCallable.cs:459:23:459:27 | M2`1 | ViableCallable.cs:456:17:456:23 | (...) => ... | +| ViableCallable.cs:459:23:459:27 | M2`1 | ViableCallable.cs:464:14:464:20 | (...) => ... | +| ViableCallable.cs:459:23:459:27 | M2`1 | ViableCallable.cs:470:14:470:29 | (...) => ... | +| ViableCallable.cs:459:23:459:27 | M2`1 | ViableCallable.cs:476:14:476:29 | (...) => ... | +| ViableCallable.cs:461:10:461:14 | M3`1 | ViableCallable.cs:459:23:459:27 | M2`1 | +| ViableCallable.cs:467:10:467:14 | M4`1 | ViableCallable.cs:445:22:445:26 | M2`1 | +| ViableCallable.cs:467:10:467:14 | M4`1 | ViableCallable.cs:459:23:459:27 | M2`1 | +| ViableCallable.cs:473:10:473:14 | M5`1 | ViableCallable.cs:445:22:445:26 | M2`1 | +| ViableCallable.cs:473:10:473:14 | M5`1 | ViableCallable.cs:459:23:459:27 | M2`1 | +| ViableCallable.cs:490:10:490:12 | Run | ViableCallable.cs:483:10:483:11 | M2 | +| ViableCallable.cs:490:10:490:12 | Run | ViableCallable.cs:488:17:488:18 | M1 | +| ViableCallable.cs:507:10:507:12 | Run | ViableCallable.cs:502:32:502:32 | + | +| ViableCallable.cs:507:10:507:12 | Run | ViableCallable.cs:503:40:503:40 | checked + | +| ViableCallable.cs:507:10:507:12 | Run | ViableCallable.cs:504:28:504:35 | explicit conversion | +| ViableCallable.cs:507:10:507:12 | Run | ViableCallable.cs:505:28:505:35 | checked explicit conversion | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:529:39:529:39 | checked - | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:531:31:531:31 | * | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:532:39:532:39 | checked * | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:534:31:534:31 | / | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:535:39:535:39 | checked / | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:539:18:539:20 | M12 | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:541:18:541:20 | M13 | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:546:32:546:32 | + | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:547:40:547:40 | checked + | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:549:32:549:32 | - | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:551:32:551:32 | / | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:552:40:552:40 | checked / | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:554:17:554:19 | M11 | +| ViableCallable.cs:557:10:557:15 | Run`1 | ViableCallable.cs:555:17:555:19 | M12 | +| ViableCallable.cs:611:17:611:23 | Run1`1 | ViableCallable.cs:603:21:603:21 | M | +| ViableCallable.cs:617:17:617:23 | Run2`1 | ViableCallable.cs:603:21:603:21 | M | +| ViableCallable.cs:617:17:617:23 | Run2`1 | ViableCallable.cs:608:21:608:21 | M | +| ViableCallable.cs:658:17:658:20 | Run1 | ViableCallable.cs:636:21:636:21 | M | +| ViableCallable.cs:658:17:658:20 | Run1 | ViableCallable.cs:638:21:638:21 | M | +| ViableCallable.cs:669:17:669:20 | Run2 | ViableCallable.cs:652:21:652:21 | M | +| ViableCallable.cs:669:17:669:20 | Run2 | ViableCallable.cs:655:21:655:21 | M | +| ViableCallable.cs:680:17:680:20 | Run3 | ViableCallable.cs:636:21:636:21 | M | +| ViableCallable.cs:680:17:680:20 | Run3 | ViableCallable.cs:638:21:638:21 | M | +| ViableCallable.cs:680:17:680:20 | Run3 | ViableCallable.cs:647:21:647:21 | M | +| ViableCallable.cs:680:17:680:20 | Run3 | ViableCallable.cs:649:21:649:21 | M | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:705:24:705:31 | Partial1 | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:706:42:706:44 | get_Property | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:706:63:706:65 | set_Property | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:708:49:708:51 | get_Item | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:708:70:708:72 | set_Item | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:709:51:709:53 | add_Event | +| ViableCallable.cs:712:17:712:20 | Run1 | ViableCallable.cs:709:59:709:64 | remove_Event | diff --git a/csharp/ql/test/library-tests/dispatch/GetADynamicTarget.expected b/csharp/ql/test/library-tests/dispatch/GetADynamicTarget.expected index 84dc17b073aa..82376653095b 100644 --- a/csharp/ql/test/library-tests/dispatch/GetADynamicTarget.expected +++ b/csharp/ql/test/library-tests/dispatch/GetADynamicTarget.expected @@ -467,61 +467,61 @@ | ViableCallable.cs:311:9:311:15 | call to method M | C7`1.M(T1, T3) | | ViableCallable.cs:314:9:314:20 | call to method M | C7`1.M(T1, T3) | | ViableCallable.cs:317:9:317:20 | call to method M | C6.M(T1, T3) | -| ViableCallable.cs:367:9:367:14 | dynamic call to method M | C11.M(dynamic) | -| ViableCallable.cs:369:9:369:18 | dynamic object creation of type C11 | C11.C11(C11) | -| ViableCallable.cs:392:9:392:13 | call to method M | C12+C13.M() | -| ViableCallable.cs:397:9:397:14 | call to method Run | C12.Run(T2) | -| ViableCallable.cs:402:9:402:23 | call to method Run2 | C12.Run2(C13) | -| ViableCallable.cs:425:9:425:18 | call to method M | C15+A1.M() | -| ViableCallable.cs:425:9:425:18 | call to method M | C15+A4.M() | -| ViableCallable.cs:425:9:425:18 | call to method M | C15+A5.M() | -| ViableCallable.cs:429:9:429:19 | call to method M | C15+A1.M() | -| ViableCallable.cs:433:9:433:21 | call to method M | C15+A4.M() | -| ViableCallable.cs:435:13:435:37 | call to method Mock | ViableCallable.Mock() | -| ViableCallable.cs:437:9:437:21 | call to method M | C15+A4.M() | -| ViableCallable.cs:437:9:437:21 | call to method M | C15+A5.M() | -| ViableCallable.cs:452:9:452:19 | call to method M1 | C16.M1(string) | -| ViableCallable.cs:455:9:455:24 | call to method M2 | C17.M2(Func) | -| ViableCallable.cs:463:9:463:21 | call to method M2 | C17.M2(Func) | -| ViableCallable.cs:469:9:469:30 | call to method M2 | C16.M2(Func) | -| ViableCallable.cs:469:9:469:30 | call to method M2 | C17.M2(Func) | -| ViableCallable.cs:475:9:475:30 | call to method M2 | C16.M2(Func) | -| ViableCallable.cs:475:9:475:30 | call to method M2 | C17.M2(Func) | -| ViableCallable.cs:492:9:492:14 | call to method M1 | C18.M1() | -| ViableCallable.cs:495:9:495:14 | call to method M2 | I2.M2() | -| ViableCallable.cs:509:18:509:22 | call to operator + | C19.+(C19, C19) | -| ViableCallable.cs:512:26:512:30 | call to operator checked + | C19.checked +(C19, C19) | -| ViableCallable.cs:515:18:515:23 | call to operator explicit conversion | C19.explicit conversion(C19) | -| ViableCallable.cs:518:26:518:31 | call to operator checked explicit conversion | C19.checked explicit conversion(C19) | -| ViableCallable.cs:559:18:559:22 | call to operator + | C20.+(C20, C20) | -| ViableCallable.cs:562:26:562:30 | call to operator checked + | C20.checked +(C20, C20) | -| ViableCallable.cs:565:18:565:22 | call to operator - | C20.-(C20, C20) | -| ViableCallable.cs:568:26:568:30 | call to operator checked - | I3.checked -(T, T) | -| ViableCallable.cs:571:18:571:22 | call to operator * | I3.*(T, T) | -| ViableCallable.cs:574:26:574:30 | call to operator checked * | I3.checked *(T, T) | -| ViableCallable.cs:577:18:577:22 | call to operator / | C20./(C20, C20) | -| ViableCallable.cs:577:18:577:22 | call to operator / | I3./(T, T) | -| ViableCallable.cs:580:26:580:30 | call to operator checked / | C20.checked /(C20, C20) | -| ViableCallable.cs:580:26:580:30 | call to operator checked / | I3.checked /(T, T) | -| ViableCallable.cs:583:9:583:15 | call to method M11 | C20.M11() | -| ViableCallable.cs:586:9:586:15 | call to method M12 | C20.M12() | -| ViableCallable.cs:586:9:586:15 | call to method M12 | I3.M12() | -| ViableCallable.cs:589:9:589:15 | call to method M13 | I3.M13() | -| ViableCallable.cs:613:9:613:13 | call to method M | C21+A1.M() | -| ViableCallable.cs:619:9:619:13 | call to method M | C21+A1.M() | -| ViableCallable.cs:619:9:619:13 | call to method M | C21+A2.M() | -| ViableCallable.cs:661:9:661:16 | call to method M | C22+TestOverloadResolution1.M(Int32[]) | -| ViableCallable.cs:665:9:665:16 | call to method M | C22+TestOverloadResolution1.M(List) | -| ViableCallable.cs:672:9:672:16 | call to method M | C22+TestOverloadResolution2.M(ReadOnlySpan) | -| ViableCallable.cs:676:9:676:16 | call to method M | C22+TestOverloadResolution2.M(IEnumerable) | -| ViableCallable.cs:683:9:683:16 | call to method M | C22+TestOverloadResolution1.M(Int32[]) | -| ViableCallable.cs:683:9:683:16 | call to method M | C22+TestOverloadResolution2.M(Int32[]) | -| ViableCallable.cs:687:9:687:16 | call to method M | C22+TestOverloadResolution1.M(List) | -| ViableCallable.cs:687:9:687:16 | call to method M | C22+TestOverloadResolution2.M(List) | -| ViableCallable.cs:716:9:716:18 | access to property Property | C23+Partial1.set_Property(object) | -| ViableCallable.cs:719:13:719:22 | access to property Property | C23+Partial1.get_Property() | -| ViableCallable.cs:722:9:722:12 | access to indexer | C23+Partial1.set_Item(int, object) | -| ViableCallable.cs:725:13:725:16 | access to indexer | C23+Partial1.get_Item(int) | -| ViableCallable.cs:728:9:728:15 | access to event Event | C23+Partial1.add_Event(EventHandler) | -| ViableCallable.cs:731:9:731:15 | access to event Event | C23+Partial1.remove_Event(EventHandler) | -| ViableCallable.cs:734:18:734:43 | object creation of type Partial1 | C23+Partial1.Partial1(object) | +| ViableCallable.cs:368:9:368:14 | dynamic call to method M | C11.M(dynamic) | +| ViableCallable.cs:370:9:370:18 | dynamic object creation of type C11 | C11.C11(C11) | +| ViableCallable.cs:393:9:393:13 | call to method M | C12+C13.M() | +| ViableCallable.cs:398:9:398:14 | call to method Run | C12.Run(T2) | +| ViableCallable.cs:403:9:403:23 | call to method Run2 | C12.Run2(C13) | +| ViableCallable.cs:426:9:426:18 | call to method M | C15+A1.M() | +| ViableCallable.cs:426:9:426:18 | call to method M | C15+A4.M() | +| ViableCallable.cs:426:9:426:18 | call to method M | C15+A5.M() | +| ViableCallable.cs:430:9:430:19 | call to method M | C15+A1.M() | +| ViableCallable.cs:434:9:434:21 | call to method M | C15+A4.M() | +| ViableCallable.cs:436:13:436:37 | call to method Mock | ViableCallable.Mock() | +| ViableCallable.cs:438:9:438:21 | call to method M | C15+A4.M() | +| ViableCallable.cs:438:9:438:21 | call to method M | C15+A5.M() | +| ViableCallable.cs:453:9:453:19 | call to method M1 | C16.M1(string) | +| ViableCallable.cs:456:9:456:24 | call to method M2 | C17.M2(Func) | +| ViableCallable.cs:464:9:464:21 | call to method M2 | C17.M2(Func) | +| ViableCallable.cs:470:9:470:30 | call to method M2 | C16.M2(Func) | +| ViableCallable.cs:470:9:470:30 | call to method M2 | C17.M2(Func) | +| ViableCallable.cs:476:9:476:30 | call to method M2 | C16.M2(Func) | +| ViableCallable.cs:476:9:476:30 | call to method M2 | C17.M2(Func) | +| ViableCallable.cs:493:9:493:14 | call to method M1 | C18.M1() | +| ViableCallable.cs:496:9:496:14 | call to method M2 | I2.M2() | +| ViableCallable.cs:510:18:510:22 | call to operator + | C19.+(C19, C19) | +| ViableCallable.cs:513:26:513:30 | call to operator checked + | C19.checked +(C19, C19) | +| ViableCallable.cs:516:18:516:23 | call to operator explicit conversion | C19.explicit conversion(C19) | +| ViableCallable.cs:519:26:519:31 | call to operator checked explicit conversion | C19.checked explicit conversion(C19) | +| ViableCallable.cs:560:18:560:22 | call to operator + | C20.+(C20, C20) | +| ViableCallable.cs:563:26:563:30 | call to operator checked + | C20.checked +(C20, C20) | +| ViableCallable.cs:566:18:566:22 | call to operator - | C20.-(C20, C20) | +| ViableCallable.cs:569:26:569:30 | call to operator checked - | I3.checked -(T, T) | +| ViableCallable.cs:572:18:572:22 | call to operator * | I3.*(T, T) | +| ViableCallable.cs:575:26:575:30 | call to operator checked * | I3.checked *(T, T) | +| ViableCallable.cs:578:18:578:22 | call to operator / | C20./(C20, C20) | +| ViableCallable.cs:578:18:578:22 | call to operator / | I3./(T, T) | +| ViableCallable.cs:581:26:581:30 | call to operator checked / | C20.checked /(C20, C20) | +| ViableCallable.cs:581:26:581:30 | call to operator checked / | I3.checked /(T, T) | +| ViableCallable.cs:584:9:584:15 | call to method M11 | C20.M11() | +| ViableCallable.cs:587:9:587:15 | call to method M12 | C20.M12() | +| ViableCallable.cs:587:9:587:15 | call to method M12 | I3.M12() | +| ViableCallable.cs:590:9:590:15 | call to method M13 | I3.M13() | +| ViableCallable.cs:614:9:614:13 | call to method M | C21+A1.M() | +| ViableCallable.cs:620:9:620:13 | call to method M | C21+A1.M() | +| ViableCallable.cs:620:9:620:13 | call to method M | C21+A2.M() | +| ViableCallable.cs:662:9:662:16 | call to method M | C22+TestOverloadResolution1.M(Int32[]) | +| ViableCallable.cs:666:9:666:16 | call to method M | C22+TestOverloadResolution1.M(List) | +| ViableCallable.cs:673:9:673:16 | call to method M | C22+TestOverloadResolution2.M(ReadOnlySpan) | +| ViableCallable.cs:677:9:677:16 | call to method M | C22+TestOverloadResolution2.M(IEnumerable) | +| ViableCallable.cs:684:9:684:16 | call to method M | C22+TestOverloadResolution1.M(Int32[]) | +| ViableCallable.cs:684:9:684:16 | call to method M | C22+TestOverloadResolution2.M(Int32[]) | +| ViableCallable.cs:688:9:688:16 | call to method M | C22+TestOverloadResolution1.M(List) | +| ViableCallable.cs:688:9:688:16 | call to method M | C22+TestOverloadResolution2.M(List) | +| ViableCallable.cs:717:9:717:18 | access to property Property | C23+Partial1.set_Property(object) | +| ViableCallable.cs:720:13:720:22 | access to property Property | C23+Partial1.get_Property() | +| ViableCallable.cs:723:9:723:12 | access to indexer | C23+Partial1.set_Item(int, object) | +| ViableCallable.cs:726:13:726:16 | access to indexer | C23+Partial1.get_Item(int) | +| ViableCallable.cs:729:9:729:15 | access to event Event | C23+Partial1.add_Event(EventHandler) | +| ViableCallable.cs:732:9:732:15 | access to event Event | C23+Partial1.remove_Event(EventHandler) | +| ViableCallable.cs:735:18:735:43 | object creation of type Partial1 | C23+Partial1.Partial1(object) | diff --git a/csharp/ql/test/library-tests/dispatch/ViableCallable.cs b/csharp/ql/test/library-tests/dispatch/ViableCallable.cs index dee8d9b0d1d6..61dfef7444c3 100644 --- a/csharp/ql/test/library-tests/dispatch/ViableCallable.cs +++ b/csharp/ql/test/library-tests/dispatch/ViableCallable.cs @@ -362,6 +362,7 @@ public void Run() { dynamic d = this; int x = 0; + // Viable callables: int.+ x += 42; // Viable callables: C11.M() d.M(x); diff --git a/csharp/ql/test/library-tests/dispatch/viableCallable.expected b/csharp/ql/test/library-tests/dispatch/viableCallable.expected index c4abbbd2e582..8791bd0ae41c 100644 --- a/csharp/ql/test/library-tests/dispatch/viableCallable.expected +++ b/csharp/ql/test/library-tests/dispatch/viableCallable.expected @@ -271,35 +271,36 @@ | ViableCallable.cs:311:9:311:15 | call to method M | M`1 | C7`1 | | ViableCallable.cs:314:9:314:20 | call to method M | M`1 | C7`1 | | ViableCallable.cs:317:9:317:20 | call to method M | M`1 | C6`2 | -| ViableCallable.cs:367:9:367:14 | dynamic call to method M | M | C11 | -| ViableCallable.cs:369:9:369:18 | dynamic object creation of type C11 | C11 | C11 | -| ViableCallable.cs:392:9:392:13 | call to method M | M | C13 | -| ViableCallable.cs:425:9:425:18 | call to method M | M`1 | A1 | -| ViableCallable.cs:425:9:425:18 | call to method M | M`1 | A4 | -| ViableCallable.cs:425:9:425:18 | call to method M | M`1 | A5 | -| ViableCallable.cs:427:13:427:20 | object creation of type A3 | A3 | A3 | -| ViableCallable.cs:429:9:429:19 | call to method M | M`1 | A1 | -| ViableCallable.cs:431:13:431:20 | object creation of type A4 | A4 | A4 | -| ViableCallable.cs:433:9:433:21 | call to method M | M`1 | A4 | -| ViableCallable.cs:437:9:437:21 | call to method M | M`1 | A4 | -| ViableCallable.cs:437:9:437:21 | call to method M | M`1 | A5 | -| ViableCallable.cs:492:9:492:14 | call to method M1 | M1 | C18 | -| ViableCallable.cs:495:9:495:14 | call to method M2 | M2 | I2 | -| ViableCallable.cs:509:18:509:22 | call to operator + | + | C19 | -| ViableCallable.cs:512:26:512:30 | call to operator checked + | checked + | C19 | -| ViableCallable.cs:515:18:515:23 | call to operator explicit conversion | explicit conversion | C19 | -| ViableCallable.cs:518:26:518:31 | call to operator checked explicit conversion | checked explicit conversion | C19 | -| ViableCallable.cs:559:18:559:22 | call to operator + | + | C20 | -| ViableCallable.cs:562:26:562:30 | call to operator checked + | checked + | C20 | -| ViableCallable.cs:565:18:565:22 | call to operator - | - | C20 | -| ViableCallable.cs:568:26:568:30 | call to operator checked - | checked - | I3`1 | -| ViableCallable.cs:571:18:571:22 | call to operator * | * | I3`1 | -| ViableCallable.cs:574:26:574:30 | call to operator checked * | checked * | I3`1 | -| ViableCallable.cs:577:18:577:22 | call to operator / | / | C20 | -| ViableCallable.cs:577:18:577:22 | call to operator / | / | I3`1 | -| ViableCallable.cs:580:26:580:30 | call to operator checked / | checked / | C20 | -| ViableCallable.cs:580:26:580:30 | call to operator checked / | checked / | I3`1 | -| ViableCallable.cs:583:9:583:15 | call to method M11 | M11 | C20 | -| ViableCallable.cs:586:9:586:15 | call to method M12 | M12 | C20 | -| ViableCallable.cs:586:9:586:15 | call to method M12 | M12 | I3`1 | -| ViableCallable.cs:589:9:589:15 | call to method M13 | M13 | I3`1 | +| ViableCallable.cs:366:9:366:15 | ... += ... | + | Int32 | +| ViableCallable.cs:368:9:368:14 | dynamic call to method M | M | C11 | +| ViableCallable.cs:370:9:370:18 | dynamic object creation of type C11 | C11 | C11 | +| ViableCallable.cs:393:9:393:13 | call to method M | M | C13 | +| ViableCallable.cs:426:9:426:18 | call to method M | M`1 | A1 | +| ViableCallable.cs:426:9:426:18 | call to method M | M`1 | A4 | +| ViableCallable.cs:426:9:426:18 | call to method M | M`1 | A5 | +| ViableCallable.cs:428:13:428:20 | object creation of type A3 | A3 | A3 | +| ViableCallable.cs:430:9:430:19 | call to method M | M`1 | A1 | +| ViableCallable.cs:432:13:432:20 | object creation of type A4 | A4 | A4 | +| ViableCallable.cs:434:9:434:21 | call to method M | M`1 | A4 | +| ViableCallable.cs:438:9:438:21 | call to method M | M`1 | A4 | +| ViableCallable.cs:438:9:438:21 | call to method M | M`1 | A5 | +| ViableCallable.cs:493:9:493:14 | call to method M1 | M1 | C18 | +| ViableCallable.cs:496:9:496:14 | call to method M2 | M2 | I2 | +| ViableCallable.cs:510:18:510:22 | call to operator + | + | C19 | +| ViableCallable.cs:513:26:513:30 | call to operator checked + | checked + | C19 | +| ViableCallable.cs:516:18:516:23 | call to operator explicit conversion | explicit conversion | C19 | +| ViableCallable.cs:519:26:519:31 | call to operator checked explicit conversion | checked explicit conversion | C19 | +| ViableCallable.cs:560:18:560:22 | call to operator + | + | C20 | +| ViableCallable.cs:563:26:563:30 | call to operator checked + | checked + | C20 | +| ViableCallable.cs:566:18:566:22 | call to operator - | - | C20 | +| ViableCallable.cs:569:26:569:30 | call to operator checked - | checked - | I3`1 | +| ViableCallable.cs:572:18:572:22 | call to operator * | * | I3`1 | +| ViableCallable.cs:575:26:575:30 | call to operator checked * | checked * | I3`1 | +| ViableCallable.cs:578:18:578:22 | call to operator / | / | C20 | +| ViableCallable.cs:578:18:578:22 | call to operator / | / | I3`1 | +| ViableCallable.cs:581:26:581:30 | call to operator checked / | checked / | C20 | +| ViableCallable.cs:581:26:581:30 | call to operator checked / | checked / | I3`1 | +| ViableCallable.cs:584:9:584:15 | call to method M11 | M11 | C20 | +| ViableCallable.cs:587:9:587:15 | call to method M12 | M12 | C20 | +| ViableCallable.cs:587:9:587:15 | call to method M12 | M12 | I3`1 | +| ViableCallable.cs:590:9:590:15 | call to method M13 | M13 | I3`1 | diff --git a/csharp/ql/test/library-tests/dynamic/DynamicOperatorCall.expected b/csharp/ql/test/library-tests/dynamic/DynamicOperatorCall.expected index 6c0a054c84ab..6e98bffaf6f8 100644 --- a/csharp/ql/test/library-tests/dynamic/DynamicOperatorCall.expected +++ b/csharp/ql/test/library-tests/dynamic/DynamicOperatorCall.expected @@ -1,6 +1,6 @@ | dynamic.cs:35:13:35:14 | dynamic call to operator - | - | 0 | dynamic.cs:35:14:35:14 | access to local variable d | | dynamic.cs:36:13:36:17 | dynamic call to operator + | + | 0 | dynamic.cs:36:13:36:13 | access to local variable d | | dynamic.cs:36:13:36:17 | dynamic call to operator + | + | 1 | dynamic.cs:36:17:36:17 | access to local variable d | -| dynamic.cs:37:9:37:14 | dynamic call to operator + | + | 0 | dynamic.cs:37:9:37:9 | access to local variable d | -| dynamic.cs:37:9:37:14 | dynamic call to operator + | + | 1 | dynamic.cs:37:14:37:14 | access to local variable d | +| dynamic.cs:37:9:37:14 | ... += ... | + | 0 | dynamic.cs:37:9:37:9 | access to local variable d | +| dynamic.cs:37:9:37:14 | ... += ... | + | 1 | dynamic.cs:37:14:37:14 | access to local variable d | | dynamic.cs:47:9:47:11 | dynamic call to operator ++ | ++ | 0 | dynamic.cs:47:9:47:9 | access to local variable d | diff --git a/csharp/ql/test/library-tests/dynamic/PrintAst.expected b/csharp/ql/test/library-tests/dynamic/PrintAst.expected index 3bde4d42d862..3526e0b6bf54 100644 --- a/csharp/ql/test/library-tests/dynamic/PrintAst.expected +++ b/csharp/ql/test/library-tests/dynamic/PrintAst.expected @@ -105,12 +105,12 @@ dynamic.cs: # 35| 15: [ExprStmt] ...; # 35| 0: [AssignExpr] ... = ... # 35| 0: [LocalVariableAccess] access to local variable d -# 35| 1: [DynamicOperatorCall] dynamic call to operator - +# 35| 1: [OperatorCall] dynamic call to operator - # 35| 0: [LocalVariableAccess] access to local variable d # 36| 16: [ExprStmt] ...; # 36| 0: [AssignExpr] ... = ... # 36| 0: [LocalVariableAccess] access to local variable d -# 36| 1: [DynamicOperatorCall] dynamic call to operator + +# 36| 1: [OperatorCall] dynamic call to operator + # 36| 0: [LocalVariableAccess] access to local variable d # 36| 1: [LocalVariableAccess] access to local variable d # 37| 17: [ExprStmt] ...; @@ -141,7 +141,7 @@ dynamic.cs: # 44| 0: [PostIncrExpr] ...++ # 44| 0: [LocalVariableAccess] access to local variable i # 47| 23: [ExprStmt] ...; -# 47| 0: [DynamicOperatorCall] dynamic call to operator ++ +# 47| 0: [OperatorCall] dynamic call to operator ++ # 47| 0: [LocalVariableAccess] access to local variable d # 50| 24: [ExprStmt] ...; # 50| 0: [PostIncrExpr] ...++ diff --git a/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected b/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected index 6271d6276c72..2073fce06a77 100644 --- a/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected +++ b/csharp/ql/test/query-tests/Dead Code/DeadStoreOfLocal/DeadStoreOfLocal.expected @@ -1,7 +1,7 @@ | DeadStoreOfLocal.cs:12:13:12:20 | Int32 x = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:12:13:12:13 | x | x | | DeadStoreOfLocal.cs:19:21:19:25 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:18:13:18:13 | x | x | | DeadStoreOfLocal.cs:44:13:44:20 | Int32 x = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:44:13:44:13 | x | x | -| DeadStoreOfLocal.cs:50:9:50:14 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:49:13:49:13 | x | x | +| DeadStoreOfLocal.cs:50:9:50:14 | ... += ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:49:13:49:13 | x | x | | DeadStoreOfLocal.cs:56:9:56:11 | ...++ | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:55:13:55:13 | x | x | | DeadStoreOfLocal.cs:82:22:82:24 | String val | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:82:22:82:24 | val | val | | DeadStoreOfLocal.cs:101:13:101:37 | ... = ... | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.cs:94:40:94:44 | extra | extra | diff --git a/csharp/ql/test/query-tests/Nullness/NullCheck.expected b/csharp/ql/test/query-tests/Nullness/NullCheck.expected index 2b6962b51c01..b6356b0e4135 100644 --- a/csharp/ql/test/query-tests/Nullness/NullCheck.expected +++ b/csharp/ql/test/query-tests/Nullness/NullCheck.expected @@ -128,9 +128,6 @@ | E.cs:382:58:382:67 | ... == ... | E.cs:382:58:382:59 | access to parameter e2 | | E.cs:384:13:384:22 | ... == ... | E.cs:384:13:384:14 | access to parameter e1 | | E.cs:384:27:384:36 | ... == ... | E.cs:384:27:384:28 | access to parameter e2 | -| E.cs:391:9:391:9 | access to parameter i | E.cs:391:9:391:9 | access to parameter i | -| E.cs:397:9:397:13 | access to parameter color | E.cs:397:9:397:13 | access to parameter color | -| E.cs:404:9:404:9 | access to local variable i | E.cs:404:9:404:9 | access to local variable i | | E.cs:422:13:422:22 | access to property HasValue | E.cs:422:13:422:13 | access to parameter i | | E.cs:429:13:429:22 | access to property HasValue | E.cs:429:13:429:13 | access to parameter i | | E.cs:437:23:437:31 | ... is ... | E.cs:437:23:437:23 | access to parameter s | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected b/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected index 2477cd600e0f..fc8933cac930 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected +++ b/csharp/ql/test/query-tests/Security Features/CWE-112/MissingXMLValidation.expected @@ -3,7 +3,6 @@ | MissingXMLValidation.cs:21:26:21:58 | object creation of type StringReader | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:21:26:21:58 | object creation of type StringReader | This XML processing depends on a $@ without validation because the 'XmlReaderSettings' instance does not specify the 'ValidationType' as 'Schema'. | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString | user-provided value | | MissingXMLValidation.cs:27:26:27:58 | object creation of type StringReader | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:27:26:27:58 | object creation of type StringReader | This XML processing depends on a $@ without validation because the 'XmlReaderSettings' instance does not specify the 'ValidationType' as 'Schema'. | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString | user-provided value | | MissingXMLValidation.cs:45:26:45:58 | object creation of type StringReader | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:45:26:45:58 | object creation of type StringReader | This XML processing depends on a $@ without validation because the 'XmlReaderSettings' instance specifies 'ProcessInlineSchema'. | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString | user-provided value | -| MissingXMLValidation.cs:45:26:45:58 | object creation of type StringReader | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString : NameValueCollection | MissingXMLValidation.cs:45:26:45:58 | object creation of type StringReader | This XML processing depends on a $@ without validation because the 'XmlReaderSettings' instance specifies 'ProcessSchemaLocation'. | MissingXMLValidation.cs:12:34:12:56 | access to property QueryString | user-provided value | edges | MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:16:43:16:57 | access to local variable userProvidedXml : String | provenance | | | MissingXMLValidation.cs:12:16:12:30 | access to local variable userProvidedXml : String | MissingXMLValidation.cs:21:43:21:57 | access to local variable userProvidedXml : String | provenance | |