diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 99c7db99416b..cd7fa6a4ee27 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -161,6 +161,9 @@ signature module AstSig { Expr getCollection(); } + /** Gets the loop guard of the given `loop`, if any. */ + default AstNode getLoopGuard(ForEachStmt loop) { none() } + /** * A `break` statement. * @@ -656,6 +659,7 @@ module Make0 Ast> { any(DoStmt dostmt).getCondition() = n or any(UntilStmt untilstmt).getCondition() = n or any(ForStmt forstmt).getCondition() = n or + getLoopGuard(_) = n or any(ConditionalExpr condexpr).getCondition() = n or any(CatchClause catch).getCondition() = n or any(Case case).getGuard() = n @@ -1701,8 +1705,19 @@ module Make0 Ast> { n2.isBefore(foreachstmt.getVariable()) or n1.isAfter(foreachstmt.getVariable()) and + ( + n2.isBefore(getLoopGuard(foreachstmt)) + or + not exists(getLoopGuard(foreachstmt)) and + n2.isBefore(foreachstmt.getBody()) + ) + or + n1.isAfterTrue(getLoopGuard(foreachstmt)) and n2.isBefore(foreachstmt.getBody()) or + n1.isAfterFalse(getLoopGuard(foreachstmt)) and + n2.isAdditional(foreachstmt, loopHeaderTag()) + or n1.isAfter(foreachstmt.getBody()) and n2.isAdditional(foreachstmt, loopHeaderTag()) or diff --git a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll index 1f5f25cd1fc2..374afa4a6c82 100644 --- a/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll +++ b/unified/ql/lib/codeql/unified/internal/ControlFlowGraph.qll @@ -35,12 +35,17 @@ module Ast implements AstSig { not e.fromSource() } + private AstNode adjustedGetChild(AstNode n, int index) { deferScope(n, index, result) } + AstNode getChild(AstNode n, int index) { result.getParent() = n and result.getParentIndex() = index and not n instanceof Callable and not skipControlFlow(n) and - not skipControlFlow(result) + not skipControlFlow(result) and + not adjustedGetChild(_, _) = result + or + adjustedGetChild(n, index) = result or n.(FunctionExpr).getCaptureDeclaration(index) = result or @@ -76,7 +81,56 @@ module Ast implements AstSig { class Expr = U::Expr; - class BlockStmt = U::Block; + /** + * Holds if `s` is the `n`th statement in the constructed `try` block of + * `defer`. + * + * For example, the following `defer` statements + * ``` + * { + * s1 + * defer { s5 } + * s2 + * defer { s4 } + * s3 + * } + * ``` + * are transformed into these `try`-`finally` blocks: + * ``` + * { + * s1 + * try { + * s2 + * try { + * s3 + * } finally { + * s4 + * } + * } finally { + * s5 + * } + * } + * ``` + */ + private predicate deferScope(U::DeferStmt defer, int n, Stmt s) { + exists(U::Block block, int deferIdx | block.getStmt(deferIdx) = defer | + block.getStmt(deferIdx + 1) = s and n = 0 + or + exists(Stmt mid | + deferScope(defer, n - 1, mid) and + not mid instanceof U::DeferStmt and + block.getStmt(deferIdx + 1 + n) = s + ) + ) + } + + class BlockStmt extends Stmt instanceof U::Block { + Stmt getStmt(int n) { result = super.getStmt(n) and not deferScope(_, _, result) } + + Stmt getLastStmt() { + exists(int i | result = this.getStmt(i) and not exists(this.getStmt(i + 1))) + } + } class ExprStmt extends Stmt { ExprStmt() { none() } @@ -127,13 +181,13 @@ module Ast implements AstSig { class ForEachStmt extends LoopStmt instanceof U::ForEachStmt { override Stmt getBody() { result = U::ForEachStmt.super.getBody() } - // TODO support foreach guard - // Expr getVariable() { result = super.getPattern() } Expr getCollection() { result = super.getIterable() } } + AstNode getLoopGuard(ForEachStmt foreachstmt) { result = foreachstmt.(U::ForEachStmt).getGuard() } + class BreakStmt = U::BreakExpr; class ContinueStmt = U::ContinueExpr; @@ -152,12 +206,18 @@ module Ast implements AstSig { Expr getExpr() { result = super.getValue() } } - class TryStmt extends U::TryExpr { - AstNode getBody(int index) { index = 0 and result = super.getBody() } + class TryStmt extends Stmt { + TryStmt() { this instanceof U::TryExpr or this instanceof U::DeferStmt } + + AstNode getBody(int index) { + index = 0 and result = this.(U::TryExpr).getBody() + or + deferScope(this, index, result) + } - CatchClause getCatch(int index) { result = super.getCatchClause(index) } + CatchClause getCatch(int index) { result = this.(U::TryExpr).getCatchClause(index) } - Stmt getFinally() { none() } + Stmt getFinally() { result = this.(U::DeferStmt).getBody() } } class CatchClause extends U::CatchClause { diff --git a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected index f267c41d21a6..75209a2d826b 100644 --- a/unified/ql/test/library-tests/controlflow/basicblock-slices.expected +++ b/unified/ql/test/library-tests/controlflow/basicblock-slices.expected @@ -1,4 +1,4 @@ -| 1 | cfg.swift:1:1:604:1 | Block | 'Block -V var topLevelDecl -V topLevelDecl -> Int -> 0' | +| 1 | cfg.swift:1:1:613:1 | Block | 'Block -V var topLevelDecl -V topLevelDecl -> Int -> 0' | | 2 | cfg.swift:2:1:2:1 | 0 | '0' | | 3 | cfg.swift:3:1:3:12 | topLevelDecl | 'topLevelDecl -> 1 -^ ... + ...' | | 5 | cfg.swift:5:1:5:37 | func returnZero | 'func returnZero -V returnZero' | @@ -112,361 +112,385 @@ | 134 | cfg.swift:134:3:134:27 | let n18 | 'let n18 -V n18 -> opt -^ ... .self -^ ... .myInt' | | 135 | cfg.swift:135:3:135:27 | let n19 | 'let n19 -V n19 -> opt -^ ... .getMyInt -^ ... .getMyInt(...)' | | 136 | cfg.swift:136:3:136:32 | let n20 | 'let n20 -V n20 -> opt -^ ... .self -^ ... .getMyInt -^ ... .getMyInt(...)' | -| 139 | cfg.swift:139:1:166:1 | func patterns | 'func patterns -V patterns' | +| 139 | cfg.swift:139:1:173:1 | func patterns | 'func patterns -V patterns' | | 139 | cfg.swift:139:15:139:15 | x | 'x -> Block' | | 140 | cfg.swift:140:3:141:12 | ForEachStmt | 'ForEachStmt -V 0 -> 10 -^ ... ... ...' | | 140 | cfg.swift:140:7:140:7 | _ | '_' | | 141 | cfg.swift:141:9:141:12 | Block | 'Block' | -| 143 | cfg.swift:143:3:153:3 | SwitchExpr | 'SwitchExpr -V x' | -| 144 | cfg.swift:144:5:146:17 | SwitchCase | 'SwitchCase -V 0 -> 1 -^ OrPattern' | -| 145 | cfg.swift:145:7:146:17 | Block | 'Block -V true -^ ReturnExpr' | -| 147 | cfg.swift:147:5:150:17 | SwitchCase | 'SwitchCase' | -| 147 | cfg.swift:147:10:147:10 | x | 'x -^ ConditionalPattern' | -| 148 | cfg.swift:148:9:149:17 | ... && ... | '... && ... -V x -> 2 -^ ... >= ...' | -| 149 | cfg.swift:149:13:149:13 | x | 'x -> 5 -^ ... < ...' | -| 150 | cfg.swift:150:7:150:17 | Block | 'Block -V true -^ ReturnExpr' | -| 151 | cfg.swift:151:5:152:18 | SwitchCase | 'SwitchCase' | -| 152 | cfg.swift:152:7:152:18 | Block | 'Block -V false -^ ReturnExpr' | -| 168 | cfg.swift:168:1:184:1 | func testDefer | 'func testDefer -V testDefer' | -| 168 | cfg.swift:168:16:168:16 | x | 'x -> Block' | -| 170 | cfg.swift:170:3:172:3 | DeferStmt | 'DeferStmt -V Block' | -| 171 | cfg.swift:171:5:171:9 | print | 'print -> Argument -V "4" -^ print(...)' | -| 174 | cfg.swift:174:3:176:3 | DeferStmt | 'DeferStmt -V Block' | -| 175 | cfg.swift:175:5:175:9 | print | 'print -> Argument -V "3" -^ print(...)' | -| 178 | cfg.swift:178:3:183:3 | DeferStmt | 'DeferStmt -V Block' | -| 179 | cfg.swift:179:5:179:9 | print | 'print -> Argument -V "1" -^ print(...)' | -| 180 | cfg.swift:180:6:182:5 | DeferStmt | 'DeferStmt -V Block' | -| 181 | cfg.swift:181:7:181:11 | print | 'print -> Argument -V "2" -^ print(...)' | -| 186 | cfg.swift:186:1:198:1 | func m1 | 'func m1 -V m1' | -| 186 | cfg.swift:186:9:186:9 | x | 'x -> Block' | -| 187 | cfg.swift:187:3:197:3 | IfExpr | 'IfExpr -V x -> 2 -^ ... > ...' | -| 187 | cfg.swift:187:12:189:3 | Block | 'Block' | -| 188 | cfg.swift:188:5:188:9 | print | 'print -> Argument -V "x is greater than 2" -^ print(...)' | -| 190 | cfg.swift:190:8:197:3 | IfExpr | 'IfExpr -V ... && ... -V ... && ... -V x -> 2 -^ ... <= ...' | -| 191 | cfg.swift:191:13:191:13 | x | 'x -> 0 -^ ... > ...' | -| 192 | cfg.swift:192:13:192:21 | ! ... | '! ... -V x -> 5 -^ ... == ...' | -| 192 | cfg.swift:192:23:194:3 | Block | 'Block' | -| 193 | cfg.swift:193:5:193:9 | print | 'print -> Argument -V "x is 1" -^ print(...)' | -| 195 | cfg.swift:195:8:197:3 | Block | 'Block' | -| 196 | cfg.swift:196:5:196:9 | print | 'print -> Argument -V "I can't guess the number" -^ print(...)' | -| 200 | cfg.swift:200:1:205:1 | func m2 | 'func m2 -V m2' | -| 200 | cfg.swift:200:9:200:9 | b | 'b -> Block' | -| 201 | cfg.swift:201:3:203:3 | IfExpr | 'IfExpr -V b' | -| 201 | cfg.swift:201:8:203:3 | Block | 'Block' | -| 202 | cfg.swift:202:12:202:12 | 0 | '0 -^ ReturnExpr' | -| 204 | cfg.swift:204:10:204:10 | 1 | '1 -^ ReturnExpr' | -| 207 | cfg.swift:207:1:215:1 | func m3 | 'func m3 -V m3' | -| 207 | cfg.swift:207:9:207:9 | x | 'x -> Block' | -| 208 | cfg.swift:208:3:213:3 | IfExpr | 'IfExpr -V x -> 0 -^ ... < ...' | -| 208 | cfg.swift:208:12:213:3 | Block | 'Block' | -| 209 | cfg.swift:209:5:209:5 | x | 'x -> x -^ - ... -^ ... = ...' | -| 210 | cfg.swift:210:5:212:5 | IfExpr | 'IfExpr -V x -> 10 -^ ... > ...' | -| 210 | cfg.swift:210:15:212:5 | Block | 'Block' | -| 211 | cfg.swift:211:7:211:7 | x | 'x -> x -> 1 -^ ... - ... -^ ... = ...' | -| 214 | cfg.swift:214:10:214:10 | x | 'x -^ ReturnExpr' | -| 217 | cfg.swift:217:1:223:1 | func m4 | 'func m4 -V m4' | -| 217 | cfg.swift:217:10:217:11 | b1 | 'b1 -> b2 -> b3 -> Block' | -| 218 | cfg.swift:218:3:222:20 | ReturnExpr | 'ReturnExpr' | -| 218 | cfg.swift:218:10:222:20 | IfExpr | 'IfExpr -V IfExpr -V b1' | -| 219 | cfg.swift:219:13:219:14 | b2 | 'b2' | -| 220 | cfg.swift:220:13:220:14 | b3 | 'b3' | -| 221 | cfg.swift:221:9:221:18 | "b2 \|\| b3" | '"b2 \|\| b3"' | -| 222 | cfg.swift:222:9:222:20 | "!b2 \|\| !b3" | '"!b2 \|\| !b3"' | -| 225 | cfg.swift:225:1:234:1 | func conversionsInSplitEntry | 'func conversionsInSplitEntry -V conversionsInSplitEntry' | -| 225 | cfg.swift:225:31:225:31 | b | 'b -> Block' | -| 226 | cfg.swift:226:3:233:3 | IfExpr | 'IfExpr -V IfExpr -V b' | -| 227 | cfg.swift:227:8:227:11 | true | 'true' | -| 228 | cfg.swift:228:7:228:10 | Bool | 'Bool -> Argument -V false -^ Bool(...)' | -| 228 | cfg.swift:228:19:230:3 | Block | 'Block' | -| 229 | cfg.swift:229:12:229:14 | "b" | '"b" -^ ReturnExpr' | -| 231 | cfg.swift:231:8:233:3 | Block | 'Block' | -| 232 | cfg.swift:232:12:232:15 | "!b" | '"!b" -^ ReturnExpr' | -| 236 | cfg.swift:236:1:240:1 | func constant_condition | 'func constant_condition -V constant_condition' | -| 236 | cfg.swift:236:27:240:1 | Block | 'Block' | -| 237 | cfg.swift:237:3:239:3 | IfExpr | 'IfExpr -V ! ... -V true' | -| 242 | cfg.swift:242:1:248:1 | func empty_else | 'func empty_else -V empty_else' | -| 242 | cfg.swift:242:17:242:17 | b | 'b -> Block' | -| 243 | cfg.swift:243:3:246:9 | IfExpr | 'IfExpr -V b' | -| 243 | cfg.swift:243:8:245:3 | Block | 'Block' | -| 244 | cfg.swift:244:5:244:9 | print | 'print -> Argument -V "true" -^ print(...)' | -| 246 | cfg.swift:246:8:246:9 | Block | 'Block' | -| 247 | cfg.swift:247:3:247:7 | print | 'print -> Argument -V "done" -^ print(...)' | -| 250 | cfg.swift:250:1:254:1 | func disjunct | 'func disjunct -V disjunct' | -| 250 | cfg.swift:250:16:250:17 | b1 | 'b1 -> b2 -> Block' | -| 251 | cfg.swift:251:3:253:3 | IfExpr | 'IfExpr -V ... \|\| ... -V b1' | -| 251 | cfg.swift:251:13:251:14 | b2 | 'b2' | -| 251 | cfg.swift:251:17:253:3 | Block | 'Block' | -| 252 | cfg.swift:252:5:252:9 | print | 'print -> Argument -V "b1 or b2" -^ print(...)' | -| 256 | cfg.swift:256:1:273:1 | func binaryExprs | 'func binaryExprs -V binaryExprs' | -| 256 | cfg.swift:256:18:256:18 | a | 'a -> b -> Block' | -| 257 | cfg.swift:257:3:257:15 | let c | 'let c -V c -> a -> b -^ ... + ...' | -| 258 | cfg.swift:258:3:258:15 | let d | 'let d -V d -> a -> b -^ ... - ...' | -| 259 | cfg.swift:259:3:259:15 | let e | 'let e -V e -> a -> b -^ ... * ...' | -| 260 | cfg.swift:260:3:260:15 | let f | 'let f -V f -> a -> b -^ ... / ...' | -| 261 | cfg.swift:261:3:261:15 | let g | 'let g -V g -> a -> b -^ ... % ...' | -| 262 | cfg.swift:262:3:262:15 | let h | 'let h -V h -> a -> b -^ ... & ...' | -| 263 | cfg.swift:263:3:263:15 | let i | 'let i -V i -> a -> b -^ ... \| ...' | -| 264 | cfg.swift:264:3:264:15 | let j | 'let j -V j -> a -> b -^ ... ^ ...' | -| 265 | cfg.swift:265:3:265:16 | let k | 'let k -V k -> a -> b -^ ... << ...' | -| 266 | cfg.swift:266:3:266:16 | let l | 'let l -V l -> a -> b -^ ... >> ...' | -| 267 | cfg.swift:267:3:267:16 | let o | 'let o -V o -> a -> b -^ ... == ...' | -| 268 | cfg.swift:268:3:268:16 | let p | 'let p -V p -> a -> b -^ ... != ...' | -| 269 | cfg.swift:269:3:269:15 | let q | 'let q -V q -> a -> b -^ ... < ...' | -| 270 | cfg.swift:270:3:270:16 | let r | 'let r -V r -> a -> b -^ ... <= ...' | -| 271 | cfg.swift:271:3:271:15 | let s | 'let s -V s -> a -> b -^ ... > ...' | -| 272 | cfg.swift:272:3:272:16 | let t | 'let t -V t -> a -> b -^ ... >= ...' | -| 275 | cfg.swift:275:1:277:1 | func interpolatedString | 'func interpolatedString -V interpolatedString' | -| 275 | cfg.swift:275:25:275:25 | x | 'x -> y -> Block' | -| 276 | cfg.swift:276:11:276:10 | | ' -> interpolation -> Argument -V x -^ interpolation(...) -> + -> interpolation -> Argument -V y -^ interpolation(...) -> is equal to -> interpolation -> Argument -V x -> y -^ ... + ... -^ interpolation(...) -> and here is a zero: -> interpolation -> Argument -V returnZero -^ returnZero(...) -^ interpolation(...) -> -^ StringInterpolationExpr -^ ReturnExpr' | -| 279 | cfg.swift:279:1:310:1 | func testSubscriptExpr | 'func testSubscriptExpr -V testSubscriptExpr' | -| 279 | cfg.swift:279:55:310:1 | Block | 'Block' | -| 280 | cfg.swift:280:3:280:44 | var a | 'var a -V a -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -^ ArrayLiteral' | -| 281 | cfg.swift:281:3:281:3 | a | 'a -> Argument -V 0 -^ a(...) -> 0 -^ ... = ...' | -| 282 | cfg.swift:282:3:282:3 | a | 'a -> Argument -V 1 -^ a(...) -> 1 -^ ... += ...' | -| 283 | cfg.swift:283:3:283:3 | a | 'a -> Argument -V 2 -^ a(...) -> 1 -^ ... -= ...' | -| 284 | cfg.swift:284:3:284:3 | a | 'a -> Argument -V 3 -^ a(...) -> 1 -^ ... *= ...' | -| 285 | cfg.swift:285:3:285:3 | a | 'a -> Argument -V 4 -^ a(...) -> 1 -^ ... /= ...' | -| 286 | cfg.swift:286:3:286:3 | a | 'a -> Argument -V 5 -^ a(...) -> 1 -^ ... %= ...' | -| 287 | cfg.swift:287:3:287:3 | a | 'a -> Argument -V 6 -^ a(...) -> 1 -^ ... &= ...' | -| 288 | cfg.swift:288:3:288:3 | a | 'a -> Argument -V 7 -^ a(...) -> 1 -^ ... \|= ...' | -| 289 | cfg.swift:289:3:289:3 | a | 'a -> Argument -V 8 -^ a(...) -> 1 -^ ... ^= ...' | -| 290 | cfg.swift:290:3:290:3 | a | 'a -> Argument -V 9 -^ a(...) -> 1 -^ ... <<= ...' | -| 291 | cfg.swift:291:3:291:3 | a | 'a -> Argument -V 10 -^ a(...) -> 1 -^ ... >>= ...' | -| 293 | cfg.swift:293:3:293:49 | var tupleWithA | 'var tupleWithA -V tupleWithA -> Argument -V a -> Argument -V 0 -^ a(...) -> Argument -V a -> Argument -V 1 -^ a(...) -> Argument -V a -> Argument -V 2 -^ a(...) -> Argument -V a -> Argument -V 3 -^ a(...) -> Argument -V a -> Argument -V 4 -^ a(...) -^ TupleExpr' | -| 295 | cfg.swift:295:3:295:48 | var b | 'var b -V b -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -^ ArrayLiteral' | -| 296 | cfg.swift:296:3:296:3 | b | 'b -> Argument -V 0 -^ b(...) -> a -> Argument -V 10 -^ a(...) -^ ... = ...' | -| 297 | cfg.swift:297:3:297:3 | b | 'b -> Argument -V 1 -^ b(...) -> b -> Argument -V 0 -^ b(...) -> 1 -^ ... + ... -^ ... = ...' | -| 298 | cfg.swift:298:3:298:3 | b | 'b -> Argument -V 2 -^ b(...) -> b -> Argument -V 1 -^ b(...) -> 1 -^ ... - ... -^ ... = ...' | -| 299 | cfg.swift:299:3:299:3 | b | 'b -> Argument -V 3 -^ b(...) -> b -> Argument -V 2 -^ b(...) -> 1 -^ ... * ... -^ ... = ...' | -| 300 | cfg.swift:300:3:300:3 | b | 'b -> Argument -V 4 -^ b(...) -> b -> Argument -V 3 -^ b(...) -> 1 -^ ... / ... -^ ... = ...' | -| 301 | cfg.swift:301:3:301:3 | b | 'b -> Argument -V 5 -^ b(...) -> b -> Argument -V 4 -^ b(...) -> 1 -^ ... % ... -^ ... = ...' | -| 302 | cfg.swift:302:3:302:3 | b | 'b -> Argument -V 6 -^ b(...) -> b -> Argument -V 5 -^ b(...) -> 1 -^ ... & ... -^ ... = ...' | -| 303 | cfg.swift:303:3:303:3 | b | 'b -> Argument -V 7 -^ b(...) -> b -> Argument -V 6 -^ b(...) -> 1 -^ ... \| ... -^ ... = ...' | -| 304 | cfg.swift:304:3:304:3 | b | 'b -> Argument -V 8 -^ b(...) -> b -> Argument -V 7 -^ b(...) -> 1 -^ ... ^ ... -^ ... = ...' | -| 305 | cfg.swift:305:3:305:3 | b | 'b -> Argument -V 9 -^ b(...) -> b -> Argument -V 8 -^ b(...) -> 1 -^ ... << ... -^ ... = ...' | -| 306 | cfg.swift:306:3:306:3 | b | 'b -> Argument -V 10 -^ b(...) -> b -> Argument -V 9 -^ b(...) -> 1 -^ ... >> ... -^ ... = ...' | -| 308 | cfg.swift:308:3:308:39 | let (pattern assignment) | 'let (pattern assignment) -V Argument -V a1 -> Argument -V a2 -> Argument -V a3 -> Argument -V a4 -> Argument -V a5 -^ TupleExpr -> tupleWithA' | -| 309 | cfg.swift:309:11:309:19 | Argument | 'Argument -V a1 -> b -> Argument -V 0 -^ b(...) -^ ... + ... -> Argument -V a2 -> b -> Argument -V 1 -^ b(...) -^ ... + ... -> Argument -V a3 -> b -> Argument -V 2 -^ b(...) -^ ... + ... -> Argument -V a4 -> b -> Argument -V 3 -^ b(...) -^ ... + ... -> Argument -V a5 -> b -> Argument -V 4 -^ b(...) -^ ... + ... -^ TupleExpr -^ ReturnExpr' | -| 312 | cfg.swift:312:1:317:1 | func loop1 | 'func loop1 -V loop1' | -| 312 | cfg.swift:312:12:312:12 | x | 'x -> Block' | -| 313 | cfg.swift:313:3:316:3 | WhileStmt | 'WhileStmt' | -| 313 | cfg.swift:313:9:313:9 | x | 'x -> 0 -^ ... >= ...' | -| 313 | cfg.swift:313:16:316:3 | Block | 'Block' | -| 314 | cfg.swift:314:5:314:9 | print | 'print -> Argument -V x -^ print(...)' | -| 315 | cfg.swift:315:5:315:5 | x | 'x -> 1 -^ ... -= ...' | -| 319 | cfg.swift:319:1:332:1 | func loop2 | 'func loop2 -V loop2' | -| 319 | cfg.swift:319:12:319:12 | x | 'x -> Block' | -| 320 | cfg.swift:320:3:330:3 | WhileStmt | 'WhileStmt' | -| 320 | cfg.swift:320:9:320:9 | x | 'x -> 0 -^ ... >= ...' | -| 320 | cfg.swift:320:16:330:3 | Block | 'Block' | -| 321 | cfg.swift:321:5:321:9 | print | 'print -> Argument -V x -^ print(...)' | -| 322 | cfg.swift:322:5:322:5 | x | 'x -> 1 -^ ... -= ...' | -| 323 | cfg.swift:323:5:328:5 | IfExpr | 'IfExpr -V x -> 100 -^ ... > ...' | -| 323 | cfg.swift:323:16:325:5 | Block | 'Block' | -| 324 | cfg.swift:324:7:324:11 | BreakExpr | 'BreakExpr' | -| 326 | cfg.swift:326:10:328:5 | IfExpr | 'IfExpr -V x -> 50 -^ ... > ...' | -| 326 | cfg.swift:326:20:328:5 | Block | 'Block' | -| 327 | cfg.swift:327:7:327:14 | ContinueExpr | 'ContinueExpr' | -| 329 | cfg.swift:329:5:329:9 | print | 'print -> Argument -V "Iter" -^ print(...)' | -| 331 | cfg.swift:331:3:331:7 | print | 'print -> Argument -V "Done" -^ print(...)' | -| 334 | cfg.swift:334:1:349:1 | func labeledLoop | 'func labeledLoop -V labeledLoop' | -| 334 | cfg.swift:334:18:334:18 | x | 'x -> Block' | -| 335 | cfg.swift:335:3:348:3 | LabeledStmt | 'LabeledStmt -V WhileStmt' | -| 335 | cfg.swift:335:16:335:16 | x | 'x -> 0 -^ ... >= ...' | -| 335 | cfg.swift:335:23:348:3 | Block | 'Block' | -| 336 | cfg.swift:336:5:346:5 | LabeledStmt | 'LabeledStmt -V WhileStmt' | -| 336 | cfg.swift:336:18:336:18 | x | 'x -> 0 -^ ... >= ...' | -| 336 | cfg.swift:336:25:346:5 | Block | 'Block' | -| 337 | cfg.swift:337:7:337:11 | print | 'print -> Argument -V x -^ print(...)' | -| 338 | cfg.swift:338:7:338:7 | x | 'x -> 1 -^ ... -= ...' | -| 339 | cfg.swift:339:7:344:7 | IfExpr | 'IfExpr -V x -> 100 -^ ... > ...' | -| 339 | cfg.swift:339:18:341:7 | Block | 'Block' | -| 340 | cfg.swift:340:9:340:19 | BreakExpr | 'BreakExpr' | -| 342 | cfg.swift:342:12:344:7 | IfExpr | 'IfExpr -V x -> 50 -^ ... > ...' | -| 342 | cfg.swift:342:22:344:7 | Block | 'Block' | -| 343 | cfg.swift:343:9:343:22 | ContinueExpr | 'ContinueExpr' | -| 345 | cfg.swift:345:7:345:11 | print | 'print -> Argument -V "Iter" -^ print(...)' | -| 347 | cfg.swift:347:5:347:9 | print | 'print -> Argument -V "Done" -^ print(...)' | -| 351 | cfg.swift:351:1:356:1 | func testRepeat | 'func testRepeat -V testRepeat' | -| 351 | cfg.swift:351:17:351:17 | x | 'x -> Block' | -| 352 | cfg.swift:352:3:355:16 | DoWhileStmt | 'DoWhileStmt' | -| 352 | cfg.swift:352:10:355:3 | Block | 'Block' | -| 353 | cfg.swift:353:5:353:9 | print | 'print -> Argument -V x -^ print(...)' | -| 354 | cfg.swift:354:5:354:5 | x | 'x -> 1 -^ ... -= ...' | -| 355 | cfg.swift:355:11:355:11 | x | 'x -> 0 -^ ... >= ...' | -| 358 | cfg.swift:358:1:363:1 | func loop_with_identity_expr | 'func loop_with_identity_expr -V loop_with_identity_expr' | -| 358 | cfg.swift:358:32:363:1 | Block | 'Block' | -| 359 | cfg.swift:359:3:359:11 | var x | 'var x -V x -> 0' | -| 360 | cfg.swift:360:3:362:3 | WhileStmt | 'WhileStmt' | -| 360 | cfg.swift:360:9:360:9 | x | 'x -> 10 -^ ... < ...' | -| 360 | cfg.swift:360:17:362:3 | Block | 'Block' | -| 361 | cfg.swift:361:5:361:5 | x | 'x -> 1 -^ ... += ...' | -| 365 | cfg.swift:365:1:374:1 | class OptionalC | 'class OptionalC -V OptionalC' | -| 366 | cfg.swift:366:3:366:11 | let OptionalC.c | 'let OptionalC.c -V c -> Optional -> C -^ GenericTypeExpr' | -| 367 | cfg.swift:367:3:369:3 | OptionalC.init | 'OptionalC.init' | -| 367 | cfg.swift:367:8:367:10 | arg | 'arg -> Block' | -| 368 | cfg.swift:368:5:368:5 | c | 'c -> arg -^ ... = ...' | -| 371 | cfg.swift:371:3:373:3 | func OptionalC.getOptional | 'func OptionalC.getOptional -V getOptional' | -| 371 | cfg.swift:371:28:373:3 | Block | 'Block' | -| 372 | cfg.swift:372:12:372:12 | c | 'c -^ ReturnExpr' | -| 376 | cfg.swift:376:1:378:1 | func testOptional | 'func testOptional -V testOptional' | -| 376 | cfg.swift:376:19:376:19 | c | 'c -> Block' | -| 377 | cfg.swift:377:10:377:10 | c | 'c -^ ... .getOptional -^ ... .getOptional(...) -^ ... .getMyInt -^ ... .getMyInt(...) -^ ReturnExpr' | -| 380 | cfg.swift:380:1:384:1 | func testCapture | 'func testCapture -V testCapture' | -| 380 | cfg.swift:380:18:380:18 | x | 'x -> y -> Block' | -| 381 | cfg.swift:381:13:381:21 | z | 'z -V z -> x -> y -^ ... + ... -> t -V t -> "literal" -^ FunctionExpr -^ ReturnExpr' | -| 382 | cfg.swift:382:5:382:12 | Block | 'Block -V z -^ ReturnExpr' | -| 386 | cfg.swift:386:1:388:1 | func testTupleElement | 'func testTupleElement -V testTupleElement' | -| 386 | cfg.swift:386:23:386:23 | t | 't -> Block' | -| 387 | cfg.swift:387:10:387:10 | t | 't -^ ... .a -> t -^ ... .1 -^ ... + ... -> t -^ ... .c -^ ... + ... -> Argument -V 1 -> Argument -V 2 -> Argument -V 3 -^ TupleExpr -^ ... .0 -^ ... + ... -^ ReturnExpr' | -| 390 | cfg.swift:390:1:394:1 | class Derived | 'class Derived -V Derived -> BaseType -V C' | -| 391 | cfg.swift:391:3:393:3 | Derived.init | 'Derived.init' | -| 391 | cfg.swift:391:10:393:3 | Block | 'Block' | -| 392 | cfg.swift:392:5:392:9 | super | 'super -^ ... .init -> Argument -V 0 -^ ... .init(...)' | -| 396 | cfg.swift:396:1:404:1 | func doWithoutCatch | 'func doWithoutCatch -V doWithoutCatch' | -| 396 | cfg.swift:396:21:396:21 | x | 'x -> Block' | -| 397 | cfg.swift:397:3:402:3 | TryExpr | 'TryExpr -V Block' | -| 398 | cfg.swift:398:5:398:24 | try ... | 'try ...' | -| 398 | cfg.swift:398:9:398:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ mightThrow(...)' | -| 399 | cfg.swift:399:5:399:9 | print | 'print -> Argument -V "Did not throw." -^ print(...)' | -| 400 | cfg.swift:400:10:400:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ mightThrow(...) -^ try! ...' | -| 401 | cfg.swift:401:5:401:9 | print | 'print -> Argument -V "Still did not throw." -^ print(...)' | -| 403 | cfg.swift:403:10:403:10 | 0 | '0 -^ ReturnExpr' | -| 406 | cfg.swift:406:1:415:1 | class Structors | 'class Structors -V Structors' | -| 407 | cfg.swift:407:3:407:16 | var Structors.field | 'var Structors.field -V field -> Int' | -| 408 | cfg.swift:408:3:410:3 | Structors.init | 'Structors.init' | -| 408 | cfg.swift:408:10:410:3 | Block | 'Block' | -| 409 | cfg.swift:409:5:409:9 | field | 'field -> 10 -^ ... = ...' | -| 412 | cfg.swift:412:3:414:3 | DestructorDeclaration | 'DestructorDeclaration' | -| 412 | cfg.swift:412:10:414:3 | Block | 'Block' | -| 413 | cfg.swift:413:5:413:9 | field | 'field -> 0 -^ ... = ...' | -| 417 | cfg.swift:417:1:419:1 | func dictionaryLiteral | 'func dictionaryLiteral -V dictionaryLiteral' | -| 417 | cfg.swift:417:24:417:24 | x | 'x -> y -> Block' | -| 418 | cfg.swift:418:11:418:13 | "x" | '"x" -> x -^ KeyValuePair -> "y" -> y -^ KeyValuePair -^ MapLiteral -^ ReturnExpr' | -| 421 | cfg.swift:421:1:444:1 | func localDeclarations | 'func localDeclarations -V localDeclarations' | -| 421 | cfg.swift:421:33:444:1 | Block | 'Block' | -| 422 | cfg.swift:422:3:427:3 | class MyLocalClass | 'class MyLocalClass -V MyLocalClass' | -| 423 | cfg.swift:423:5:423:14 | var MyLocalClass.x | 'var MyLocalClass.x -V x -> Int' | -| 424 | cfg.swift:424:5:426:5 | MyLocalClass.init | 'MyLocalClass.init' | -| 424 | cfg.swift:424:12:426:5 | Block | 'Block' | -| 425 | cfg.swift:425:7:425:7 | x | 'x -> 10 -^ ... = ...' | -| 429 | cfg.swift:429:3:434:3 | struct MyLocalStruct | 'struct MyLocalStruct -V MyLocalStruct' | -| 430 | cfg.swift:430:5:430:14 | var MyLocalStruct.x | 'var MyLocalStruct.x -V x -> Int' | -| 431 | cfg.swift:431:5:433:5 | MyLocalStruct.init | 'MyLocalStruct.init' | -| 431 | cfg.swift:431:12:433:5 | Block | 'Block' | -| 432 | cfg.swift:432:7:432:7 | x | 'x -> 10 -^ ... = ...' | -| 436 | cfg.swift:436:3:439:3 | enum MyLocalEnum | 'enum MyLocalEnum -V MyLocalEnum' | -| 437 | cfg.swift:437:10:437:10 | MyLocalEnum.A | 'MyLocalEnum.A -V A' | -| 438 | cfg.swift:438:10:438:10 | MyLocalEnum.B | 'MyLocalEnum.B -V B' | -| 441 | cfg.swift:441:3:441:22 | var myLocalVar | 'var myLocalVar -V myLocalVar -> Int' | -| 443 | cfg.swift:443:10:443:10 | 0 | '0 -^ ReturnExpr' | -| 446 | cfg.swift:446:1:448:1 | struct B | 'struct B -V B' | -| 447 | cfg.swift:447:3:447:13 | var B.x | 'var B.x -V x -> Int' | -| 450 | cfg.swift:450:1:454:1 | struct A | 'struct A -V A' | -| 451 | cfg.swift:451:3:451:11 | var A.b | 'var A.b -V b -> B' | -| 452 | cfg.swift:452:3:452:14 | var A.bs | 'var A.bs -V bs -> Array -> B -^ GenericTypeExpr' | -| 453 | cfg.swift:453:3:453:15 | var A.mayB | 'var A.mayB -V mayB -> Optional -> B -^ GenericTypeExpr' | -| 456 | cfg.swift:456:1:466:1 | func test | 'func test -V test' | -| 456 | cfg.swift:456:11:456:11 | a | 'a -> Block' | -| 457 | cfg.swift:457:3:457:24 | var kpGet_b_x | 'var kpGet_b_x -V kpGet_b_x -> ' | -| 458 | cfg.swift:458:3:458:31 | var kpGet_bs_0_x | 'var kpGet_bs_0_x -V kpGet_bs_0_x -> ' | -| 459 | cfg.swift:459:3:459:37 | var kpGet_mayB_force_x | 'var kpGet_mayB_force_x -V kpGet_mayB_force_x -> ' | -| 460 | cfg.swift:460:3:460:31 | var kpGet_mayB_x | 'var kpGet_mayB_x -V kpGet_mayB_x -> ' | -| 462 | cfg.swift:462:3:462:45 | var apply_kpGet_b_x | 'var apply_kpGet_b_x -V apply_kpGet_b_x -> a -> Argument -V kpGet_b_x -^ a(...)' | -| 463 | cfg.swift:463:3:463:51 | var apply_kpGet_bs_0_x | 'var apply_kpGet_bs_0_x -V apply_kpGet_bs_0_x -> a -> Argument -V kpGet_bs_0_x -^ a(...)' | -| 464 | cfg.swift:464:3:464:63 | var apply_kpGet_mayB_force_x | 'var apply_kpGet_mayB_force_x -V apply_kpGet_mayB_force_x -> a -> Argument -V kpGet_mayB_force_x -^ a(...)' | -| 465 | cfg.swift:465:3:465:51 | var apply_kpGet_mayB_x | 'var apply_kpGet_mayB_x -V apply_kpGet_mayB_x -> a -> Argument -V kpGet_mayB_x -^ a(...)' | -| 468 | cfg.swift:468:1:495:1 | func testIfConfig | 'func testIfConfig -V testIfConfig' | -| 468 | cfg.swift:468:21:495:1 | Block | 'Block' | -| 469 | cfg.swift:469:1:475:6 | | '' | -| 477 | cfg.swift:477:3:477:3 | 5 | '5' | -| 479 | cfg.swift:479:1:482:6 | | '' | -| 484 | cfg.swift:484:3:484:3 | 8 | '8' | -| 486 | cfg.swift:486:1:492:6 | | '' | -| 494 | cfg.swift:494:3:494:4 | 13 | '13' | -| 497 | cfg.swift:497:1:522:1 | func testAvailable | 'func testAvailable -V testAvailable' | -| 497 | cfg.swift:497:29:522:1 | Block | 'Block' | -| 498 | cfg.swift:498:3:498:11 | var x | 'var x -V x -> 0' | -| 500 | cfg.swift:500:3:502:3 | IfExpr | 'IfExpr -V ' | -| 500 | cfg.swift:500:30:502:3 | Block | 'Block' | -| 501 | cfg.swift:501:5:501:5 | x | 'x -> 1 -^ ... += ...' | -| 504 | cfg.swift:504:3:506:3 | IfExpr | 'IfExpr -V ' | -| 504 | cfg.swift:504:33:506:3 | Block | 'Block' | -| 505 | cfg.swift:505:5:505:5 | x | 'x -> 1 -^ ... += ...' | -| 508 | cfg.swift:508:3:510:3 | IfExpr | 'IfExpr -V ' | -| 508 | cfg.swift:508:49:510:3 | Block | 'Block' | -| 509 | cfg.swift:509:5:509:5 | x | 'x -> 1 -^ ... += ...' | -| 512 | cfg.swift:512:3:514:3 | GuardIfStmt | 'GuardIfStmt -V ' | -| 512 | cfg.swift:512:38:514:3 | Block | 'Block' | -| 513 | cfg.swift:513:5:513:5 | x | 'x -> 1 -^ ... += ...' | -| 516 | cfg.swift:516:3:519:3 | IfExpr | 'IfExpr -V ... && ... -V ' | -| 517 | cfg.swift:517:7:517:27 | | '' | -| 517 | cfg.swift:517:29:519:3 | Block | 'Block' | +| 143 | cfg.swift:143:3:145:3 | ForEachStmt | 'ForEachStmt -V 0 -> 10 -^ ... ... ...' | +| 143 | cfg.swift:143:7:143:7 | y | 'y -> y -> 5 -^ ... != ...' | +| 143 | cfg.swift:143:32:145:3 | Block | 'Block' | +| 144 | cfg.swift:144:5:144:9 | print | 'print -> Argument -V y -^ print(...)' | +| 147 | cfg.swift:147:3:160:3 | SwitchExpr | 'SwitchExpr -V x' | +| 148 | cfg.swift:148:5:150:17 | SwitchCase | 'SwitchCase -V 0 -> 1 -^ OrPattern' | +| 149 | cfg.swift:149:7:150:17 | Block | 'Block -V true -^ ReturnExpr' | +| 151 | cfg.swift:151:5:154:17 | SwitchCase | 'SwitchCase' | +| 151 | cfg.swift:151:10:151:10 | x | 'x -^ ConditionalPattern' | +| 152 | cfg.swift:152:9:153:17 | ... && ... | '... && ... -V x -> 2 -^ ... >= ...' | +| 153 | cfg.swift:153:13:153:13 | x | 'x -> 5 -^ ... < ...' | +| 154 | cfg.swift:154:7:154:17 | Block | 'Block -V true -^ ReturnExpr' | +| 155 | cfg.swift:155:5:157:17 | SwitchCase | 'SwitchCase -V 42' | +| 156 | cfg.swift:156:7:157:17 | Block | 'Block -V print -> Argument -V "42!" -^ print(...)' | +| 157 | cfg.swift:157:7:157:17 | | '' | +| 158 | cfg.swift:158:5:159:34 | SwitchCase | 'SwitchCase' | +| 159 | cfg.swift:159:7:159:34 | Block | 'Block -V IfExpr -V x -> 10 -^ ... > ...' | +| 159 | cfg.swift:159:19:159:34 | Block | 'Block -V false -^ ReturnExpr' | +| 162 | cfg.swift:162:3:162:31 | var obj | 'var obj -V obj -> AnyObject -> C -> Argument -V x -^ C(...)' | +| 163 | cfg.swift:163:3:165:3 | IfExpr | 'IfExpr -V obj -> C -^ TypeTestExpr' | +| 163 | cfg.swift:163:15:165:3 | Block | 'Block' | +| 164 | cfg.swift:164:12:164:15 | true | 'true -^ ReturnExpr' | +| 167 | cfg.swift:167:3:167:25 | let xOptional | 'let xOptional -V xOptional -> Optional -> Int -^ GenericTypeExpr -> x' | +| 168 | cfg.swift:168:3:172:3 | IfExpr | 'IfExpr -V xOptional -^ PatternGuardExpr' | +| 168 | cfg.swift:168:11:168:11 | . | '. -^ ... .some -> Argument -V x -^ ExprPattern -^ ... .some(...) -> Block' | +| 169 | cfg.swift:169:12:169:12 | x | 'x -> 0 -^ ... == ... -^ ReturnExpr' | +| 170 | cfg.swift:170:10:172:3 | Block | 'Block' | +| 171 | cfg.swift:171:12:171:16 | false | 'false -^ ReturnExpr' | +| 175 | cfg.swift:175:1:193:1 | func testDefer | 'func testDefer -V testDefer' | +| 175 | cfg.swift:175:16:175:16 | x | 'x -> Block' | +| 177 | cfg.swift:177:3:179:3 | DeferStmt | 'DeferStmt' | +| 177 | cfg.swift:177:9:179:3 | Block | 'Block' | +| 178 | cfg.swift:178:5:178:9 | print | 'print -> Argument -V "6" -^ print(...)' | +| 180 | cfg.swift:180:3:180:7 | print | 'print -> Argument -V "1" -^ print(...)' | +| 181 | cfg.swift:181:3:181:7 | print | 'print -> Argument -V "2" -^ print(...)' | +| 183 | cfg.swift:183:3:185:3 | DeferStmt | 'DeferStmt' | +| 183 | cfg.swift:183:9:185:3 | Block | 'Block' | +| 184 | cfg.swift:184:5:184:9 | print | 'print -> Argument -V "5" -^ print(...)' | +| 187 | cfg.swift:187:3:192:3 | DeferStmt | 'DeferStmt -V Block' | +| 188 | cfg.swift:188:5:188:9 | print | 'print -> Argument -V "3" -^ print(...)' | +| 189 | cfg.swift:189:5:191:5 | DeferStmt | 'DeferStmt -V Block' | +| 190 | cfg.swift:190:7:190:11 | print | 'print -> Argument -V "4" -^ print(...)' | +| 195 | cfg.swift:195:1:207:1 | func m1 | 'func m1 -V m1' | +| 195 | cfg.swift:195:9:195:9 | x | 'x -> Block' | +| 196 | cfg.swift:196:3:206:3 | IfExpr | 'IfExpr -V x -> 2 -^ ... > ...' | +| 196 | cfg.swift:196:12:198:3 | Block | 'Block' | +| 197 | cfg.swift:197:5:197:9 | print | 'print -> Argument -V "x is greater than 2" -^ print(...)' | +| 199 | cfg.swift:199:8:206:3 | IfExpr | 'IfExpr -V ... && ... -V ... && ... -V x -> 2 -^ ... <= ...' | +| 200 | cfg.swift:200:13:200:13 | x | 'x -> 0 -^ ... > ...' | +| 201 | cfg.swift:201:13:201:21 | ! ... | '! ... -V x -> 5 -^ ... == ...' | +| 201 | cfg.swift:201:23:203:3 | Block | 'Block' | +| 202 | cfg.swift:202:5:202:9 | print | 'print -> Argument -V "x is 1" -^ print(...)' | +| 204 | cfg.swift:204:8:206:3 | Block | 'Block' | +| 205 | cfg.swift:205:5:205:9 | print | 'print -> Argument -V "I can't guess the number" -^ print(...)' | +| 209 | cfg.swift:209:1:214:1 | func m2 | 'func m2 -V m2' | +| 209 | cfg.swift:209:9:209:9 | b | 'b' | +| 209 | cfg.swift:209:20:209:24 | false | 'false' | +| 209 | cfg.swift:209:34:214:1 | Block | 'Block' | +| 210 | cfg.swift:210:3:212:3 | IfExpr | 'IfExpr -V b' | +| 210 | cfg.swift:210:8:212:3 | Block | 'Block' | +| 211 | cfg.swift:211:12:211:12 | 0 | '0 -^ ReturnExpr' | +| 213 | cfg.swift:213:10:213:10 | 1 | '1 -^ ReturnExpr' | +| 216 | cfg.swift:216:1:224:1 | func m3 | 'func m3 -V m3' | +| 216 | cfg.swift:216:9:216:9 | x | 'x -> Block' | +| 217 | cfg.swift:217:3:222:3 | IfExpr | 'IfExpr -V x -> 0 -^ ... < ...' | +| 217 | cfg.swift:217:12:222:3 | Block | 'Block' | +| 218 | cfg.swift:218:5:218:5 | x | 'x -> x -^ - ... -^ ... = ...' | +| 219 | cfg.swift:219:5:221:5 | IfExpr | 'IfExpr -V x -> 10 -^ ... > ...' | +| 219 | cfg.swift:219:15:221:5 | Block | 'Block' | +| 220 | cfg.swift:220:7:220:7 | x | 'x -> x -> 1 -^ ... - ... -^ ... = ...' | +| 223 | cfg.swift:223:10:223:10 | x | 'x -^ ReturnExpr' | +| 226 | cfg.swift:226:1:232:1 | func m4 | 'func m4 -V m4' | +| 226 | cfg.swift:226:10:226:11 | b1 | 'b1 -> b2 -> b3 -> Block' | +| 227 | cfg.swift:227:3:231:20 | ReturnExpr | 'ReturnExpr' | +| 227 | cfg.swift:227:10:231:20 | IfExpr | 'IfExpr -V IfExpr -V b1' | +| 228 | cfg.swift:228:13:228:14 | b2 | 'b2' | +| 229 | cfg.swift:229:13:229:14 | b3 | 'b3' | +| 230 | cfg.swift:230:9:230:18 | "b2 \|\| b3" | '"b2 \|\| b3"' | +| 231 | cfg.swift:231:9:231:20 | "!b2 \|\| !b3" | '"!b2 \|\| !b3"' | +| 234 | cfg.swift:234:1:243:1 | func conversionsInSplitEntry | 'func conversionsInSplitEntry -V conversionsInSplitEntry' | +| 234 | cfg.swift:234:31:234:31 | b | 'b -> Block' | +| 235 | cfg.swift:235:3:242:3 | IfExpr | 'IfExpr -V IfExpr -V b' | +| 236 | cfg.swift:236:8:236:11 | true | 'true' | +| 237 | cfg.swift:237:7:237:10 | Bool | 'Bool -> Argument -V false -^ Bool(...)' | +| 237 | cfg.swift:237:19:239:3 | Block | 'Block' | +| 238 | cfg.swift:238:12:238:14 | "b" | '"b" -^ ReturnExpr' | +| 240 | cfg.swift:240:8:242:3 | Block | 'Block' | +| 241 | cfg.swift:241:12:241:15 | "!b" | '"!b" -^ ReturnExpr' | +| 245 | cfg.swift:245:1:249:1 | func constant_condition | 'func constant_condition -V constant_condition' | +| 245 | cfg.swift:245:27:249:1 | Block | 'Block' | +| 246 | cfg.swift:246:3:248:3 | IfExpr | 'IfExpr -V ! ... -V true' | +| 251 | cfg.swift:251:1:257:1 | func empty_else | 'func empty_else -V empty_else' | +| 251 | cfg.swift:251:17:251:17 | b | 'b -> Block' | +| 252 | cfg.swift:252:3:255:9 | IfExpr | 'IfExpr -V b' | +| 252 | cfg.swift:252:8:254:3 | Block | 'Block' | +| 253 | cfg.swift:253:5:253:9 | print | 'print -> Argument -V "true" -^ print(...)' | +| 255 | cfg.swift:255:8:255:9 | Block | 'Block' | +| 256 | cfg.swift:256:3:256:7 | print | 'print -> Argument -V "done" -^ print(...)' | +| 259 | cfg.swift:259:1:263:1 | func disjunct | 'func disjunct -V disjunct' | +| 259 | cfg.swift:259:16:259:17 | b1 | 'b1 -> b2 -> Block' | +| 260 | cfg.swift:260:3:262:3 | IfExpr | 'IfExpr -V ... \|\| ... -V b1' | +| 260 | cfg.swift:260:13:260:14 | b2 | 'b2' | +| 260 | cfg.swift:260:17:262:3 | Block | 'Block' | +| 261 | cfg.swift:261:5:261:9 | print | 'print -> Argument -V "b1 or b2" -^ print(...)' | +| 265 | cfg.swift:265:1:282:1 | func binaryExprs | 'func binaryExprs -V binaryExprs' | +| 265 | cfg.swift:265:18:265:18 | a | 'a -> b -> Block' | +| 266 | cfg.swift:266:3:266:15 | let c | 'let c -V c -> a -> b -^ ... + ...' | +| 267 | cfg.swift:267:3:267:15 | let d | 'let d -V d -> a -> b -^ ... - ...' | +| 268 | cfg.swift:268:3:268:15 | let e | 'let e -V e -> a -> b -^ ... * ...' | +| 269 | cfg.swift:269:3:269:15 | let f | 'let f -V f -> a -> b -^ ... / ...' | +| 270 | cfg.swift:270:3:270:15 | let g | 'let g -V g -> a -> b -^ ... % ...' | +| 271 | cfg.swift:271:3:271:15 | let h | 'let h -V h -> a -> b -^ ... & ...' | +| 272 | cfg.swift:272:3:272:15 | let i | 'let i -V i -> a -> b -^ ... \| ...' | +| 273 | cfg.swift:273:3:273:15 | let j | 'let j -V j -> a -> b -^ ... ^ ...' | +| 274 | cfg.swift:274:3:274:16 | let k | 'let k -V k -> a -> b -^ ... << ...' | +| 275 | cfg.swift:275:3:275:16 | let l | 'let l -V l -> a -> b -^ ... >> ...' | +| 276 | cfg.swift:276:3:276:16 | let o | 'let o -V o -> a -> b -^ ... == ...' | +| 277 | cfg.swift:277:3:277:16 | let p | 'let p -V p -> a -> b -^ ... != ...' | +| 278 | cfg.swift:278:3:278:15 | let q | 'let q -V q -> a -> b -^ ... < ...' | +| 279 | cfg.swift:279:3:279:16 | let r | 'let r -V r -> a -> b -^ ... <= ...' | +| 280 | cfg.swift:280:3:280:15 | let s | 'let s -V s -> a -> b -^ ... > ...' | +| 281 | cfg.swift:281:3:281:16 | let t | 'let t -V t -> a -> b -^ ... >= ...' | +| 284 | cfg.swift:284:1:286:1 | func interpolatedString | 'func interpolatedString -V interpolatedString' | +| 284 | cfg.swift:284:25:284:25 | x | 'x -> y -> Block' | +| 285 | cfg.swift:285:11:285:10 | | ' -> interpolation -> Argument -V x -^ interpolation(...) -> + -> interpolation -> Argument -V y -^ interpolation(...) -> is equal to -> interpolation -> Argument -V x -> y -^ ... + ... -^ interpolation(...) -> and here is a zero: -> interpolation -> Argument -V returnZero -^ returnZero(...) -^ interpolation(...) -> -^ StringInterpolationExpr -^ ReturnExpr' | +| 288 | cfg.swift:288:1:319:1 | func testSubscriptExpr | 'func testSubscriptExpr -V testSubscriptExpr' | +| 288 | cfg.swift:288:55:319:1 | Block | 'Block' | +| 289 | cfg.swift:289:3:289:44 | var a | 'var a -V a -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -^ ArrayLiteral' | +| 290 | cfg.swift:290:3:290:3 | a | 'a -> Argument -V 0 -^ a(...) -> 0 -^ ... = ...' | +| 291 | cfg.swift:291:3:291:3 | a | 'a -> Argument -V 1 -^ a(...) -> 1 -^ ... += ...' | +| 292 | cfg.swift:292:3:292:3 | a | 'a -> Argument -V 2 -^ a(...) -> 1 -^ ... -= ...' | +| 293 | cfg.swift:293:3:293:3 | a | 'a -> Argument -V 3 -^ a(...) -> 1 -^ ... *= ...' | +| 294 | cfg.swift:294:3:294:3 | a | 'a -> Argument -V 4 -^ a(...) -> 1 -^ ... /= ...' | +| 295 | cfg.swift:295:3:295:3 | a | 'a -> Argument -V 5 -^ a(...) -> 1 -^ ... %= ...' | +| 296 | cfg.swift:296:3:296:3 | a | 'a -> Argument -V 6 -^ a(...) -> 1 -^ ... &= ...' | +| 297 | cfg.swift:297:3:297:3 | a | 'a -> Argument -V 7 -^ a(...) -> 1 -^ ... \|= ...' | +| 298 | cfg.swift:298:3:298:3 | a | 'a -> Argument -V 8 -^ a(...) -> 1 -^ ... ^= ...' | +| 299 | cfg.swift:299:3:299:3 | a | 'a -> Argument -V 9 -^ a(...) -> 1 -^ ... <<= ...' | +| 300 | cfg.swift:300:3:300:3 | a | 'a -> Argument -V 10 -^ a(...) -> 1 -^ ... >>= ...' | +| 302 | cfg.swift:302:3:302:49 | var tupleWithA | 'var tupleWithA -V tupleWithA -> Argument -V a -> Argument -V 0 -^ a(...) -> Argument -V a -> Argument -V 1 -^ a(...) -> Argument -V a -> Argument -V 2 -^ a(...) -> Argument -V a -> Argument -V 3 -^ a(...) -> Argument -V a -> Argument -V 4 -^ a(...) -^ TupleExpr' | +| 304 | cfg.swift:304:3:304:48 | var b | 'var b -V b -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -^ ArrayLiteral' | +| 305 | cfg.swift:305:3:305:3 | b | 'b -> Argument -V 0 -^ b(...) -> a -> Argument -V 10 -^ a(...) -^ ... = ...' | +| 306 | cfg.swift:306:3:306:3 | b | 'b -> Argument -V 1 -^ b(...) -> b -> Argument -V 0 -^ b(...) -> 1 -^ ... + ... -^ ... = ...' | +| 307 | cfg.swift:307:3:307:3 | b | 'b -> Argument -V 2 -^ b(...) -> b -> Argument -V 1 -^ b(...) -> 1 -^ ... - ... -^ ... = ...' | +| 308 | cfg.swift:308:3:308:3 | b | 'b -> Argument -V 3 -^ b(...) -> b -> Argument -V 2 -^ b(...) -> 1 -^ ... * ... -^ ... = ...' | +| 309 | cfg.swift:309:3:309:3 | b | 'b -> Argument -V 4 -^ b(...) -> b -> Argument -V 3 -^ b(...) -> 1 -^ ... / ... -^ ... = ...' | +| 310 | cfg.swift:310:3:310:3 | b | 'b -> Argument -V 5 -^ b(...) -> b -> Argument -V 4 -^ b(...) -> 1 -^ ... % ... -^ ... = ...' | +| 311 | cfg.swift:311:3:311:3 | b | 'b -> Argument -V 6 -^ b(...) -> b -> Argument -V 5 -^ b(...) -> 1 -^ ... & ... -^ ... = ...' | +| 312 | cfg.swift:312:3:312:3 | b | 'b -> Argument -V 7 -^ b(...) -> b -> Argument -V 6 -^ b(...) -> 1 -^ ... \| ... -^ ... = ...' | +| 313 | cfg.swift:313:3:313:3 | b | 'b -> Argument -V 8 -^ b(...) -> b -> Argument -V 7 -^ b(...) -> 1 -^ ... ^ ... -^ ... = ...' | +| 314 | cfg.swift:314:3:314:3 | b | 'b -> Argument -V 9 -^ b(...) -> b -> Argument -V 8 -^ b(...) -> 1 -^ ... << ... -^ ... = ...' | +| 315 | cfg.swift:315:3:315:3 | b | 'b -> Argument -V 10 -^ b(...) -> b -> Argument -V 9 -^ b(...) -> 1 -^ ... >> ... -^ ... = ...' | +| 317 | cfg.swift:317:3:317:39 | let (pattern assignment) | 'let (pattern assignment) -V Argument -V a1 -> Argument -V a2 -> Argument -V a3 -> Argument -V a4 -> Argument -V a5 -^ TupleExpr -> tupleWithA' | +| 318 | cfg.swift:318:11:318:19 | Argument | 'Argument -V a1 -> b -> Argument -V 0 -^ b(...) -^ ... + ... -> Argument -V a2 -> b -> Argument -V 1 -^ b(...) -^ ... + ... -> Argument -V a3 -> b -> Argument -V 2 -^ b(...) -^ ... + ... -> Argument -V a4 -> b -> Argument -V 3 -^ b(...) -^ ... + ... -> Argument -V a5 -> b -> Argument -V 4 -^ b(...) -^ ... + ... -^ TupleExpr -^ ReturnExpr' | +| 321 | cfg.swift:321:1:326:1 | func loop1 | 'func loop1 -V loop1' | +| 321 | cfg.swift:321:12:321:12 | x | 'x -> Block' | +| 322 | cfg.swift:322:3:325:3 | WhileStmt | 'WhileStmt' | +| 322 | cfg.swift:322:9:322:9 | x | 'x -> 0 -^ ... >= ...' | +| 322 | cfg.swift:322:16:325:3 | Block | 'Block' | +| 323 | cfg.swift:323:5:323:9 | print | 'print -> Argument -V x -^ print(...)' | +| 324 | cfg.swift:324:5:324:5 | x | 'x -> 1 -^ ... -= ...' | +| 328 | cfg.swift:328:1:341:1 | func loop2 | 'func loop2 -V loop2' | +| 328 | cfg.swift:328:12:328:12 | x | 'x -> Block' | +| 329 | cfg.swift:329:3:339:3 | WhileStmt | 'WhileStmt' | +| 329 | cfg.swift:329:9:329:9 | x | 'x -> 0 -^ ... >= ...' | +| 329 | cfg.swift:329:16:339:3 | Block | 'Block' | +| 330 | cfg.swift:330:5:330:9 | print | 'print -> Argument -V x -^ print(...)' | +| 331 | cfg.swift:331:5:331:5 | x | 'x -> 1 -^ ... -= ...' | +| 332 | cfg.swift:332:5:337:5 | IfExpr | 'IfExpr -V x -> 100 -^ ... > ...' | +| 332 | cfg.swift:332:16:334:5 | Block | 'Block' | +| 333 | cfg.swift:333:7:333:11 | BreakExpr | 'BreakExpr' | +| 335 | cfg.swift:335:10:337:5 | IfExpr | 'IfExpr -V x -> 50 -^ ... > ...' | +| 335 | cfg.swift:335:20:337:5 | Block | 'Block' | +| 336 | cfg.swift:336:7:336:14 | ContinueExpr | 'ContinueExpr' | +| 338 | cfg.swift:338:5:338:9 | print | 'print -> Argument -V "Iter" -^ print(...)' | +| 340 | cfg.swift:340:3:340:7 | print | 'print -> Argument -V "Done" -^ print(...)' | +| 343 | cfg.swift:343:1:358:1 | func labeledLoop | 'func labeledLoop -V labeledLoop' | +| 343 | cfg.swift:343:18:343:18 | x | 'x -> Block' | +| 344 | cfg.swift:344:3:357:3 | LabeledStmt | 'LabeledStmt -V WhileStmt' | +| 344 | cfg.swift:344:16:344:16 | x | 'x -> 0 -^ ... >= ...' | +| 344 | cfg.swift:344:23:357:3 | Block | 'Block' | +| 345 | cfg.swift:345:5:355:5 | LabeledStmt | 'LabeledStmt -V WhileStmt' | +| 345 | cfg.swift:345:18:345:18 | x | 'x -> 0 -^ ... >= ...' | +| 345 | cfg.swift:345:25:355:5 | Block | 'Block' | +| 346 | cfg.swift:346:7:346:11 | print | 'print -> Argument -V x -^ print(...)' | +| 347 | cfg.swift:347:7:347:7 | x | 'x -> 1 -^ ... -= ...' | +| 348 | cfg.swift:348:7:353:7 | IfExpr | 'IfExpr -V x -> 100 -^ ... > ...' | +| 348 | cfg.swift:348:18:350:7 | Block | 'Block' | +| 349 | cfg.swift:349:9:349:19 | BreakExpr | 'BreakExpr' | +| 351 | cfg.swift:351:12:353:7 | IfExpr | 'IfExpr -V x -> 50 -^ ... > ...' | +| 351 | cfg.swift:351:22:353:7 | Block | 'Block' | +| 352 | cfg.swift:352:9:352:22 | ContinueExpr | 'ContinueExpr' | +| 354 | cfg.swift:354:7:354:11 | print | 'print -> Argument -V "Iter" -^ print(...)' | +| 356 | cfg.swift:356:5:356:9 | print | 'print -> Argument -V "Done" -^ print(...)' | +| 360 | cfg.swift:360:1:365:1 | func testRepeat | 'func testRepeat -V testRepeat' | +| 360 | cfg.swift:360:17:360:17 | x | 'x -> Block' | +| 361 | cfg.swift:361:3:364:16 | DoWhileStmt | 'DoWhileStmt' | +| 361 | cfg.swift:361:10:364:3 | Block | 'Block' | +| 362 | cfg.swift:362:5:362:9 | print | 'print -> Argument -V x -^ print(...)' | +| 363 | cfg.swift:363:5:363:5 | x | 'x -> 1 -^ ... -= ...' | +| 364 | cfg.swift:364:11:364:11 | x | 'x -> 0 -^ ... >= ...' | +| 367 | cfg.swift:367:1:372:1 | func loop_with_identity_expr | 'func loop_with_identity_expr -V loop_with_identity_expr' | +| 367 | cfg.swift:367:32:372:1 | Block | 'Block' | +| 368 | cfg.swift:368:3:368:11 | var x | 'var x -V x -> 0' | +| 369 | cfg.swift:369:3:371:3 | WhileStmt | 'WhileStmt' | +| 369 | cfg.swift:369:9:369:9 | x | 'x -> 10 -^ ... < ...' | +| 369 | cfg.swift:369:17:371:3 | Block | 'Block' | +| 370 | cfg.swift:370:5:370:5 | x | 'x -> 1 -^ ... += ...' | +| 374 | cfg.swift:374:1:383:1 | class OptionalC | 'class OptionalC -V OptionalC' | +| 375 | cfg.swift:375:3:375:11 | let OptionalC.c | 'let OptionalC.c -V c -> Optional -> C -^ GenericTypeExpr' | +| 376 | cfg.swift:376:3:378:3 | OptionalC.init | 'OptionalC.init' | +| 376 | cfg.swift:376:8:376:10 | arg | 'arg -> Block' | +| 377 | cfg.swift:377:5:377:5 | c | 'c -> arg -^ ... = ...' | +| 380 | cfg.swift:380:3:382:3 | func OptionalC.getOptional | 'func OptionalC.getOptional -V getOptional' | +| 380 | cfg.swift:380:28:382:3 | Block | 'Block' | +| 381 | cfg.swift:381:12:381:12 | c | 'c -^ ReturnExpr' | +| 385 | cfg.swift:385:1:387:1 | func testOptional | 'func testOptional -V testOptional' | +| 385 | cfg.swift:385:19:385:19 | c | 'c -> Block' | +| 386 | cfg.swift:386:10:386:10 | c | 'c -^ ... .getOptional -^ ... .getOptional(...) -^ ... .getMyInt -^ ... .getMyInt(...) -^ ReturnExpr' | +| 389 | cfg.swift:389:1:393:1 | func testCapture | 'func testCapture -V testCapture' | +| 389 | cfg.swift:389:18:389:18 | x | 'x -> y -> Block' | +| 390 | cfg.swift:390:13:390:21 | z | 'z -V z -> x -> y -^ ... + ... -> t -V t -> "literal" -^ FunctionExpr -^ ReturnExpr' | +| 391 | cfg.swift:391:5:391:12 | Block | 'Block -V z -^ ReturnExpr' | +| 395 | cfg.swift:395:1:397:1 | func testTupleElement | 'func testTupleElement -V testTupleElement' | +| 395 | cfg.swift:395:23:395:23 | t | 't -> Block' | +| 396 | cfg.swift:396:10:396:10 | t | 't -^ ... .a -> t -^ ... .1 -^ ... + ... -> t -^ ... .c -^ ... + ... -> Argument -V 1 -> Argument -V 2 -> Argument -V 3 -^ TupleExpr -^ ... .0 -^ ... + ... -^ ReturnExpr' | +| 399 | cfg.swift:399:1:403:1 | class Derived | 'class Derived -V Derived -> BaseType -V C' | +| 400 | cfg.swift:400:3:402:3 | Derived.init | 'Derived.init' | +| 400 | cfg.swift:400:10:402:3 | Block | 'Block' | +| 401 | cfg.swift:401:5:401:9 | super | 'super -^ ... .init -> Argument -V 0 -^ ... .init(...)' | +| 405 | cfg.swift:405:1:413:1 | func doWithoutCatch | 'func doWithoutCatch -V doWithoutCatch' | +| 405 | cfg.swift:405:21:405:21 | x | 'x -> Block' | +| 406 | cfg.swift:406:3:411:3 | TryExpr | 'TryExpr -V Block' | +| 407 | cfg.swift:407:5:407:24 | try ... | 'try ...' | +| 407 | cfg.swift:407:9:407:18 | mightThrow | 'mightThrow -> Argument -V 0 -^ mightThrow(...)' | +| 408 | cfg.swift:408:5:408:9 | print | 'print -> Argument -V "Did not throw." -^ print(...)' | +| 409 | cfg.swift:409:10:409:19 | mightThrow | 'mightThrow -> Argument -V 0 -^ mightThrow(...) -^ try! ...' | +| 410 | cfg.swift:410:5:410:9 | print | 'print -> Argument -V "Still did not throw." -^ print(...)' | +| 412 | cfg.swift:412:10:412:10 | 0 | '0 -^ ReturnExpr' | +| 415 | cfg.swift:415:1:424:1 | class Structors | 'class Structors -V Structors' | +| 416 | cfg.swift:416:3:416:16 | var Structors.field | 'var Structors.field -V field -> Int' | +| 417 | cfg.swift:417:3:419:3 | Structors.init | 'Structors.init' | +| 417 | cfg.swift:417:10:419:3 | Block | 'Block' | +| 418 | cfg.swift:418:5:418:9 | field | 'field -> 10 -^ ... = ...' | +| 421 | cfg.swift:421:3:423:3 | DestructorDeclaration | 'DestructorDeclaration' | +| 421 | cfg.swift:421:10:423:3 | Block | 'Block' | +| 422 | cfg.swift:422:5:422:9 | field | 'field -> 0 -^ ... = ...' | +| 426 | cfg.swift:426:1:428:1 | func dictionaryLiteral | 'func dictionaryLiteral -V dictionaryLiteral' | +| 426 | cfg.swift:426:24:426:24 | x | 'x -> y -> Block' | +| 427 | cfg.swift:427:11:427:13 | "x" | '"x" -> x -^ KeyValuePair -> "y" -> y -^ KeyValuePair -^ MapLiteral -^ ReturnExpr' | +| 430 | cfg.swift:430:1:453:1 | func localDeclarations | 'func localDeclarations -V localDeclarations' | +| 430 | cfg.swift:430:33:453:1 | Block | 'Block' | +| 431 | cfg.swift:431:3:436:3 | class MyLocalClass | 'class MyLocalClass -V MyLocalClass' | +| 432 | cfg.swift:432:5:432:14 | var MyLocalClass.x | 'var MyLocalClass.x -V x -> Int' | +| 433 | cfg.swift:433:5:435:5 | MyLocalClass.init | 'MyLocalClass.init' | +| 433 | cfg.swift:433:12:435:5 | Block | 'Block' | +| 434 | cfg.swift:434:7:434:7 | x | 'x -> 10 -^ ... = ...' | +| 438 | cfg.swift:438:3:443:3 | struct MyLocalStruct | 'struct MyLocalStruct -V MyLocalStruct' | +| 439 | cfg.swift:439:5:439:14 | var MyLocalStruct.x | 'var MyLocalStruct.x -V x -> Int' | +| 440 | cfg.swift:440:5:442:5 | MyLocalStruct.init | 'MyLocalStruct.init' | +| 440 | cfg.swift:440:12:442:5 | Block | 'Block' | +| 441 | cfg.swift:441:7:441:7 | x | 'x -> 10 -^ ... = ...' | +| 445 | cfg.swift:445:3:448:3 | enum MyLocalEnum | 'enum MyLocalEnum -V MyLocalEnum' | +| 446 | cfg.swift:446:10:446:10 | MyLocalEnum.A | 'MyLocalEnum.A -V A' | +| 447 | cfg.swift:447:10:447:10 | MyLocalEnum.B | 'MyLocalEnum.B -V B' | +| 450 | cfg.swift:450:3:450:22 | var myLocalVar | 'var myLocalVar -V myLocalVar -> Int' | +| 452 | cfg.swift:452:10:452:10 | 0 | '0 -^ ReturnExpr' | +| 455 | cfg.swift:455:1:457:1 | struct B | 'struct B -V B' | +| 456 | cfg.swift:456:3:456:13 | var B.x | 'var B.x -V x -> Int' | +| 459 | cfg.swift:459:1:463:1 | struct A | 'struct A -V A' | +| 460 | cfg.swift:460:3:460:11 | var A.b | 'var A.b -V b -> B' | +| 461 | cfg.swift:461:3:461:14 | var A.bs | 'var A.bs -V bs -> Array -> B -^ GenericTypeExpr' | +| 462 | cfg.swift:462:3:462:15 | var A.mayB | 'var A.mayB -V mayB -> Optional -> B -^ GenericTypeExpr' | +| 465 | cfg.swift:465:1:475:1 | func test | 'func test -V test' | +| 465 | cfg.swift:465:11:465:11 | a | 'a -> Block' | +| 466 | cfg.swift:466:3:466:24 | var kpGet_b_x | 'var kpGet_b_x -V kpGet_b_x -> ' | +| 467 | cfg.swift:467:3:467:31 | var kpGet_bs_0_x | 'var kpGet_bs_0_x -V kpGet_bs_0_x -> ' | +| 468 | cfg.swift:468:3:468:37 | var kpGet_mayB_force_x | 'var kpGet_mayB_force_x -V kpGet_mayB_force_x -> ' | +| 469 | cfg.swift:469:3:469:31 | var kpGet_mayB_x | 'var kpGet_mayB_x -V kpGet_mayB_x -> ' | +| 471 | cfg.swift:471:3:471:45 | var apply_kpGet_b_x | 'var apply_kpGet_b_x -V apply_kpGet_b_x -> a -> Argument -V kpGet_b_x -^ a(...)' | +| 472 | cfg.swift:472:3:472:51 | var apply_kpGet_bs_0_x | 'var apply_kpGet_bs_0_x -V apply_kpGet_bs_0_x -> a -> Argument -V kpGet_bs_0_x -^ a(...)' | +| 473 | cfg.swift:473:3:473:63 | var apply_kpGet_mayB_force_x | 'var apply_kpGet_mayB_force_x -V apply_kpGet_mayB_force_x -> a -> Argument -V kpGet_mayB_force_x -^ a(...)' | +| 474 | cfg.swift:474:3:474:51 | var apply_kpGet_mayB_x | 'var apply_kpGet_mayB_x -V apply_kpGet_mayB_x -> a -> Argument -V kpGet_mayB_x -^ a(...)' | +| 477 | cfg.swift:477:1:504:1 | func testIfConfig | 'func testIfConfig -V testIfConfig' | +| 477 | cfg.swift:477:21:504:1 | Block | 'Block' | +| 478 | cfg.swift:478:1:484:6 | | '' | +| 486 | cfg.swift:486:3:486:3 | 5 | '5' | +| 488 | cfg.swift:488:1:491:6 | | '' | +| 493 | cfg.swift:493:3:493:3 | 8 | '8' | +| 495 | cfg.swift:495:1:501:6 | | '' | +| 503 | cfg.swift:503:3:503:4 | 13 | '13' | +| 506 | cfg.swift:506:1:531:1 | func testAvailable | 'func testAvailable -V testAvailable' | +| 506 | cfg.swift:506:29:531:1 | Block | 'Block' | +| 507 | cfg.swift:507:3:507:11 | var x | 'var x -V x -> 0' | +| 509 | cfg.swift:509:3:511:3 | IfExpr | 'IfExpr -V ' | +| 509 | cfg.swift:509:30:511:3 | Block | 'Block' | +| 510 | cfg.swift:510:5:510:5 | x | 'x -> 1 -^ ... += ...' | +| 513 | cfg.swift:513:3:515:3 | IfExpr | 'IfExpr -V ' | +| 513 | cfg.swift:513:33:515:3 | Block | 'Block' | +| 514 | cfg.swift:514:5:514:5 | x | 'x -> 1 -^ ... += ...' | +| 517 | cfg.swift:517:3:519:3 | IfExpr | 'IfExpr -V ' | +| 517 | cfg.swift:517:49:519:3 | Block | 'Block' | | 518 | cfg.swift:518:5:518:5 | x | 'x -> 1 -^ ... += ...' | -| 521 | cfg.swift:521:10:521:10 | x | 'x -^ ReturnExpr' | -| 524 | cfg.swift:524:1:538:1 | func testAsyncFor | 'func testAsyncFor -V testAsyncFor' | -| 524 | cfg.swift:524:28:538:1 | Block | 'Block' | -| 525 | cfg.swift:525:5:533:6 | var stream | 'var stream -V stream -> AsyncStream -> Argument -V Int -^ ... .self -> Argument -V . -^ ... .bufferingNewest -> Argument -V 5 -^ ... .bufferingNewest(...) -> Argument -V FunctionExpr -^ AsyncStream(...)' | -| 526 | cfg.swift:526:9:526:20 | continuation | 'continuation' | -| 527 | cfg.swift:527:13:532:13 | Block | 'Block -V Task -^ ... .detached -> Argument -V FunctionExpr -^ ... .detached(...)' | -| 528 | cfg.swift:528:17:531:37 | Block | 'Block -V ForEachStmt -V 1 -> 100 -^ ... ... ...' | -| 528 | cfg.swift:528:21:528:21 | i | 'i -> Block' | -| 529 | cfg.swift:529:21:529:32 | continuation | 'continuation -^ ... .yield -> Argument -V i -^ ... .yield(...)' | -| 531 | cfg.swift:531:17:531:28 | continuation | 'continuation -^ ... .finish -^ ... .finish(...)' | -| 535 | cfg.swift:535:5:537:5 | ForEachStmt | 'ForEachStmt -V stream' | -| 535 | cfg.swift:535:19:535:19 | i | 'i -> Block' | -| 536 | cfg.swift:536:9:536:13 | print | 'print -> Argument -V i -^ print(...)' | -| 540 | cfg.swift:540:1:544:1 | func testNilCoalescing | 'func testNilCoalescing -V testNilCoalescing' | -| 540 | cfg.swift:540:24:540:24 | x | 'x -> Block' | -| 541 | cfg.swift:541:3:543:9 | ReturnExpr | 'ReturnExpr' | -| 542 | cfg.swift:542:5:543:9 | ... ?? ... | '... ?? ... -V x' | -| 543 | cfg.swift:543:9:543:9 | 0 | '0' | -| 546 | cfg.swift:546:1:553:1 | func testNilCoalescing2 | 'func testNilCoalescing2 -V testNilCoalescing2' | -| 546 | cfg.swift:546:25:546:25 | x | 'x -> Block' | -| 547 | cfg.swift:547:3:552:3 | IfExpr | 'IfExpr -V ... ?? ... -V x' | -| 548 | cfg.swift:548:7:548:11 | false | 'false' | -| 548 | cfg.swift:548:13:550:3 | Block | 'Block' | -| 549 | cfg.swift:549:12:549:12 | 1 | '1 -^ ReturnExpr' | -| 550 | cfg.swift:550:10:552:3 | Block | 'Block' | -| 551 | cfg.swift:551:12:551:12 | 0 | '0 -^ ReturnExpr' | -| 555 | cfg.swift:555:1:557:1 | func usesAutoclosure | 'func usesAutoclosure -V usesAutoclosure' | -| 555 | cfg.swift:555:24:555:27 | expr | 'expr -> Block' | -| 556 | cfg.swift:556:10:556:13 | expr | 'expr -^ expr(...) -^ ReturnExpr' | -| 559 | cfg.swift:559:1:561:1 | func autoclosureTest | 'func autoclosureTest -V autoclosureTest' | -| 559 | cfg.swift:559:24:561:1 | Block | 'Block' | -| 560 | cfg.swift:560:3:560:17 | usesAutoclosure | 'usesAutoclosure -> Argument -V 1 -^ usesAutoclosure(...)' | -| 565 | cfg.swift:565:1:567:1 | protocol MyProtocol | 'protocol MyProtocol -V MyProtocol' | -| 566 | cfg.swift:566:2:566:1 | Block | 'Block' | -| 566 | cfg.swift:566:2:566:21 | func MyProtocol.source | 'func MyProtocol.source -V source' | -| 569 | cfg.swift:569:1:571:1 | class MyProcotolImpl | 'class MyProcotolImpl -V MyProcotolImpl -> BaseType -V MyProtocol' | -| 570 | cfg.swift:570:2:570:34 | func MyProcotolImpl.source | 'func MyProcotolImpl.source -V source' | -| 570 | cfg.swift:570:23:570:34 | Block | 'Block -V 0 -^ ReturnExpr' | -| 573 | cfg.swift:573:1:573:62 | func getMyProtocol | 'func getMyProtocol -V getMyProtocol' | -| 573 | cfg.swift:573:36:573:62 | Block | 'Block -V MyProcotolImpl -^ MyProcotolImpl(...) -^ ReturnExpr' | -| 574 | cfg.swift:574:1:574:70 | func getMyProtocolImpl | 'func getMyProtocolImpl -V getMyProtocolImpl' | -| 574 | cfg.swift:574:44:574:70 | Block | 'Block -V MyProcotolImpl -^ MyProcotolImpl(...) -^ ReturnExpr' | -| 576 | cfg.swift:576:1:576:23 | func sink | 'func sink -V sink' | -| 576 | cfg.swift:576:11:576:13 | arg | 'arg -> Block' | -| 578 | cfg.swift:578:1:583:1 | func testOpenExistentialExpr | 'func testOpenExistentialExpr -V testOpenExistentialExpr' | -| 578 | cfg.swift:578:30:578:30 | x | 'x -> y -> Block' | -| 579 | cfg.swift:579:2:579:5 | sink | 'sink -> Argument -V x -^ ... .source -^ ... .source(...) -^ sink(...)' | -| 580 | cfg.swift:580:2:580:5 | sink | 'sink -> Argument -V y -^ ... .source -^ ... .source(...) -^ sink(...)' | -| 581 | cfg.swift:581:2:581:5 | sink | 'sink -> Argument -V getMyProtocol -^ getMyProtocol(...) -^ ... .source -^ ... .source(...) -^ sink(...)' | -| 582 | cfg.swift:582:2:582:5 | sink | 'sink -> Argument -V getMyProtocolImpl -^ getMyProtocolImpl(...) -^ ... .source -^ ... .source(...) -^ sink(...)' | -| 585 | cfg.swift:585:1:593:1 | func singleStmtExpr | 'func singleStmtExpr -V singleStmtExpr' | -| 585 | cfg.swift:585:23:585:23 | x | 'x -> Block' | -| 586 | cfg.swift:586:3:589:3 | let a | 'let a -V a -> SwitchExpr -V x' | -| 587 | cfg.swift:587:5:587:17 | SwitchCase | 'SwitchCase -V 0 -> 5 -^ ... ..< ...' | -| 587 | cfg.swift:587:17:587:17 | Block | 'Block -V 1' | -| 588 | cfg.swift:588:5:588:14 | SwitchCase | 'SwitchCase -V Block -V 2' | -| 590 | cfg.swift:590:3:592:18 | let b | 'let b -V b' | -| 591 | cfg.swift:591:9:592:18 | IfExpr | 'IfExpr -V x -> 42 -^ ... < ...' | -| 591 | cfg.swift:591:21:591:25 | Block | 'Block -V 1' | -| 592 | cfg.swift:592:14:592:18 | Block | 'Block -V 2' | -| 596 | cfg.swift:596:1:598:1 | struct ValueGenericsStruct | 'struct ValueGenericsStruct -V ValueGenericsStruct -> TypeParameter -V N -> Int' | -| 597 | cfg.swift:597:5:597:13 | var ValueGenericsStruct.x | 'var ValueGenericsStruct.x -V x -> N' | -| 600 | cfg.swift:600:1:604:1 | func valueGenericsFn | 'func valueGenericsFn -V valueGenericsFn' | -| 600 | cfg.swift:600:36:600:40 | value | 'value -> Block' | -| 601 | cfg.swift:601:5:601:13 | var x | 'var x -V x -> N' | -| 602 | cfg.swift:602:5:602:9 | print | 'print -> Argument -V x -^ print(...)' | -| 603 | cfg.swift:603:5:603:5 | _ | '_ -> value -^ ... = ...' | +| 521 | cfg.swift:521:3:523:3 | GuardIfStmt | 'GuardIfStmt -V ' | +| 521 | cfg.swift:521:38:523:3 | Block | 'Block' | +| 522 | cfg.swift:522:5:522:5 | x | 'x -> 1 -^ ... += ...' | +| 525 | cfg.swift:525:3:528:3 | IfExpr | 'IfExpr -V ... && ... -V ' | +| 526 | cfg.swift:526:7:526:27 | | '' | +| 526 | cfg.swift:526:29:528:3 | Block | 'Block' | +| 527 | cfg.swift:527:5:527:5 | x | 'x -> 1 -^ ... += ...' | +| 530 | cfg.swift:530:10:530:10 | x | 'x -^ ReturnExpr' | +| 533 | cfg.swift:533:1:547:1 | func testAsyncFor | 'func testAsyncFor -V testAsyncFor' | +| 533 | cfg.swift:533:28:547:1 | Block | 'Block' | +| 534 | cfg.swift:534:5:542:6 | var stream | 'var stream -V stream -> AsyncStream -> Argument -V Int -^ ... .self -> Argument -V . -^ ... .bufferingNewest -> Argument -V 5 -^ ... .bufferingNewest(...) -> Argument -V FunctionExpr -^ AsyncStream(...)' | +| 535 | cfg.swift:535:9:535:20 | continuation | 'continuation' | +| 536 | cfg.swift:536:13:541:13 | Block | 'Block -V Task -^ ... .detached -> Argument -V FunctionExpr -^ ... .detached(...)' | +| 537 | cfg.swift:537:17:540:37 | Block | 'Block -V ForEachStmt -V 1 -> 100 -^ ... ... ...' | +| 537 | cfg.swift:537:21:537:21 | i | 'i -> Block' | +| 538 | cfg.swift:538:21:538:32 | continuation | 'continuation -^ ... .yield -> Argument -V i -^ ... .yield(...)' | +| 540 | cfg.swift:540:17:540:28 | continuation | 'continuation -^ ... .finish -^ ... .finish(...)' | +| 544 | cfg.swift:544:5:546:5 | ForEachStmt | 'ForEachStmt -V stream' | +| 544 | cfg.swift:544:19:544:19 | i | 'i -> Block' | +| 545 | cfg.swift:545:9:545:13 | print | 'print -> Argument -V i -^ print(...)' | +| 549 | cfg.swift:549:1:553:1 | func testNilCoalescing | 'func testNilCoalescing -V testNilCoalescing' | +| 549 | cfg.swift:549:24:549:24 | x | 'x -> Block' | +| 550 | cfg.swift:550:3:552:9 | ReturnExpr | 'ReturnExpr' | +| 551 | cfg.swift:551:5:552:9 | ... ?? ... | '... ?? ... -V x' | +| 552 | cfg.swift:552:9:552:9 | 0 | '0' | +| 555 | cfg.swift:555:1:562:1 | func testNilCoalescing2 | 'func testNilCoalescing2 -V testNilCoalescing2' | +| 555 | cfg.swift:555:25:555:25 | x | 'x -> Block' | +| 556 | cfg.swift:556:3:561:3 | IfExpr | 'IfExpr -V ... ?? ... -V x' | +| 557 | cfg.swift:557:7:557:11 | false | 'false' | +| 557 | cfg.swift:557:13:559:3 | Block | 'Block' | +| 558 | cfg.swift:558:12:558:12 | 1 | '1 -^ ReturnExpr' | +| 559 | cfg.swift:559:10:561:3 | Block | 'Block' | +| 560 | cfg.swift:560:12:560:12 | 0 | '0 -^ ReturnExpr' | +| 564 | cfg.swift:564:1:566:1 | func usesAutoclosure | 'func usesAutoclosure -V usesAutoclosure' | +| 564 | cfg.swift:564:24:564:27 | expr | 'expr -> Block' | +| 565 | cfg.swift:565:10:565:13 | expr | 'expr -^ expr(...) -^ ReturnExpr' | +| 568 | cfg.swift:568:1:570:1 | func autoclosureTest | 'func autoclosureTest -V autoclosureTest' | +| 568 | cfg.swift:568:24:570:1 | Block | 'Block' | +| 569 | cfg.swift:569:3:569:17 | usesAutoclosure | 'usesAutoclosure -> Argument -V 1 -^ usesAutoclosure(...)' | +| 574 | cfg.swift:574:1:576:1 | protocol MyProtocol | 'protocol MyProtocol -V MyProtocol' | +| 575 | cfg.swift:575:2:575:1 | Block | 'Block' | +| 575 | cfg.swift:575:2:575:21 | func MyProtocol.source | 'func MyProtocol.source -V source' | +| 578 | cfg.swift:578:1:580:1 | class MyProcotolImpl | 'class MyProcotolImpl -V MyProcotolImpl -> BaseType -V MyProtocol' | +| 579 | cfg.swift:579:2:579:34 | func MyProcotolImpl.source | 'func MyProcotolImpl.source -V source' | +| 579 | cfg.swift:579:23:579:34 | Block | 'Block -V 0 -^ ReturnExpr' | +| 582 | cfg.swift:582:1:582:62 | func getMyProtocol | 'func getMyProtocol -V getMyProtocol' | +| 582 | cfg.swift:582:36:582:62 | Block | 'Block -V MyProcotolImpl -^ MyProcotolImpl(...) -^ ReturnExpr' | +| 583 | cfg.swift:583:1:583:70 | func getMyProtocolImpl | 'func getMyProtocolImpl -V getMyProtocolImpl' | +| 583 | cfg.swift:583:44:583:70 | Block | 'Block -V MyProcotolImpl -^ MyProcotolImpl(...) -^ ReturnExpr' | +| 585 | cfg.swift:585:1:585:23 | func sink | 'func sink -V sink' | +| 585 | cfg.swift:585:11:585:13 | arg | 'arg -> Block' | +| 587 | cfg.swift:587:1:592:1 | func testOpenExistentialExpr | 'func testOpenExistentialExpr -V testOpenExistentialExpr' | +| 587 | cfg.swift:587:30:587:30 | x | 'x -> y -> Block' | +| 588 | cfg.swift:588:2:588:5 | sink | 'sink -> Argument -V x -^ ... .source -^ ... .source(...) -^ sink(...)' | +| 589 | cfg.swift:589:2:589:5 | sink | 'sink -> Argument -V y -^ ... .source -^ ... .source(...) -^ sink(...)' | +| 590 | cfg.swift:590:2:590:5 | sink | 'sink -> Argument -V getMyProtocol -^ getMyProtocol(...) -^ ... .source -^ ... .source(...) -^ sink(...)' | +| 591 | cfg.swift:591:2:591:5 | sink | 'sink -> Argument -V getMyProtocolImpl -^ getMyProtocolImpl(...) -^ ... .source -^ ... .source(...) -^ sink(...)' | +| 594 | cfg.swift:594:1:602:1 | func singleStmtExpr | 'func singleStmtExpr -V singleStmtExpr' | +| 594 | cfg.swift:594:23:594:23 | x | 'x -> Block' | +| 595 | cfg.swift:595:3:598:3 | let a | 'let a -V a -> SwitchExpr -V x' | +| 596 | cfg.swift:596:5:596:17 | SwitchCase | 'SwitchCase -V 0 -> 5 -^ ... ..< ...' | +| 596 | cfg.swift:596:17:596:17 | Block | 'Block -V 1' | +| 597 | cfg.swift:597:5:597:14 | SwitchCase | 'SwitchCase -V Block -V 2' | +| 599 | cfg.swift:599:3:601:18 | let b | 'let b -V b' | +| 600 | cfg.swift:600:9:601:18 | IfExpr | 'IfExpr -V x -> 42 -^ ... < ...' | +| 600 | cfg.swift:600:21:600:25 | Block | 'Block -V 1' | +| 601 | cfg.swift:601:14:601:18 | Block | 'Block -V 2' | +| 605 | cfg.swift:605:1:607:1 | struct ValueGenericsStruct | 'struct ValueGenericsStruct -V ValueGenericsStruct -> TypeParameter -V N -> Int' | +| 606 | cfg.swift:606:5:606:13 | var ValueGenericsStruct.x | 'var ValueGenericsStruct.x -V x -> N' | +| 609 | cfg.swift:609:1:613:1 | func valueGenericsFn | 'func valueGenericsFn -V valueGenericsFn' | +| 609 | cfg.swift:609:36:609:40 | value | 'value -> Block' | +| 610 | cfg.swift:610:5:610:13 | var x | 'var x -V x -> N' | +| 611 | cfg.swift:611:5:611:9 | print | 'print -> Argument -V x -^ print(...)' | +| 612 | cfg.swift:612:5:612:5 | _ | '_ -> value -^ ... = ...' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.expected b/unified/ql/test/library-tests/controlflow/cfg.expected index 52ba36cd4454..8d4900d5fdbc 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.expected +++ b/unified/ql/test/library-tests/controlflow/cfg.expected @@ -1,4 +1,8 @@ bbContinues +| cfg.swift:177:3:177:3 | DeferStmt | 'DeferStmt goto print(+3)' | +| cfg.swift:183:3:183:3 | DeferStmt | 'DeferStmt goto DeferStmt(+4)' | +| cfg.swift:184:5:184:14 | print(...) | 'print(...) goto Block(-7)' | +| cfg.swift:190:7:190:16 | print(...) | 'print(...) goto Block(-7)' | bbStep | cfg.swift:20:9:20:14 | ... >= ... | '... >= ... : false -> Block(+0)' | | cfg.swift:20:9:20:14 | ... >= ... | '... >= ... : true -> GuardIfStmt(+3)' | @@ -14,119 +18,138 @@ bbStep | cfg.swift:39:11:39:20 | | ' : no-match -> CatchClause(+2)' | | cfg.swift:40:5:40:20 | print(...) | 'print(...) : successor -> 0(+4)' | | cfg.swift:42:5:42:35 | print(...) | 'print(...) : successor -> 0(+2)' | -| cfg.swift:140:12:140:17 | ... ... ... | '... ... ... : empty -> SwitchExpr(+3)' | +| cfg.swift:140:12:140:17 | ... ... ... | '... ... ... : empty -> ForEachStmt(+3)' | | cfg.swift:140:12:140:17 | ... ... ... | '... ... ... : non-empty -> _(+0)' | -| cfg.swift:141:9:141:12 | Block | 'Block : successor -> SwitchExpr(+2)' | +| cfg.swift:141:9:141:12 | Block | 'Block : successor -> ForEachStmt(+2)' | | cfg.swift:141:9:141:12 | Block | 'Block : successor -> _(-1)' | -| cfg.swift:144:10:144:13 | OrPattern | 'OrPattern : match -> Block(+1)' | -| cfg.swift:144:10:144:13 | OrPattern | 'OrPattern : no-match -> SwitchCase(+3)' | -| cfg.swift:147:10:147:10 | ConditionalPattern | 'ConditionalPattern : match -> Block(+3)' | -| cfg.swift:147:10:147:10 | ConditionalPattern | 'ConditionalPattern : no-match -> SwitchCase(+4)' | -| cfg.swift:148:10:148:15 | ... >= ... | '... >= ... : false -> x(-1)' | -| cfg.swift:148:10:148:15 | ... >= ... | '... >= ... : true -> x(+1)' | -| cfg.swift:149:13:149:17 | ... < ... | '... < ... : successor -> x(-2)' | -| cfg.swift:187:6:187:10 | ... > ... | '... > ... : false -> IfExpr(+3)' | -| cfg.swift:187:6:187:10 | ... > ... | '... > ... : true -> Block(+0)' | -| cfg.swift:190:11:190:16 | ... <= ... | '... <= ... : false,false,false -> Block(+5)' | -| cfg.swift:190:11:190:16 | ... <= ... | '... <= ... : true -> x(+1)' | -| cfg.swift:191:13:191:17 | ... > ... | '... > ... : false,false,false -> Block(+4)' | -| cfg.swift:191:13:191:17 | ... > ... | '... > ... : true -> ! ...(+1)' | -| cfg.swift:192:15:192:20 | ... == ... | '... == ... : false -> Block(+0)' | -| cfg.swift:192:15:192:20 | ... == ... | '... == ... : true,false -> Block(+3)' | -| cfg.swift:201:6:201:6 | b | 'b : false -> 1(+3)' | -| cfg.swift:201:6:201:6 | b | 'b : true -> Block(+0)' | -| cfg.swift:208:6:208:10 | ... < ... | '... < ... : false -> x(+6)' | -| cfg.swift:208:6:208:10 | ... < ... | '... < ... : true -> Block(+0)' | -| cfg.swift:210:8:210:13 | ... > ... | '... > ... : false -> x(+4)' | -| cfg.swift:210:8:210:13 | ... > ... | '... > ... : true -> Block(+0)' | -| cfg.swift:211:7:211:15 | ... = ... | '... = ... : successor -> x(+3)' | -| cfg.swift:218:11:218:12 | b1 | 'b1 : false -> b3(+2)' | -| cfg.swift:218:11:218:12 | b1 | 'b1 : true -> b2(+1)' | -| cfg.swift:219:13:219:14 | b2 | 'b2 : false,false -> "!b2 \|\| !b3"(+3)' | -| cfg.swift:219:13:219:14 | b2 | 'b2 : true,true -> "b2 \|\| b3"(+2)' | -| cfg.swift:220:13:220:14 | b3 | 'b3 : false,false -> "!b2 \|\| !b3"(+2)' | -| cfg.swift:220:13:220:14 | b3 | 'b3 : true,true -> "b2 \|\| b3"(+1)' | -| cfg.swift:221:9:221:18 | "b2 \|\| b3" | '"b2 \|\| b3" : successor -> ReturnExpr(-3)' | -| cfg.swift:222:9:222:20 | "!b2 \|\| !b3" | '"!b2 \|\| !b3" : successor -> ReturnExpr(-4)' | -| cfg.swift:226:6:226:6 | b | 'b : false -> Bool(+2)' | -| cfg.swift:226:6:226:6 | b | 'b : true -> true(+1)' | -| cfg.swift:227:8:227:11 | true | 'true : true -> Block(+1)' | -| cfg.swift:228:7:228:17 | Bool(...) | 'Bool(...) : false -> Block(+3)' | -| cfg.swift:228:7:228:17 | Bool(...) | 'Bool(...) : true,true -> Block(+0)' | -| cfg.swift:243:6:243:6 | b | 'b : false -> Block(+3)' | -| cfg.swift:243:6:243:6 | b | 'b : true -> Block(+0)' | -| cfg.swift:244:5:244:17 | print(...) | 'print(...) : successor -> print(+3)' | -| cfg.swift:246:8:246:9 | Block | 'Block : successor -> print(+1)' | -| cfg.swift:251:7:251:8 | b1 | 'b1 : false -> b2(+0)' | -| cfg.swift:251:7:251:8 | b1 | 'b1 : true,true -> Block(+0)' | -| cfg.swift:251:13:251:14 | b2 | 'b2 : true,true -> Block(+0)' | -| cfg.swift:313:3:313:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | -| cfg.swift:313:9:313:14 | ... >= ... | '... >= ... : true -> Block(+0)' | -| cfg.swift:315:5:315:10 | ... -= ... | '... -= ... : successor -> x(-2)' | -| cfg.swift:320:3:320:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | -| cfg.swift:320:9:320:14 | ... >= ... | '... >= ... : false -> print(+11)' | -| cfg.swift:320:9:320:14 | ... >= ... | '... >= ... : true -> Block(+0)' | -| cfg.swift:323:8:323:14 | ... > ... | '... > ... : false -> IfExpr(+3)' | -| cfg.swift:323:8:323:14 | ... > ... | '... > ... : true -> Block(+0)' | -| cfg.swift:324:7:324:11 | BreakExpr | 'BreakExpr : break -> print(+7)' | -| cfg.swift:326:13:326:18 | ... > ... | '... > ... : false -> print(+3)' | -| cfg.swift:326:13:326:18 | ... > ... | '... > ... : true -> Block(+0)' | -| cfg.swift:327:7:327:14 | ContinueExpr | 'ContinueExpr : continue -> x(-7)' | -| cfg.swift:329:5:329:17 | print(...) | 'print(...) : successor -> x(-9)' | -| cfg.swift:335:10:335:10 | WhileStmt | 'WhileStmt : successor -> x(+0)' | -| cfg.swift:335:16:335:21 | ... >= ... | '... >= ... : true -> Block(+0)' | -| cfg.swift:336:12:336:12 | WhileStmt | 'WhileStmt : successor -> x(+0)' | -| cfg.swift:336:18:336:23 | ... >= ... | '... >= ... : false -> print(+11)' | -| cfg.swift:336:18:336:23 | ... >= ... | '... >= ... : true -> Block(+0)' | -| cfg.swift:339:10:339:16 | ... > ... | '... > ... : false -> IfExpr(+3)' | -| cfg.swift:339:10:339:16 | ... > ... | '... > ... : true -> Block(+0)' | -| cfg.swift:342:15:342:20 | ... > ... | '... > ... : false -> print(+3)' | -| cfg.swift:342:15:342:20 | ... > ... | '... > ... : true -> Block(+0)' | -| cfg.swift:343:9:343:22 | ContinueExpr | 'ContinueExpr : continue -> x(-7)' | -| cfg.swift:345:7:345:19 | print(...) | 'print(...) : successor -> x(-9)' | -| cfg.swift:347:5:347:17 | print(...) | 'print(...) : successor -> x(-12)' | -| cfg.swift:352:3:352:3 | DoWhileStmt | 'DoWhileStmt : successor -> Block(+0)' | -| cfg.swift:355:11:355:16 | ... >= ... | '... >= ... : true -> Block(-3)' | -| cfg.swift:360:3:360:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | -| cfg.swift:360:9:360:14 | ... < ... | '... < ... : true -> Block(+0)' | -| cfg.swift:361:5:361:10 | ... += ... | '... += ... : successor -> x(-1)' | -| cfg.swift:398:9:398:24 | mightThrow(...) | 'mightThrow(...) : successor -> try ...(+0)' | -| cfg.swift:500:6:500:28 | | ' : false -> IfExpr(+4)' | -| cfg.swift:500:6:500:28 | | ' : true -> Block(+0)' | -| cfg.swift:501:5:501:10 | ... += ... | '... += ... : successor -> IfExpr(+3)' | -| cfg.swift:504:6:504:31 | | ' : false -> IfExpr(+4)' | -| cfg.swift:504:6:504:31 | | ' : true -> Block(+0)' | -| cfg.swift:505:5:505:10 | ... += ... | '... += ... : successor -> IfExpr(+3)' | -| cfg.swift:508:6:508:47 | | ' : false -> GuardIfStmt(+4)' | -| cfg.swift:508:6:508:47 | | ' : true -> Block(+0)' | -| cfg.swift:509:5:509:10 | ... += ... | '... += ... : successor -> GuardIfStmt(+3)' | -| cfg.swift:512:9:512:31 | | ' : false -> Block(+0)' | -| cfg.swift:512:9:512:31 | | ' : true -> IfExpr(+4)' | -| cfg.swift:513:5:513:10 | ... += ... | '... += ... : successor -> IfExpr(+3)' | -| cfg.swift:516:6:516:28 | | ' : false,false -> x(+5)' | -| cfg.swift:516:6:516:28 | | ' : true -> (+1)' | -| cfg.swift:517:7:517:27 | | ' : false,false -> x(+4)' | -| cfg.swift:517:7:517:27 | | ' : true -> Block(+0)' | -| cfg.swift:518:5:518:10 | ... += ... | '... += ... : successor -> x(+3)' | -| cfg.swift:528:26:528:32 | ... ... ... | '... ... ... : empty -> continuation(+3)' | -| cfg.swift:528:26:528:32 | ... ... ... | '... ... ... : non-empty -> i(+0)' | -| cfg.swift:529:21:529:41 | ... .yield(...) | '... .yield(...) : successor -> continuation(+2)' | -| cfg.swift:529:21:529:41 | ... .yield(...) | '... .yield(...) : successor -> i(-1)' | -| cfg.swift:535:24:535:29 | stream | 'stream : non-empty -> i(+0)' | -| cfg.swift:536:9:536:16 | print(...) | 'print(...) : successor -> i(-1)' | -| cfg.swift:542:5:542:5 | x | 'x : non-null -> ReturnExpr(-1)' | -| cfg.swift:542:5:542:5 | x | 'x : null -> 0(+1)' | -| cfg.swift:543:9:543:9 | 0 | '0 : successor -> ReturnExpr(-2)' | -| cfg.swift:547:6:547:6 | x | 'x : non-null,false -> Block(+3)' | -| cfg.swift:547:6:547:6 | x | 'x : non-null,true -> Block(+1)' | -| cfg.swift:547:6:547:6 | x | 'x : null -> false(+1)' | -| cfg.swift:548:7:548:11 | false | 'false : false -> Block(+2)' | -| cfg.swift:587:10:587:14 | ... ..< ... | '... ..< ... : match -> Block(+0)' | -| cfg.swift:587:10:587:14 | ... ..< ... | '... ..< ... : no-match -> SwitchCase(+1)' | -| cfg.swift:587:17:587:17 | 1 | '1 : successor -> let b(+3)' | -| cfg.swift:588:14:588:14 | 2 | '2 : successor -> let b(+2)' | -| cfg.swift:591:13:591:18 | ... < ... | '... < ... : false -> Block(+1)' | -| cfg.swift:591:13:591:18 | ... < ... | '... < ... : true -> Block(+0)' | +| cfg.swift:143:12:143:17 | ... ... ... | '... ... ... : empty -> SwitchExpr(+4)' | +| cfg.swift:143:12:143:17 | ... ... ... | '... ... ... : non-empty -> y(+0)' | +| cfg.swift:143:25:143:30 | ... != ... | '... != ... : false -> SwitchExpr(+4)' | +| cfg.swift:143:25:143:30 | ... != ... | '... != ... : false -> y(+0)' | +| cfg.swift:143:25:143:30 | ... != ... | '... != ... : true -> Block(+0)' | +| cfg.swift:144:5:144:12 | print(...) | 'print(...) : successor -> SwitchExpr(+3)' | +| cfg.swift:144:5:144:12 | print(...) | 'print(...) : successor -> y(-1)' | +| cfg.swift:148:10:148:13 | OrPattern | 'OrPattern : match -> Block(+1)' | +| cfg.swift:148:10:148:13 | OrPattern | 'OrPattern : no-match -> SwitchCase(+3)' | +| cfg.swift:151:10:151:10 | ConditionalPattern | 'ConditionalPattern : match -> Block(+3)' | +| cfg.swift:151:10:151:10 | ConditionalPattern | 'ConditionalPattern : no-match -> SwitchCase(+4)' | +| cfg.swift:152:10:152:15 | ... >= ... | '... >= ... : false -> x(-1)' | +| cfg.swift:152:10:152:15 | ... >= ... | '... >= ... : true -> x(+1)' | +| cfg.swift:153:13:153:17 | ... < ... | '... < ... : successor -> x(-2)' | +| cfg.swift:155:10:155:11 | 42 | '42 : match -> Block(+1)' | +| cfg.swift:155:10:155:11 | 42 | '42 : no-match -> SwitchCase(+3)' | +| cfg.swift:157:7:157:17 | | ' : successor -> var obj(+5)' | +| cfg.swift:159:11:159:16 | ... > ... | '... > ... : false -> var obj(+3)' | +| cfg.swift:159:11:159:16 | ... > ... | '... > ... : true -> Block(+0)' | +| cfg.swift:163:6:163:13 | TypeTestExpr | 'TypeTestExpr : false -> let xOptional(+4)' | +| cfg.swift:163:6:163:13 | TypeTestExpr | 'TypeTestExpr : true -> Block(+0)' | +| cfg.swift:168:6:168:34 | PatternGuardExpr | 'PatternGuardExpr : false -> Block(+2)' | +| cfg.swift:168:6:168:34 | PatternGuardExpr | 'PatternGuardExpr : true -> .(+0)' | +| cfg.swift:196:6:196:10 | ... > ... | '... > ... : false -> IfExpr(+3)' | +| cfg.swift:196:6:196:10 | ... > ... | '... > ... : true -> Block(+0)' | +| cfg.swift:199:11:199:16 | ... <= ... | '... <= ... : false,false,false -> Block(+5)' | +| cfg.swift:199:11:199:16 | ... <= ... | '... <= ... : true -> x(+1)' | +| cfg.swift:200:13:200:17 | ... > ... | '... > ... : false,false,false -> Block(+4)' | +| cfg.swift:200:13:200:17 | ... > ... | '... > ... : true -> ! ...(+1)' | +| cfg.swift:201:15:201:20 | ... == ... | '... == ... : false -> Block(+0)' | +| cfg.swift:201:15:201:20 | ... == ... | '... == ... : true,false -> Block(+3)' | +| cfg.swift:209:9:209:9 | b | 'b : match -> Block(+0)' | +| cfg.swift:209:9:209:9 | b | 'b : no-match -> false(+0)' | +| cfg.swift:209:20:209:24 | false | 'false : successor -> Block(+0)' | +| cfg.swift:210:6:210:6 | b | 'b : false -> 1(+3)' | +| cfg.swift:210:6:210:6 | b | 'b : true -> Block(+0)' | +| cfg.swift:217:6:217:10 | ... < ... | '... < ... : false -> x(+6)' | +| cfg.swift:217:6:217:10 | ... < ... | '... < ... : true -> Block(+0)' | +| cfg.swift:219:8:219:13 | ... > ... | '... > ... : false -> x(+4)' | +| cfg.swift:219:8:219:13 | ... > ... | '... > ... : true -> Block(+0)' | +| cfg.swift:220:7:220:15 | ... = ... | '... = ... : successor -> x(+3)' | +| cfg.swift:227:11:227:12 | b1 | 'b1 : false -> b3(+2)' | +| cfg.swift:227:11:227:12 | b1 | 'b1 : true -> b2(+1)' | +| cfg.swift:228:13:228:14 | b2 | 'b2 : false,false -> "!b2 \|\| !b3"(+3)' | +| cfg.swift:228:13:228:14 | b2 | 'b2 : true,true -> "b2 \|\| b3"(+2)' | +| cfg.swift:229:13:229:14 | b3 | 'b3 : false,false -> "!b2 \|\| !b3"(+2)' | +| cfg.swift:229:13:229:14 | b3 | 'b3 : true,true -> "b2 \|\| b3"(+1)' | +| cfg.swift:230:9:230:18 | "b2 \|\| b3" | '"b2 \|\| b3" : successor -> ReturnExpr(-3)' | +| cfg.swift:231:9:231:20 | "!b2 \|\| !b3" | '"!b2 \|\| !b3" : successor -> ReturnExpr(-4)' | +| cfg.swift:235:6:235:6 | b | 'b : false -> Bool(+2)' | +| cfg.swift:235:6:235:6 | b | 'b : true -> true(+1)' | +| cfg.swift:236:8:236:11 | true | 'true : true -> Block(+1)' | +| cfg.swift:237:7:237:17 | Bool(...) | 'Bool(...) : false -> Block(+3)' | +| cfg.swift:237:7:237:17 | Bool(...) | 'Bool(...) : true,true -> Block(+0)' | +| cfg.swift:252:6:252:6 | b | 'b : false -> Block(+3)' | +| cfg.swift:252:6:252:6 | b | 'b : true -> Block(+0)' | +| cfg.swift:253:5:253:17 | print(...) | 'print(...) : successor -> print(+3)' | +| cfg.swift:255:8:255:9 | Block | 'Block : successor -> print(+1)' | +| cfg.swift:260:7:260:8 | b1 | 'b1 : false -> b2(+0)' | +| cfg.swift:260:7:260:8 | b1 | 'b1 : true,true -> Block(+0)' | +| cfg.swift:260:13:260:14 | b2 | 'b2 : true,true -> Block(+0)' | +| cfg.swift:322:3:322:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | +| cfg.swift:322:9:322:14 | ... >= ... | '... >= ... : true -> Block(+0)' | +| cfg.swift:324:5:324:10 | ... -= ... | '... -= ... : successor -> x(-2)' | +| cfg.swift:329:3:329:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | +| cfg.swift:329:9:329:14 | ... >= ... | '... >= ... : false -> print(+11)' | +| cfg.swift:329:9:329:14 | ... >= ... | '... >= ... : true -> Block(+0)' | +| cfg.swift:332:8:332:14 | ... > ... | '... > ... : false -> IfExpr(+3)' | +| cfg.swift:332:8:332:14 | ... > ... | '... > ... : true -> Block(+0)' | +| cfg.swift:333:7:333:11 | BreakExpr | 'BreakExpr : break -> print(+7)' | +| cfg.swift:335:13:335:18 | ... > ... | '... > ... : false -> print(+3)' | +| cfg.swift:335:13:335:18 | ... > ... | '... > ... : true -> Block(+0)' | +| cfg.swift:336:7:336:14 | ContinueExpr | 'ContinueExpr : continue -> x(-7)' | +| cfg.swift:338:5:338:17 | print(...) | 'print(...) : successor -> x(-9)' | +| cfg.swift:344:10:344:10 | WhileStmt | 'WhileStmt : successor -> x(+0)' | +| cfg.swift:344:16:344:21 | ... >= ... | '... >= ... : true -> Block(+0)' | +| cfg.swift:345:12:345:12 | WhileStmt | 'WhileStmt : successor -> x(+0)' | +| cfg.swift:345:18:345:23 | ... >= ... | '... >= ... : false -> print(+11)' | +| cfg.swift:345:18:345:23 | ... >= ... | '... >= ... : true -> Block(+0)' | +| cfg.swift:348:10:348:16 | ... > ... | '... > ... : false -> IfExpr(+3)' | +| cfg.swift:348:10:348:16 | ... > ... | '... > ... : true -> Block(+0)' | +| cfg.swift:351:15:351:20 | ... > ... | '... > ... : false -> print(+3)' | +| cfg.swift:351:15:351:20 | ... > ... | '... > ... : true -> Block(+0)' | +| cfg.swift:352:9:352:22 | ContinueExpr | 'ContinueExpr : continue -> x(-7)' | +| cfg.swift:354:7:354:19 | print(...) | 'print(...) : successor -> x(-9)' | +| cfg.swift:356:5:356:17 | print(...) | 'print(...) : successor -> x(-12)' | +| cfg.swift:361:3:361:3 | DoWhileStmt | 'DoWhileStmt : successor -> Block(+0)' | +| cfg.swift:364:11:364:16 | ... >= ... | '... >= ... : true -> Block(-3)' | +| cfg.swift:369:3:369:3 | WhileStmt | 'WhileStmt : successor -> x(+0)' | +| cfg.swift:369:9:369:14 | ... < ... | '... < ... : true -> Block(+0)' | +| cfg.swift:370:5:370:10 | ... += ... | '... += ... : successor -> x(-1)' | +| cfg.swift:407:9:407:24 | mightThrow(...) | 'mightThrow(...) : successor -> try ...(+0)' | +| cfg.swift:509:6:509:28 | | ' : false -> IfExpr(+4)' | +| cfg.swift:509:6:509:28 | | ' : true -> Block(+0)' | +| cfg.swift:510:5:510:10 | ... += ... | '... += ... : successor -> IfExpr(+3)' | +| cfg.swift:513:6:513:31 | | ' : false -> IfExpr(+4)' | +| cfg.swift:513:6:513:31 | | ' : true -> Block(+0)' | +| cfg.swift:514:5:514:10 | ... += ... | '... += ... : successor -> IfExpr(+3)' | +| cfg.swift:517:6:517:47 | | ' : false -> GuardIfStmt(+4)' | +| cfg.swift:517:6:517:47 | | ' : true -> Block(+0)' | +| cfg.swift:518:5:518:10 | ... += ... | '... += ... : successor -> GuardIfStmt(+3)' | +| cfg.swift:521:9:521:31 | | ' : false -> Block(+0)' | +| cfg.swift:521:9:521:31 | | ' : true -> IfExpr(+4)' | +| cfg.swift:522:5:522:10 | ... += ... | '... += ... : successor -> IfExpr(+3)' | +| cfg.swift:525:6:525:28 | | ' : false,false -> x(+5)' | +| cfg.swift:525:6:525:28 | | ' : true -> (+1)' | +| cfg.swift:526:7:526:27 | | ' : false,false -> x(+4)' | +| cfg.swift:526:7:526:27 | | ' : true -> Block(+0)' | +| cfg.swift:527:5:527:10 | ... += ... | '... += ... : successor -> x(+3)' | +| cfg.swift:537:26:537:32 | ... ... ... | '... ... ... : empty -> continuation(+3)' | +| cfg.swift:537:26:537:32 | ... ... ... | '... ... ... : non-empty -> i(+0)' | +| cfg.swift:538:21:538:41 | ... .yield(...) | '... .yield(...) : successor -> continuation(+2)' | +| cfg.swift:538:21:538:41 | ... .yield(...) | '... .yield(...) : successor -> i(-1)' | +| cfg.swift:544:24:544:29 | stream | 'stream : non-empty -> i(+0)' | +| cfg.swift:545:9:545:16 | print(...) | 'print(...) : successor -> i(-1)' | +| cfg.swift:551:5:551:5 | x | 'x : non-null -> ReturnExpr(-1)' | +| cfg.swift:551:5:551:5 | x | 'x : null -> 0(+1)' | +| cfg.swift:552:9:552:9 | 0 | '0 : successor -> ReturnExpr(-2)' | +| cfg.swift:556:6:556:6 | x | 'x : non-null,false -> Block(+3)' | +| cfg.swift:556:6:556:6 | x | 'x : non-null,true -> Block(+1)' | +| cfg.swift:556:6:556:6 | x | 'x : null -> false(+1)' | +| cfg.swift:557:7:557:11 | false | 'false : false -> Block(+2)' | +| cfg.swift:596:10:596:14 | ... ..< ... | '... ..< ... : match -> Block(+0)' | +| cfg.swift:596:10:596:14 | ... ..< ... | '... ..< ... : no-match -> SwitchCase(+1)' | +| cfg.swift:596:17:596:17 | 1 | '1 : successor -> let b(+3)' | +| cfg.swift:597:14:597:14 | 2 | '2 : successor -> let b(+2)' | +| cfg.swift:600:13:600:18 | ... < ... | '... < ... : false -> Block(+1)' | +| cfg.swift:600:13:600:18 | ... < ... | '... < ... : true -> Block(+0)' | noCfg | cfg.swift:47:42:47:47 | String | | cfg.swift:53:34:53:34 | _ | @@ -134,24 +157,17 @@ noCfg | cfg.swift:77:34:77:33 | Optional | | cfg.swift:83:21:83:23 | Int | | cfg.swift:106:22:106:24 | Int | -| cfg.swift:146:7:146:17 | ReturnExpr | -| cfg.swift:155:3:155:5 | var | -| cfg.swift:156:6:156:8 | obj | -| cfg.swift:157:5:157:15 | ReturnExpr | -| cfg.swift:160:3:160:5 | let | -| cfg.swift:161:6:161:34 | PatternGuardExpr | -| cfg.swift:162:5:162:17 | ReturnExpr | -| cfg.swift:164:5:164:16 | ReturnExpr | -| cfg.swift:238:5:238:9 | print | -| cfg.swift:279:29:279:53 | TupleExpr | -| cfg.swift:371:25:371:24 | Optional | -| cfg.swift:380:45:380:47 | Int | -| cfg.swift:391:3:391:6 | init | -| cfg.swift:408:3:408:6 | init | -| cfg.swift:421:29:421:31 | Int | -| cfg.swift:424:5:424:8 | init | -| cfg.swift:431:5:431:8 | init | -| cfg.swift:497:25:497:27 | Int | +| cfg.swift:150:7:150:17 | ReturnExpr | +| cfg.swift:247:5:247:9 | print | +| cfg.swift:288:29:288:53 | TupleExpr | +| cfg.swift:380:25:380:24 | Optional | +| cfg.swift:389:45:389:47 | Int | +| cfg.swift:400:3:400:6 | init | +| cfg.swift:417:3:417:6 | init | +| cfg.swift:430:29:430:31 | Int | +| cfg.swift:433:5:433:8 | init | +| cfg.swift:440:5:440:8 | init | +| cfg.swift:506:25:506:27 | Int | nonSimple | cfg.swift:12:17:12:25 | withParam | 'withParam -? Block' | | cfg.swift:35:5:35:5 | CatchClause | 'CatchClause -V MyError -^ ... .error1 -> isZero -> Argument -V x -^ isZero(...) -? MyError -^ ... .error2 -^ ConditionalPattern -^ OrPattern' | diff --git a/unified/ql/test/library-tests/controlflow/cfg.swift b/unified/ql/test/library-tests/controlflow/cfg.swift index 14c231837044..e6d9582efea3 100644 --- a/unified/ql/test/library-tests/controlflow/cfg.swift +++ b/unified/ql/test/library-tests/controlflow/cfg.swift @@ -137,8 +137,12 @@ func testMemberRef(param : C, inoutParam : inout C, opt : C?) { } func patterns(x : Int) -> Bool { - for _ in 0...10 // $ bbStep='... ... ... : empty -> SwitchExpr(+3)' bbStep='... ... ... : non-empty -> _(+0)' - { } // $ bbStep='Block : successor -> _(-1)' bbStep='Block : successor -> SwitchExpr(+2)' + for _ in 0...10 // $ bbStep='... ... ... : empty -> ForEachStmt(+3)' bbStep='... ... ... : non-empty -> _(+0)' + { } // $ bbStep='Block : successor -> _(-1)' bbStep='Block : successor -> ForEachStmt(+2)' + + for y in 0...10 where y != 5 { // $ bbStep='... ... ... : empty -> SwitchExpr(+4)' bbStep='... ... ... : non-empty -> y(+0)' bbStep='... != ... : false -> SwitchExpr(+4)' bbStep='... != ... : false -> y(+0)' bbStep='... != ... : true -> Block(+0)' + print(y) // $ bbStep='print(...) : successor -> SwitchExpr(+3)' bbStep='print(...) : successor -> y(-1)' + } switch x { case 0, 1: // $ bbStep='OrPattern : match -> Block(+1)' bbStep='OrPattern : no-match -> SwitchCase(+3)' @@ -148,37 +152,42 @@ func patterns(x : Int) -> Bool { (x >= 2) && // $ bbStep='... >= ... : false -> x(-1)' bbStep='... >= ... : true -> x(+1)' x < 5: // $ bbStep='... < ... : successor -> x(-2)' return true + case 42: // $ bbStep='42 : match -> Block(+1)' bbStep='42 : no-match -> SwitchCase(+3)' + print("42!") + fallthrough // $ bbStep=' : successor -> var obj(+5)' default: - return false + if (x > 10) { return false } // $ bbStep='... > ... : false -> var obj(+3)' bbStep='... > ... : true -> Block(+0)' } - var obj : AnyObject = C(n: x) // $ noCfg - if obj is C { // $ noCfg - return true // $ noCfg + var obj : AnyObject = C(n: x) + if obj is C { // $ bbStep='TypeTestExpr : false -> let xOptional(+4)' bbStep='TypeTestExpr : true -> Block(+0)' + return true } - let xOptional: Int? = x // $ noCfg - if case .some(let x) = xOptional { // $ noCfg - return x == 0 // $ noCfg + let xOptional: Int? = x + if case .some(let x) = xOptional { // $ bbStep='PatternGuardExpr : false -> Block(+2)' bbStep='PatternGuardExpr : true -> .(+0)' + return x == 0 } else { - return false // $ noCfg + return false } } func testDefer(x : inout Int) { - // Will print 1, 2, 3, 4 - defer { - print("4") + // Will print 1, 2, 3, 4, 5, 6 + defer { // $ bbContinues='DeferStmt goto print(+3)' + print("6") } + print("1") + print("2") - defer { - print("3") + defer { // $ bbContinues='DeferStmt goto DeferStmt(+4)' + print("5") // $ bbContinues='print(...) goto Block(-7)' } defer { - print("1") - defer { - print("2") + print("3") + defer { + print("4") // $ bbContinues='print(...) goto Block(-7)' } } } @@ -197,7 +206,7 @@ func m1(x : Int) { } } -func m2(b : Bool) -> Int { +func m2(b : Bool = false) -> Int { // $ bbStep='b : match -> Block(+0)' bbStep='b : no-match -> false(+0)' bbStep='false : successor -> Block(+0)' if b { // $ bbStep='b : false -> 1(+3)' bbStep='b : true -> Block(+0)' return 0 }