Swift: add flow through for-in loops

This commit is contained in:
Robert Marsh
2023-09-08 20:00:27 +00:00
parent a3e250aef5
commit 988a871999
5 changed files with 134 additions and 3 deletions

View File

@@ -888,6 +888,13 @@ predicate readStep(Node node1, ContentSet c, Node node2) {
node1.(DictionarySubscriptNode).getExpr() = subscript and
c.isSingleton(any(Content::TupleContent tc | tc.getIndex() = 1))
)
// read of an optional into the loop variable via foreach
or
exists(ForEachStmt for |
node1.asExpr() = for.getNextCall() and
node2.asPattern() = for.getPattern() and
c instanceof OptionalSomeContentSet
)
or
FlowSummaryImpl::Private::Steps::summaryReadStep(node1.(FlowSummaryNode).getSummaryNode(), c,
node2.(FlowSummaryNode).getSummaryNode())

View File

@@ -29,6 +29,8 @@ private class SequenceSummaries extends SummaryModelCsv {
";Sequence;true;withContiguousStorageIfAvailable(_:);;;Argument[-1].ArrayElement;Argument[0].Parameter[0].CollectionElement;value",
";Sequence;true;withContiguousStorageIfAvailable(_:);;;Argument[-1].CollectionElement;Argument[0].Parameter[0].CollectionElement;value",
";Sequence;true;withContiguousStorageIfAvailable(_:);;;Argument[0].ReturnValue;ReturnValue.OptionalSome;value",
";Sequence;true;makeIterator();;;Argument[-1].CollectionElement;ReturnValue.CollectionElement;value",
";IteratorProtocol;true;next();;;Argument[-1].CollectionElement;ReturnValue.OptionalSome;value"
]
}
}

View File

@@ -443,15 +443,27 @@ edges
| test.swift:774:16:774:23 | call to source() | test.swift:774:5:774:12 | DictionarySubscriptNode [Tuple element at index 1] |
| test.swift:776:15:776:15 | dict1 [Collection element, Tuple element at index 1] | test.swift:776:15:776:22 | DictionarySubscriptNode [Tuple element at index 1] |
| test.swift:776:15:776:22 | DictionarySubscriptNode [Tuple element at index 1] | test.swift:776:15:776:22 | ...[...] |
| test.swift:778:17:778:29 | [...] [Collection element, Tuple element at index 0] | test.swift:781:25:781:25 | dict2 [Collection element, Tuple element at index 0] |
| test.swift:778:18:778:25 | call to source() | test.swift:778:18:778:28 | (...) [Tuple element at index 0] |
| test.swift:778:18:778:28 | (...) [Tuple element at index 0] | test.swift:778:17:778:29 | [...] [Collection element, Tuple element at index 0] |
| test.swift:781:5:781:5 | $generator [Collection element, Tuple element at index 0] | test.swift:781:5:781:5 | call to next() [some:0, Tuple element at index 0] |
| test.swift:781:5:781:5 | call to next() [some:0, Tuple element at index 0] | test.swift:781:9:781:20 | (...) [Tuple element at index 0] |
| test.swift:781:9:781:20 | (...) [Tuple element at index 0] | test.swift:781:10:781:10 | key |
| test.swift:781:10:781:10 | key | test.swift:782:19:782:19 | key |
| test.swift:781:25:781:25 | call to makeIterator() [Collection element, Tuple element at index 0] | test.swift:781:5:781:5 | $generator [Collection element, Tuple element at index 0] |
| test.swift:781:25:781:25 | dict2 [Collection element, Tuple element at index 0] | test.swift:781:25:781:25 | call to makeIterator() [Collection element, Tuple element at index 0] |
| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | test.swift:787:15:787:15 | dict3 [Collection element, Tuple element at index 1] |
| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | test.swift:789:5:789:5 | dict3 [Collection element, Tuple element at index 1] |
| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | test.swift:792:15:792:15 | dict3 [Collection element, Tuple element at index 1] |
| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 1] |
| test.swift:786:18:786:28 | (...) [Tuple element at index 1] | test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] |
| test.swift:786:21:786:28 | call to source() | test.swift:786:18:786:28 | (...) [Tuple element at index 1] |
| test.swift:787:15:787:15 | dict3 [Collection element, Tuple element at index 1] | test.swift:787:15:787:22 | DictionarySubscriptNode [Tuple element at index 1] |
| test.swift:787:15:787:22 | DictionarySubscriptNode [Tuple element at index 1] | test.swift:787:15:787:22 | ...[...] |
| test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 0] | test.swift:791:15:791:15 | dict3 [Collection element, Tuple element at index 0] |
| test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 0] | test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 0] |
| test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 1] | test.swift:792:15:792:15 | dict3 [Collection element, Tuple element at index 1] |
| test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 1] | test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 1] |
| test.swift:789:5:789:5 | dict3 [Collection element, Tuple element at index 1] | test.swift:789:5:789:19 | DictionarySubscriptNode [Tuple element at index 1] |
| test.swift:789:5:789:19 | DictionarySubscriptNode [Tuple element at index 0] | test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 0] |
| test.swift:789:5:789:19 | DictionarySubscriptNode [Tuple element at index 1] | test.swift:789:5:789:5 | [post] dict3 [Collection element, Tuple element at index 1] |
@@ -462,6 +474,18 @@ edges
| test.swift:792:15:792:15 | dict3 [Collection element, Tuple element at index 1] | test.swift:792:15:792:35 | call to randomElement() [some:0, Tuple element at index 1] |
| test.swift:792:15:792:35 | call to randomElement() [some:0, Tuple element at index 1] | test.swift:792:15:792:36 | ...! [Tuple element at index 1] |
| test.swift:792:15:792:36 | ...! [Tuple element at index 1] | test.swift:792:15:792:38 | .1 |
| test.swift:794:5:794:5 | $generator [Collection element, Tuple element at index 0] | test.swift:794:5:794:5 | call to next() [some:0, Tuple element at index 0] |
| test.swift:794:5:794:5 | $generator [Collection element, Tuple element at index 1] | test.swift:794:5:794:5 | call to next() [some:0, Tuple element at index 1] |
| test.swift:794:5:794:5 | call to next() [some:0, Tuple element at index 0] | test.swift:794:9:794:20 | (...) [Tuple element at index 0] |
| test.swift:794:5:794:5 | call to next() [some:0, Tuple element at index 1] | test.swift:794:9:794:20 | (...) [Tuple element at index 1] |
| test.swift:794:9:794:20 | (...) [Tuple element at index 0] | test.swift:794:10:794:10 | key |
| test.swift:794:9:794:20 | (...) [Tuple element at index 1] | test.swift:794:15:794:15 | value |
| test.swift:794:10:794:10 | key | test.swift:795:19:795:19 | key |
| test.swift:794:15:794:15 | value | test.swift:796:19:796:19 | value |
| test.swift:794:25:794:25 | call to makeIterator() [Collection element, Tuple element at index 0] | test.swift:794:5:794:5 | $generator [Collection element, Tuple element at index 0] |
| test.swift:794:25:794:25 | call to makeIterator() [Collection element, Tuple element at index 1] | test.swift:794:5:794:5 | $generator [Collection element, Tuple element at index 1] |
| test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 0] | test.swift:794:25:794:25 | call to makeIterator() [Collection element, Tuple element at index 0] |
| test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 1] | test.swift:794:25:794:25 | call to makeIterator() [Collection element, Tuple element at index 1] |
| test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | test.swift:800:15:800:15 | dict4 [Collection element, Tuple element at index 1] |
| test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | test.swift:801:15:801:15 | dict4 [Collection element, Tuple element at index 1] |
| test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | test.swift:803:15:803:15 | dict4 [Collection element, Tuple element at index 1] |
@@ -481,6 +505,19 @@ edges
| test.swift:803:15:803:15 | dict4 [Collection element, Tuple element at index 1] | test.swift:803:15:803:35 | call to randomElement() [some:0, Tuple element at index 1] |
| test.swift:803:15:803:35 | call to randomElement() [some:0, Tuple element at index 1] | test.swift:803:15:803:36 | ...! [Tuple element at index 1] |
| test.swift:803:15:803:36 | ...! [Tuple element at index 1] | test.swift:803:15:803:38 | .1 |
| test.swift:809:16:809:30 | call to Set<Element>.init(_:) [Collection element] | test.swift:811:17:811:17 | set1 [Collection element] |
| test.swift:809:16:809:30 | call to Set<Element>.init(_:) [Collection element] | test.swift:815:21:815:21 | set1 [Collection element] |
| test.swift:809:20:809:29 | [...] [Array element] | test.swift:809:16:809:30 | call to Set<Element>.init(_:) [Collection element] |
| test.swift:809:21:809:28 | call to source() | test.swift:809:20:809:29 | [...] [Array element] |
| test.swift:811:5:811:5 | $elem$generator [Collection element] | test.swift:811:5:811:5 | call to next() [some:0] |
| test.swift:811:5:811:5 | call to next() [some:0] | test.swift:811:9:811:9 | elem |
| test.swift:811:9:811:9 | elem | test.swift:812:19:812:19 | elem |
| test.swift:811:17:811:17 | call to makeIterator() [Collection element] | test.swift:811:5:811:5 | $elem$generator [Collection element] |
| test.swift:811:17:811:17 | set1 [Collection element] | test.swift:811:17:811:17 | call to makeIterator() [Collection element] |
| test.swift:815:21:815:21 | set1 [Collection element] | test.swift:815:21:815:39 | call to makeIterator() [Collection element] |
| test.swift:815:21:815:39 | call to makeIterator() [Collection element] | test.swift:816:15:816:15 | generator [Collection element] |
| test.swift:816:15:816:15 | generator [Collection element] | test.swift:816:15:816:30 | call to next() [some:0] |
| test.swift:816:15:816:30 | call to next() [some:0] | test.swift:816:15:816:31 | ...! |
nodes
| file://:0:0:0:0 | .a [x] | semmle.label | .a [x] |
| file://:0:0:0:0 | .str | semmle.label | .str |
@@ -964,6 +1001,16 @@ nodes
| test.swift:776:15:776:15 | dict1 [Collection element, Tuple element at index 1] | semmle.label | dict1 [Collection element, Tuple element at index 1] |
| test.swift:776:15:776:22 | ...[...] | semmle.label | ...[...] |
| test.swift:776:15:776:22 | DictionarySubscriptNode [Tuple element at index 1] | semmle.label | DictionarySubscriptNode [Tuple element at index 1] |
| test.swift:778:17:778:29 | [...] [Collection element, Tuple element at index 0] | semmle.label | [...] [Collection element, Tuple element at index 0] |
| test.swift:778:18:778:25 | call to source() | semmle.label | call to source() |
| test.swift:778:18:778:28 | (...) [Tuple element at index 0] | semmle.label | (...) [Tuple element at index 0] |
| test.swift:781:5:781:5 | $generator [Collection element, Tuple element at index 0] | semmle.label | $generator [Collection element, Tuple element at index 0] |
| test.swift:781:5:781:5 | call to next() [some:0, Tuple element at index 0] | semmle.label | call to next() [some:0, Tuple element at index 0] |
| test.swift:781:9:781:20 | (...) [Tuple element at index 0] | semmle.label | (...) [Tuple element at index 0] |
| test.swift:781:10:781:10 | key | semmle.label | key |
| test.swift:781:25:781:25 | call to makeIterator() [Collection element, Tuple element at index 0] | semmle.label | call to makeIterator() [Collection element, Tuple element at index 0] |
| test.swift:781:25:781:25 | dict2 [Collection element, Tuple element at index 0] | semmle.label | dict2 [Collection element, Tuple element at index 0] |
| test.swift:782:19:782:19 | key | semmle.label | key |
| test.swift:786:17:786:29 | [...] [Collection element, Tuple element at index 1] | semmle.label | [...] [Collection element, Tuple element at index 1] |
| test.swift:786:18:786:28 | (...) [Tuple element at index 1] | semmle.label | (...) [Tuple element at index 1] |
| test.swift:786:21:786:28 | call to source() | semmle.label | call to source() |
@@ -984,6 +1031,20 @@ nodes
| test.swift:792:15:792:35 | call to randomElement() [some:0, Tuple element at index 1] | semmle.label | call to randomElement() [some:0, Tuple element at index 1] |
| test.swift:792:15:792:36 | ...! [Tuple element at index 1] | semmle.label | ...! [Tuple element at index 1] |
| test.swift:792:15:792:38 | .1 | semmle.label | .1 |
| test.swift:794:5:794:5 | $generator [Collection element, Tuple element at index 0] | semmle.label | $generator [Collection element, Tuple element at index 0] |
| test.swift:794:5:794:5 | $generator [Collection element, Tuple element at index 1] | semmle.label | $generator [Collection element, Tuple element at index 1] |
| test.swift:794:5:794:5 | call to next() [some:0, Tuple element at index 0] | semmle.label | call to next() [some:0, Tuple element at index 0] |
| test.swift:794:5:794:5 | call to next() [some:0, Tuple element at index 1] | semmle.label | call to next() [some:0, Tuple element at index 1] |
| test.swift:794:9:794:20 | (...) [Tuple element at index 0] | semmle.label | (...) [Tuple element at index 0] |
| test.swift:794:9:794:20 | (...) [Tuple element at index 1] | semmle.label | (...) [Tuple element at index 1] |
| test.swift:794:10:794:10 | key | semmle.label | key |
| test.swift:794:15:794:15 | value | semmle.label | value |
| test.swift:794:25:794:25 | call to makeIterator() [Collection element, Tuple element at index 0] | semmle.label | call to makeIterator() [Collection element, Tuple element at index 0] |
| test.swift:794:25:794:25 | call to makeIterator() [Collection element, Tuple element at index 1] | semmle.label | call to makeIterator() [Collection element, Tuple element at index 1] |
| test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 0] | semmle.label | dict3 [Collection element, Tuple element at index 0] |
| test.swift:794:25:794:25 | dict3 [Collection element, Tuple element at index 1] | semmle.label | dict3 [Collection element, Tuple element at index 1] |
| test.swift:795:19:795:19 | key | semmle.label | key |
| test.swift:796:19:796:19 | value | semmle.label | value |
| test.swift:799:17:799:28 | [...] [Collection element, Tuple element at index 1] | semmle.label | [...] [Collection element, Tuple element at index 1] |
| test.swift:799:18:799:27 | (...) [Tuple element at index 1] | semmle.label | (...) [Tuple element at index 1] |
| test.swift:799:20:799:27 | call to source() | semmle.label | call to source() |
@@ -1005,6 +1066,20 @@ nodes
| test.swift:803:15:803:35 | call to randomElement() [some:0, Tuple element at index 1] | semmle.label | call to randomElement() [some:0, Tuple element at index 1] |
| test.swift:803:15:803:36 | ...! [Tuple element at index 1] | semmle.label | ...! [Tuple element at index 1] |
| test.swift:803:15:803:38 | .1 | semmle.label | .1 |
| test.swift:809:16:809:30 | call to Set<Element>.init(_:) [Collection element] | semmle.label | call to Set<Element>.init(_:) [Collection element] |
| test.swift:809:20:809:29 | [...] [Array element] | semmle.label | [...] [Array element] |
| test.swift:809:21:809:28 | call to source() | semmle.label | call to source() |
| test.swift:811:5:811:5 | $elem$generator [Collection element] | semmle.label | $elem$generator [Collection element] |
| test.swift:811:5:811:5 | call to next() [some:0] | semmle.label | call to next() [some:0] |
| test.swift:811:9:811:9 | elem | semmle.label | elem |
| test.swift:811:17:811:17 | call to makeIterator() [Collection element] | semmle.label | call to makeIterator() [Collection element] |
| test.swift:811:17:811:17 | set1 [Collection element] | semmle.label | set1 [Collection element] |
| test.swift:812:19:812:19 | elem | semmle.label | elem |
| test.swift:815:21:815:21 | set1 [Collection element] | semmle.label | set1 [Collection element] |
| test.swift:815:21:815:39 | call to makeIterator() [Collection element] | semmle.label | call to makeIterator() [Collection element] |
| test.swift:816:15:816:15 | generator [Collection element] | semmle.label | generator [Collection element] |
| test.swift:816:15:816:30 | call to next() [some:0] | semmle.label | call to next() [some:0] |
| test.swift:816:15:816:31 | ...! | semmle.label | ...! |
subpaths
| test.swift:75:22:75:22 | x | test.swift:65:16:65:28 | arg1 | test.swift:65:1:70:1 | arg2[return] | test.swift:75:32:75:32 | [post] y |
| test.swift:114:19:114:19 | arg | test.swift:109:9:109:14 | arg | test.swift:110:12:110:12 | arg | test.swift:114:12:114:22 | call to ... |
@@ -1161,11 +1236,16 @@ subpaths
| test.swift:757:15:757:19 | .v3 | test.swift:747:14:747:21 | call to source() | test.swift:757:15:757:19 | .v3 | result |
| test.swift:767:15:767:28 | \\...[...] | test.swift:764:18:764:25 | call to source() | test.swift:767:15:767:28 | \\...[...] | result |
| test.swift:776:15:776:22 | ...[...] | test.swift:774:16:774:23 | call to source() | test.swift:776:15:776:22 | ...[...] | result |
| test.swift:782:19:782:19 | key | test.swift:778:18:778:25 | call to source() | test.swift:782:19:782:19 | key | result |
| test.swift:787:15:787:22 | ...[...] | test.swift:786:21:786:28 | call to source() | test.swift:787:15:787:22 | ...[...] | result |
| test.swift:791:15:791:38 | .0 | test.swift:789:11:789:18 | call to source() | test.swift:791:15:791:38 | .0 | result |
| test.swift:792:15:792:38 | .1 | test.swift:786:21:786:28 | call to source() | test.swift:792:15:792:38 | .1 | result |
| test.swift:795:19:795:19 | key | test.swift:789:11:789:18 | call to source() | test.swift:795:19:795:19 | key | result |
| test.swift:796:19:796:19 | value | test.swift:786:21:786:28 | call to source() | test.swift:796:19:796:19 | value | result |
| test.swift:800:15:800:53 | ...! | test.swift:799:20:799:27 | call to source() | test.swift:800:15:800:53 | ...! | result |
| test.swift:801:15:801:53 | ...! | test.swift:799:20:799:27 | call to source() | test.swift:801:15:801:53 | ...! | result |
| test.swift:802:15:802:38 | .0 | test.swift:800:44:800:51 | call to source() | test.swift:802:15:802:38 | .0 | result |
| test.swift:803:15:803:38 | .1 | test.swift:799:20:799:27 | call to source() | test.swift:803:15:803:38 | .1 | result |
| test.swift:803:15:803:38 | .1 | test.swift:801:33:801:40 | call to source() | test.swift:803:15:803:38 | .1 | result |
| test.swift:812:19:812:19 | elem | test.swift:809:21:809:28 | call to source() | test.swift:812:19:812:19 | elem | result |
| test.swift:816:15:816:31 | ...! | test.swift:809:21:809:28 | call to source() | test.swift:816:15:816:31 | ...! | result |

View File

@@ -941,10 +941,16 @@
| test.swift:779:15:779:15 | &... | test.swift:781:25:781:25 | dict2 |
| test.swift:779:15:779:15 | [post] dict2 | test.swift:779:15:779:15 | &... |
| test.swift:779:15:779:15 | dict2 | test.swift:779:15:779:15 | &... |
| test.swift:781:5:781:5 | $generator | test.swift:781:5:781:5 | &... |
| test.swift:781:5:781:5 | &... | test.swift:781:5:781:5 | $generator |
| test.swift:781:5:781:5 | [post] $generator | test.swift:781:5:781:5 | &... |
| test.swift:781:10:781:10 | SSA def(key) | test.swift:782:19:782:19 | key |
| test.swift:781:10:781:10 | key | test.swift:781:10:781:10 | SSA def(key) |
| test.swift:781:15:781:15 | SSA def(value) | test.swift:783:19:783:19 | value |
| test.swift:781:15:781:15 | value | test.swift:781:15:781:15 | SSA def(value) |
| test.swift:781:25:781:25 | $generator | test.swift:781:25:781:25 | SSA def($generator) |
| test.swift:781:25:781:25 | SSA def($generator) | test.swift:781:5:781:5 | $generator |
| test.swift:781:25:781:25 | call to makeIterator() | test.swift:781:25:781:25 | $generator |
| test.swift:786:9:786:9 | SSA def(dict3) | test.swift:787:15:787:15 | dict3 |
| test.swift:786:9:786:9 | dict3 | test.swift:786:9:786:9 | SSA def(dict3) |
| test.swift:786:17:786:29 | [...] | test.swift:786:9:786:9 | dict3 |
@@ -960,10 +966,16 @@
| test.swift:792:15:792:15 | [post] dict3 | test.swift:794:25:794:25 | dict3 |
| test.swift:792:15:792:15 | dict3 | test.swift:794:25:794:25 | dict3 |
| test.swift:792:15:792:35 | call to randomElement() | test.swift:792:15:792:36 | ...! |
| test.swift:794:5:794:5 | $generator | test.swift:794:5:794:5 | &... |
| test.swift:794:5:794:5 | &... | test.swift:794:5:794:5 | $generator |
| test.swift:794:5:794:5 | [post] $generator | test.swift:794:5:794:5 | &... |
| test.swift:794:10:794:10 | SSA def(key) | test.swift:795:19:795:19 | key |
| test.swift:794:10:794:10 | key | test.swift:794:10:794:10 | SSA def(key) |
| test.swift:794:15:794:15 | SSA def(value) | test.swift:796:19:796:19 | value |
| test.swift:794:15:794:15 | value | test.swift:794:15:794:15 | SSA def(value) |
| test.swift:794:25:794:25 | $generator | test.swift:794:25:794:25 | SSA def($generator) |
| test.swift:794:25:794:25 | SSA def($generator) | test.swift:794:5:794:5 | $generator |
| test.swift:794:25:794:25 | call to makeIterator() | test.swift:794:25:794:25 | $generator |
| test.swift:799:9:799:9 | SSA def(dict4) | test.swift:800:15:800:15 | dict4 |
| test.swift:799:9:799:9 | dict4 | test.swift:799:9:799:9 | SSA def(dict4) |
| test.swift:799:17:799:28 | [...] | test.swift:799:9:799:9 | dict4 |
@@ -983,3 +995,22 @@
| test.swift:803:15:803:35 | call to randomElement() | test.swift:803:15:803:36 | ...! |
| test.swift:804:15:804:15 | [post] dict4 | test.swift:805:15:805:15 | dict4 |
| test.swift:804:15:804:15 | dict4 | test.swift:805:15:805:15 | dict4 |
| test.swift:809:9:809:9 | SSA def(set1) | test.swift:811:17:811:17 | set1 |
| test.swift:809:9:809:9 | set1 | test.swift:809:9:809:9 | SSA def(set1) |
| test.swift:809:16:809:30 | call to Set<Element>.init(_:) | test.swift:809:9:809:9 | set1 |
| test.swift:811:5:811:5 | $elem$generator | test.swift:811:5:811:5 | &... |
| test.swift:811:5:811:5 | &... | test.swift:811:5:811:5 | $elem$generator |
| test.swift:811:5:811:5 | [post] $elem$generator | test.swift:811:5:811:5 | &... |
| test.swift:811:9:811:9 | SSA def(elem) | test.swift:812:19:812:19 | elem |
| test.swift:811:9:811:9 | elem | test.swift:811:9:811:9 | SSA def(elem) |
| test.swift:811:17:811:17 | $elem$generator | test.swift:811:17:811:17 | SSA def($elem$generator) |
| test.swift:811:17:811:17 | SSA def($elem$generator) | test.swift:811:5:811:5 | $elem$generator |
| test.swift:811:17:811:17 | [post] set1 | test.swift:815:21:815:21 | set1 |
| test.swift:811:17:811:17 | call to makeIterator() | test.swift:811:17:811:17 | $elem$generator |
| test.swift:811:17:811:17 | set1 | test.swift:815:21:815:21 | set1 |
| test.swift:815:9:815:9 | SSA def(generator) | test.swift:816:15:816:15 | generator |
| test.swift:815:9:815:9 | generator | test.swift:815:9:815:9 | SSA def(generator) |
| test.swift:815:21:815:39 | call to makeIterator() | test.swift:815:9:815:9 | generator |
| test.swift:816:15:816:15 | [post] generator | test.swift:816:15:816:15 | &... |
| test.swift:816:15:816:15 | generator | test.swift:816:15:816:15 | &... |
| test.swift:816:15:816:30 | call to next() | test.swift:816:15:816:31 | ...! |

View File

@@ -779,7 +779,7 @@ func testDictionary() {
sink(arg: dict2[1])
for (key, value) in dict2 {
sink(arg: key) // $ MISSING: flow=778
sink(arg: key) // $ flow=778
sink(arg: value)
}
@@ -792,8 +792,8 @@ func testDictionary() {
sink(arg: dict3.randomElement()!.1) // $ flow=786
for (key, value) in dict3 {
sink(arg: key) // $ MISSING: flow=789
sink(arg: value) // $ MISSING: flow=786
sink(arg: key) // $ flow=789
sink(arg: value) // $ flow=786
}
var dict4 = [1:source()]
@@ -804,3 +804,14 @@ func testDictionary() {
sink(arg: dict4.keys.randomElement()) // $ MISSING: flow=800
sink(arg: dict4.values.randomElement()) // $ MISSING: flow=799 flow=801
}
func testSetForEach() {
var set1 = Set([source()])
for elem in set1 {
sink(arg: elem) // $ flow=809
}
var generator = set1.makeIterator()
sink(arg: generator.next()!) // $ flow=809
}