Skip to content

Commit c38ad4a

Browse files
committed
C#: Add data flow tests for implicit index usage.
1 parent 0430a9e commit c38ad4a

File tree

2 files changed

+820
-731
lines changed

2 files changed

+820
-731
lines changed

csharp/ql/test/library-tests/dataflow/collections/CollectionFlow.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ public static void Sink<T>(T t) { }
1313

1414
public static void SinkElem<T>(T[] ts) => Sink(ts[0]);
1515

16+
public static void SinkLastElem<T>(T[] ts) => Sink(ts[^1]);
17+
1618
public static void SinkListElem<T>(IList<T> list) => Sink(list[0]);
1719

1820
public static void SinkDictValue<T>(IDictionary<int, T> dict) => Sink(dict[0]);
@@ -21,6 +23,8 @@ public static void Sink<T>(T t) { }
2123

2224
public static T First<T>(T[] ts) => ts[0];
2325

26+
public static T Last<T>(T[] ts) => ts[^1];
27+
2428
public static T ListFirst<T>(IList<T> list) => list[0];
2529

2630
public static T DictIndexZero<T>(IDictionary<int, T> dict) => dict[0];
@@ -73,6 +77,15 @@ public void ArrayInitializerCSharp6NoFlow(A other)
7377
Sink(First(c.As)); // no flow
7478
}
7579

80+
public void ArrayInitializerImplicitIndexFlow()
81+
{
82+
var a = new A();
83+
var c = new CollectionFlow() { As = { [^1] = a } };
84+
Sink(c.As[^1]); // flow
85+
SinkLastElem(c.As); // flow
86+
Sink(Last(c.As)); // flow
87+
}
88+
7689
public void ArrayAssignmentFlow()
7790
{
7891
var a = new A();
@@ -93,6 +106,16 @@ public void ArrayAssignmentNoFlow(A other)
93106
Sink(First(@as)); // no flow
94107
}
95108

109+
public void ArrayAssignmentImplicitIndexFlow()
110+
{
111+
var a = new A();
112+
var @as = new A[1];
113+
@as[^1] = a;
114+
Sink(@as[^1]); // flow
115+
SinkLastElem(@as); // flow
116+
Sink(Last(@as)); // flow
117+
}
118+
96119
public void ListAssignmentFlow()
97120
{
98121
var a = new A();

0 commit comments

Comments
 (0)