diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 3c32dfc6c2d..d9897b438d8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -153,6 +153,8 @@ public class JetControlFlowProcessor { @Override public void visitParenthesizedExpression(JetParenthesizedExpression expression) { + builder.read(expression); + JetExpression innerExpression = expression.getExpression(); if (innerExpression != null) { value(innerExpression, inCondition); @@ -340,6 +342,7 @@ public class JetControlFlowProcessor { @Override public void visitTryExpression(JetTryExpression expression) { + builder.read(expression); final JetFinallySection finallyBlock = expression.getFinallyBlock(); if (finallyBlock != null) { builder.enterTryFinally(new GenerationTrigger() { @@ -413,6 +416,7 @@ public class JetControlFlowProcessor { @Override public void visitWhileExpression(JetWhileExpression expression) { + builder.read(expression); LoopInfo loopInfo = builder.enterLoop(expression, null, null); builder.bindLabel(loopInfo.getConditionEntryPoint()); @@ -434,6 +438,7 @@ public class JetControlFlowProcessor { @Override public void visitDoWhileExpression(JetDoWhileExpression expression) { + builder.read(expression); LoopInfo loopInfo = builder.enterLoop(expression, null, null); builder.bindLabel(loopInfo.getBodyEntryPoint()); @@ -453,6 +458,7 @@ public class JetControlFlowProcessor { @Override public void visitForExpression(JetForExpression expression) { + builder.read(expression); JetExpression loopRange = expression.getLoopRange(); if (loopRange != null) { value(loopRange, false); diff --git a/compiler/testData/cfg/Finally.instructions b/compiler/testData/cfg/Finally.instructions index 7e727d1d705..140aa447092 100644 --- a/compiler/testData/cfg/Finally.instructions +++ b/compiler/testData/cfg/Finally.instructions @@ -8,17 +8,22 @@ fun t1() { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[r(2)] PREV:[] + NEXT:[r(try { 1 } finally { 2 }) ] PREV:[] + r(try { + 1 + } finally { + 2 + }) NEXT:[r(1)] PREV:[] + r(1) NEXT:[r(2)] PREV:[r(try { 1 } finally { 2 }) ] l2: - r(2) NEXT:[] PREV:[r(1)] + r(2) NEXT:[] PREV:[r(1)] l1: l3: - NEXT:[] PREV:[r(2)] + NEXT:[] PREV:[r(2)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t2 == fun t2() { @@ -33,28 +38,36 @@ fun t2() { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[r(2)] PREV:[] - r(2) NEXT:[r(3)] PREV:[r(1)] - r(3) NEXT:[r(>)] PREV:[r(2)] - r(>) NEXT:[r(2 > 3)] PREV:[r(3)] - r(2 > 3) NEXT:[jf(l2)] PREV:[r(>)] - jf(l2) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] - r(2) NEXT:[ret l1] PREV:[jf(l2)] - ret l1 NEXT:[] PREV:[r(2)] -- jmp(l3) NEXT:[r(2)] PREV:[] + NEXT:[r(try { 1 if (2 > 3) { retur..)] PREV:[] + r(try { + 1 + if (2 > 3) { + return + } + } finally { + 2 + }) NEXT:[r(1)] PREV:[] + r(1) NEXT:[r(2)] PREV:[r(try { 1 if (2 > 3) { retur..)] + r(2) NEXT:[r(3)] PREV:[r(1)] + r(3) NEXT:[r(>)] PREV:[r(2)] + r(>) NEXT:[r(2 > 3)] PREV:[r(3)] + r(2 > 3) NEXT:[jf(l2)] PREV:[r(>)] + jf(l2) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] + r(2) NEXT:[ret l1] PREV:[jf(l2)] + ret l1 NEXT:[] PREV:[r(2)] +- jmp(l3) NEXT:[r(2)] PREV:[] l2: - read (Unit) NEXT:[r(2)] PREV:[jf(l2)] + read (Unit) NEXT:[r(2)] PREV:[jf(l2)] l3: l4: - r(2) NEXT:[] PREV:[read (Unit)] + r(2) NEXT:[] PREV:[read (Unit)] l1: l5: - NEXT:[] PREV:[ret l1, r(2)] + NEXT:[] PREV:[ret l1, r(2)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == anonymous_0 == { () => @@ -64,8 +77,9 @@ sink: } --------------------- l3: - NEXT:[r(2)] PREV:[] - r(2) NEXT:[r(3)] PREV:[] + NEXT:[r(())] PREV:[] + r(()) NEXT:[r(2)] PREV:[] + r(2) NEXT:[r(3)] PREV:[r(())] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(l5)] PREV:[r(>)] @@ -97,8 +111,18 @@ fun t3() { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[jmp?(l2)] PREV:[] + NEXT:[r(try { 1 @{ () => if (2 > 3..)] PREV:[] + r(try { + 1 + @{ () => + if (2 > 3) { + return@ + } + } + } finally { + 2 + }) NEXT:[r(1)] PREV:[] + r(1) NEXT:[jmp?(l2)] PREV:[r(try { 1 @{ () => if (2 > 3..)] jmp?(l2) NEXT:[r({ () => if (2 > 3) { retur..), d({ () => if (2 > 3) { retur..)] PREV:[r(1)] d({ () => if (2 > 3) { @@ -121,8 +145,9 @@ error: sink: NEXT:[] PREV:[d({ () => if (2 > 3) { retur..), ] l3: - NEXT:[r(2)] PREV:[] - r(2) NEXT:[r(3)] PREV:[] + NEXT:[r(())] PREV:[] + r(()) NEXT:[r(2)] PREV:[] + r(2) NEXT:[r(3)] PREV:[r(())] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(l5)] PREV:[r(>)] @@ -152,28 +177,37 @@ sink: } --------------------- l3: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[r(2)] PREV:[] - r(2) NEXT:[r(3)] PREV:[r(1)] - r(3) NEXT:[r(>)] PREV:[r(2)] - r(>) NEXT:[r(2 > 3)] PREV:[r(3)] - r(2 > 3) NEXT:[jf(l5)] PREV:[r(>)] - jf(l5) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] - r(2) NEXT:[ret l4] PREV:[jf(l5)] - ret l4 NEXT:[] PREV:[r(2)] -- jmp(l6) NEXT:[r(2)] PREV:[] + NEXT:[r(())] PREV:[] + r(()) NEXT:[r(try { 1 if (2 > 3) { retur..)] PREV:[] + r(try { + 1 + if (2 > 3) { + return@ + } + } finally { + 2 + }) NEXT:[r(1)] PREV:[r(())] + r(1) NEXT:[r(2)] PREV:[r(try { 1 if (2 > 3) { retur..)] + r(2) NEXT:[r(3)] PREV:[r(1)] + r(3) NEXT:[r(>)] PREV:[r(2)] + r(>) NEXT:[r(2 > 3)] PREV:[r(3)] + r(2 > 3) NEXT:[jf(l5)] PREV:[r(>)] + jf(l5) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] + r(2) NEXT:[ret l4] PREV:[jf(l5)] + ret l4 NEXT:[] PREV:[r(2)] +- jmp(l6) NEXT:[r(2)] PREV:[] l5: - read (Unit) NEXT:[r(2)] PREV:[jf(l5)] + read (Unit) NEXT:[r(2)] PREV:[jf(l5)] l6: l7: - r(2) NEXT:[] PREV:[read (Unit)] + r(2) NEXT:[] PREV:[read (Unit)] l4: l8: - NEXT:[] PREV:[ret l4, r(2)] + NEXT:[] PREV:[ret l4, r(2)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t4 == fun t4() { @@ -220,28 +254,37 @@ error: sink: NEXT:[] PREV:[d({ () => try { 1 if (2 > 3)..), ] l3: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[r(2)] PREV:[] - r(2) NEXT:[r(3)] PREV:[r(1)] - r(3) NEXT:[r(>)] PREV:[r(2)] - r(>) NEXT:[r(2 > 3)] PREV:[r(3)] - r(2 > 3) NEXT:[jf(l5)] PREV:[r(>)] - jf(l5) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] - r(2) NEXT:[ret l4] PREV:[jf(l5)] - ret l4 NEXT:[] PREV:[r(2)] -- jmp(l6) NEXT:[r(2)] PREV:[] + NEXT:[r(())] PREV:[] + r(()) NEXT:[r(try { 1 if (2 > 3) { retur..)] PREV:[] + r(try { + 1 + if (2 > 3) { + return@ + } + } finally { + 2 + }) NEXT:[r(1)] PREV:[r(())] + r(1) NEXT:[r(2)] PREV:[r(try { 1 if (2 > 3) { retur..)] + r(2) NEXT:[r(3)] PREV:[r(1)] + r(3) NEXT:[r(>)] PREV:[r(2)] + r(>) NEXT:[r(2 > 3)] PREV:[r(3)] + r(2 > 3) NEXT:[jf(l5)] PREV:[r(>)] + jf(l5) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] + r(2) NEXT:[ret l4] PREV:[jf(l5)] + ret l4 NEXT:[] PREV:[r(2)] +- jmp(l6) NEXT:[r(2)] PREV:[] l5: - read (Unit) NEXT:[r(2)] PREV:[jf(l5)] + read (Unit) NEXT:[r(2)] PREV:[jf(l5)] l6: l7: - r(2) NEXT:[] PREV:[read (Unit)] + r(2) NEXT:[] PREV:[read (Unit)] l4: l8: - NEXT:[] PREV:[ret l4, r(2)] + NEXT:[] PREV:[ret l4, r(2)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t5 == fun t5() { @@ -258,36 +301,54 @@ fun t5() { } --------------------- l0: - NEXT:[r(true)] PREV:[] + NEXT:[r(while(true) { try { 1 if (..)] PREV:[] + r(while(true) { + try { + 1 + if (2 > 3) { + break @ + } + } finally { + 2 + } + }) NEXT:[r(true)] PREV:[] l2: l5: - r(true) NEXT:[jf(l3)] PREV:[, jmp(l2)] - jf(l3) NEXT:[read (Unit), r(1)] PREV:[r(true)] + r(true) NEXT:[jf(l3)] PREV:[r(while(true) { try { 1 if (..), jmp(l2)] + jf(l3) NEXT:[read (Unit), r(try { 1 if (2 > 3) { break..)] PREV:[r(true)] l4: - r(1) NEXT:[r(2)] PREV:[jf(l3)] - r(2) NEXT:[r(3)] PREV:[r(1)] - r(3) NEXT:[r(>)] PREV:[r(2)] - r(>) NEXT:[r(2 > 3)] PREV:[r(3)] - r(2 > 3) NEXT:[jf(l6)] PREV:[r(>)] - jf(l6) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] - r(2) NEXT:[jmp(l3)] PREV:[jf(l6)] - jmp(l3) NEXT:[read (Unit)] PREV:[r(2)] -- jmp(l7) NEXT:[r(2)] PREV:[] + r(try { + 1 + if (2 > 3) { + break @ + } + } finally { + 2 + }) NEXT:[r(1)] PREV:[jf(l3)] + r(1) NEXT:[r(2)] PREV:[r(try { 1 if (2 > 3) { break..)] + r(2) NEXT:[r(3)] PREV:[r(1)] + r(3) NEXT:[r(>)] PREV:[r(2)] + r(>) NEXT:[r(2 > 3)] PREV:[r(3)] + r(2 > 3) NEXT:[jf(l6)] PREV:[r(>)] + jf(l6) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] + r(2) NEXT:[jmp(l3)] PREV:[jf(l6)] + jmp(l3) NEXT:[read (Unit)] PREV:[r(2)] +- jmp(l7) NEXT:[r(2)] PREV:[] l6: - read (Unit) NEXT:[r(2)] PREV:[jf(l6)] + read (Unit) NEXT:[r(2)] PREV:[jf(l6)] l7: l8: - r(2) NEXT:[jmp(l2)] PREV:[read (Unit)] + r(2) NEXT:[jmp(l2)] PREV:[read (Unit)] l9: - jmp(l2) NEXT:[r(true)] PREV:[r(2)] + jmp(l2) NEXT:[r(true)] PREV:[r(2)] l3: - read (Unit) NEXT:[] PREV:[jf(l3), jmp(l3)] + read (Unit) NEXT:[] PREV:[jf(l3), jmp(l3)] l1: - NEXT:[] PREV:[read (Unit)] + NEXT:[] PREV:[read (Unit)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t6 == fun t6() { @@ -305,36 +366,53 @@ fun t6() { } --------------------- l0: - NEXT:[r(true)] PREV:[] + NEXT:[r(try { @ while(true) { 1 if..)] PREV:[] + r(try { + @ while(true) { + 1 + if (2 > 3) { + break @ + } + } + 5 + } finally { + 2 + }) NEXT:[r(while(true) { 1 if (2 > 3)..)] PREV:[] + r(while(true) { + 1 + if (2 > 3) { + break @ + } + }) NEXT:[r(true)] PREV:[r(try { @ while(true) { 1 if..)] l2: l5: - r(true) NEXT:[jf(l3)] PREV:[, jmp(l2)] - jf(l3) NEXT:[read (Unit), r(1)] PREV:[r(true)] + r(true) NEXT:[jf(l3)] PREV:[r(while(true) { 1 if (2 > 3)..), jmp(l2)] + jf(l3) NEXT:[read (Unit), r(1)] PREV:[r(true)] l4: - r(1) NEXT:[r(2)] PREV:[jf(l3)] - r(2) NEXT:[r(3)] PREV:[r(1)] - r(3) NEXT:[r(>)] PREV:[r(2)] - r(>) NEXT:[r(2 > 3)] PREV:[r(3)] - r(2 > 3) NEXT:[jf(l6)] PREV:[r(>)] - jf(l6) NEXT:[read (Unit), jmp(l3)] PREV:[r(2 > 3)] - jmp(l3) NEXT:[read (Unit)] PREV:[jf(l6)] -- jmp(l7) NEXT:[jmp(l2)] PREV:[] + r(1) NEXT:[r(2)] PREV:[jf(l3)] + r(2) NEXT:[r(3)] PREV:[r(1)] + r(3) NEXT:[r(>)] PREV:[r(2)] + r(>) NEXT:[r(2 > 3)] PREV:[r(3)] + r(2 > 3) NEXT:[jf(l6)] PREV:[r(>)] + jf(l6) NEXT:[read (Unit), jmp(l3)] PREV:[r(2 > 3)] + jmp(l3) NEXT:[read (Unit)] PREV:[jf(l6)] +- jmp(l7) NEXT:[jmp(l2)] PREV:[] l6: - read (Unit) NEXT:[jmp(l2)] PREV:[jf(l6)] + read (Unit) NEXT:[jmp(l2)] PREV:[jf(l6)] l7: - jmp(l2) NEXT:[r(true)] PREV:[read (Unit)] + jmp(l2) NEXT:[r(true)] PREV:[read (Unit)] l3: - read (Unit) NEXT:[r(5)] PREV:[jf(l3), jmp(l3)] - r(5) NEXT:[r(2)] PREV:[read (Unit)] + read (Unit) NEXT:[r(5)] PREV:[jf(l3), jmp(l3)] + r(5) NEXT:[r(2)] PREV:[read (Unit)] l8: - r(2) NEXT:[] PREV:[r(5)] + r(2) NEXT:[] PREV:[r(5)] l1: l9: - NEXT:[] PREV:[r(2)] + NEXT:[] PREV:[r(2)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t7 == fun t7() { @@ -351,35 +429,51 @@ fun t7() { } --------------------- l0: - NEXT:[r(true)] PREV:[] + NEXT:[r(try { @ while(true) { 1 if..)] PREV:[] + r(try { + @ while(true) { + 1 + if (2 > 3) { + break @ + } + } + } finally { + 2 + }) NEXT:[r(while(true) { 1 if (2 > 3)..)] PREV:[] + r(while(true) { + 1 + if (2 > 3) { + break @ + } + }) NEXT:[r(true)] PREV:[r(try { @ while(true) { 1 if..)] l2: l5: - r(true) NEXT:[jf(l3)] PREV:[, jmp(l2)] - jf(l3) NEXT:[read (Unit), r(1)] PREV:[r(true)] + r(true) NEXT:[jf(l3)] PREV:[r(while(true) { 1 if (2 > 3)..), jmp(l2)] + jf(l3) NEXT:[read (Unit), r(1)] PREV:[r(true)] l4: - r(1) NEXT:[r(2)] PREV:[jf(l3)] - r(2) NEXT:[r(3)] PREV:[r(1)] - r(3) NEXT:[r(>)] PREV:[r(2)] - r(>) NEXT:[r(2 > 3)] PREV:[r(3)] - r(2 > 3) NEXT:[jf(l6)] PREV:[r(>)] - jf(l6) NEXT:[read (Unit), jmp(l3)] PREV:[r(2 > 3)] - jmp(l3) NEXT:[read (Unit)] PREV:[jf(l6)] -- jmp(l7) NEXT:[jmp(l2)] PREV:[] + r(1) NEXT:[r(2)] PREV:[jf(l3)] + r(2) NEXT:[r(3)] PREV:[r(1)] + r(3) NEXT:[r(>)] PREV:[r(2)] + r(>) NEXT:[r(2 > 3)] PREV:[r(3)] + r(2 > 3) NEXT:[jf(l6)] PREV:[r(>)] + jf(l6) NEXT:[read (Unit), jmp(l3)] PREV:[r(2 > 3)] + jmp(l3) NEXT:[read (Unit)] PREV:[jf(l6)] +- jmp(l7) NEXT:[jmp(l2)] PREV:[] l6: - read (Unit) NEXT:[jmp(l2)] PREV:[jf(l6)] + read (Unit) NEXT:[jmp(l2)] PREV:[jf(l6)] l7: - jmp(l2) NEXT:[r(true)] PREV:[read (Unit)] + jmp(l2) NEXT:[r(true)] PREV:[read (Unit)] l3: - read (Unit) NEXT:[r(2)] PREV:[jf(l3), jmp(l3)] + read (Unit) NEXT:[r(2)] PREV:[jf(l3), jmp(l3)] l8: - r(2) NEXT:[] PREV:[read (Unit)] + r(2) NEXT:[] PREV:[read (Unit)] l1: l9: - NEXT:[] PREV:[r(2)] + NEXT:[] PREV:[r(2)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t8 == fun t8(a : Int) { @@ -396,43 +490,61 @@ fun t8(a : Int) { } --------------------- l0: - NEXT:[v(a : Int)] PREV:[] - v(a : Int) NEXT:[w(a)] PREV:[] - w(a) NEXT:[r(1)] PREV:[v(a : Int)] - r(1) NEXT:[r(a)] PREV:[w(a)] - r(a) NEXT:[r(..)] PREV:[r(1)] - r(..) NEXT:[r(1..a)] PREV:[r(a)] - r(1..a) NEXT:[v(i)] PREV:[r(..)] - v(i) NEXT:[w(i)] PREV:[r(1..a)] - w(i) NEXT:[jmp?(l2)] PREV:[v(i)] + NEXT:[v(a : Int)] PREV:[] + v(a : Int) NEXT:[w(a)] PREV:[] + w(a) NEXT:[r(for (i in 1..a) { try { 1 ..)] PREV:[v(a : Int)] + r(for (i in 1..a) { + try { + 1 + if (2 > 3) { + continue @ + } + } finally { + 2 + } + }) NEXT:[r(1)] PREV:[w(a)] + r(1) NEXT:[r(a)] PREV:[r(for (i in 1..a) { try { 1 ..)] + r(a) NEXT:[r(..)] PREV:[r(1)] + r(..) NEXT:[r(1..a)] PREV:[r(a)] + r(1..a) NEXT:[v(i)] PREV:[r(..)] + v(i) NEXT:[w(i)] PREV:[r(1..a)] + w(i) NEXT:[jmp?(l2)] PREV:[v(i)] l3: - jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)] + jmp?(l2) NEXT:[read (Unit), r(try { 1 if (2 > 3) { conti..)] PREV:[w(i)] l4: l5: - r(1) NEXT:[r(2)] PREV:[jmp?(l2), jmp(l4), jmp?(l4)] - r(2) NEXT:[r(3)] PREV:[r(1)] - r(3) NEXT:[r(>)] PREV:[r(2)] - r(>) NEXT:[r(2 > 3)] PREV:[r(3)] - r(2 > 3) NEXT:[jf(l6)] PREV:[r(>)] - jf(l6) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] - r(2) NEXT:[jmp(l4)] PREV:[jf(l6)] - jmp(l4) NEXT:[r(1)] PREV:[r(2)] -- jmp(l7) NEXT:[r(2)] PREV:[] + r(try { + 1 + if (2 > 3) { + continue @ + } + } finally { + 2 + }) NEXT:[r(1)] PREV:[jmp?(l2), jmp(l4), jmp?(l4)] + r(1) NEXT:[r(2)] PREV:[r(try { 1 if (2 > 3) { conti..)] + r(2) NEXT:[r(3)] PREV:[r(1)] + r(3) NEXT:[r(>)] PREV:[r(2)] + r(>) NEXT:[r(2 > 3)] PREV:[r(3)] + r(2 > 3) NEXT:[jf(l6)] PREV:[r(>)] + jf(l6) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] + r(2) NEXT:[jmp(l4)] PREV:[jf(l6)] + jmp(l4) NEXT:[r(try { 1 if (2 > 3) { conti..)] PREV:[r(2)] +- jmp(l7) NEXT:[r(2)] PREV:[] l6: - read (Unit) NEXT:[r(2)] PREV:[jf(l6)] + read (Unit) NEXT:[r(2)] PREV:[jf(l6)] l7: l8: - r(2) NEXT:[jmp?(l4)] PREV:[read (Unit)] + r(2) NEXT:[jmp?(l4)] PREV:[read (Unit)] l9: - jmp?(l4) NEXT:[r(1), read (Unit)] PREV:[r(2)] + jmp?(l4) NEXT:[r(try { 1 if (2 > 3) { conti..), read (Unit)] PREV:[r(2)] l2: - read (Unit) NEXT:[] PREV:[jmp?(l2), jmp?(l4)] + read (Unit) NEXT:[] PREV:[jmp?(l2), jmp?(l4)] l1: - NEXT:[] PREV:[read (Unit)] + NEXT:[] PREV:[read (Unit)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t9 == fun t9(a : Int) { @@ -450,43 +562,60 @@ fun t9(a : Int) { } --------------------- l0: - NEXT:[v(a : Int)] PREV:[] - v(a : Int) NEXT:[w(a)] PREV:[] - w(a) NEXT:[r(1)] PREV:[v(a : Int)] - r(1) NEXT:[r(a)] PREV:[w(a)] - r(a) NEXT:[r(..)] PREV:[r(1)] - r(..) NEXT:[r(1..a)] PREV:[r(a)] - r(1..a) NEXT:[v(i)] PREV:[r(..)] - v(i) NEXT:[w(i)] PREV:[r(1..a)] - w(i) NEXT:[jmp?(l2)] PREV:[v(i)] + NEXT:[v(a : Int)] PREV:[] + v(a : Int) NEXT:[w(a)] PREV:[] + w(a) NEXT:[r(try { @ for (i in 1..a) { ..)] PREV:[v(a : Int)] + r(try { + @ for (i in 1..a) { + 1 + if (2 > 3) { + continue @ + } + } + 5 + } finally { + 2 + }) NEXT:[r(for (i in 1..a) { 1 if (2 ..)] PREV:[w(a)] + r(for (i in 1..a) { + 1 + if (2 > 3) { + continue @ + } + }) NEXT:[r(1)] PREV:[r(try { @ for (i in 1..a) { ..)] + r(1) NEXT:[r(a)] PREV:[r(for (i in 1..a) { 1 if (2 ..)] + r(a) NEXT:[r(..)] PREV:[r(1)] + r(..) NEXT:[r(1..a)] PREV:[r(a)] + r(1..a) NEXT:[v(i)] PREV:[r(..)] + v(i) NEXT:[w(i)] PREV:[r(1..a)] + w(i) NEXT:[jmp?(l2)] PREV:[v(i)] l3: - jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)] + jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)] l4: l5: - r(1) NEXT:[r(2)] PREV:[jmp?(l2), jmp(l4), jmp?(l4)] - r(2) NEXT:[r(3)] PREV:[r(1)] - r(3) NEXT:[r(>)] PREV:[r(2)] - r(>) NEXT:[r(2 > 3)] PREV:[r(3)] - r(2 > 3) NEXT:[jf(l6)] PREV:[r(>)] - jf(l6) NEXT:[read (Unit), jmp(l4)] PREV:[r(2 > 3)] - jmp(l4) NEXT:[r(1)] PREV:[jf(l6)] -- jmp(l7) NEXT:[jmp?(l4)] PREV:[] + r(1) NEXT:[r(2)] PREV:[jmp?(l2), jmp(l4), jmp?(l4)] + r(2) NEXT:[r(3)] PREV:[r(1)] + r(3) NEXT:[r(>)] PREV:[r(2)] + r(>) NEXT:[r(2 > 3)] PREV:[r(3)] + r(2 > 3) NEXT:[jf(l6)] PREV:[r(>)] + jf(l6) NEXT:[read (Unit), jmp(l4)] PREV:[r(2 > 3)] + jmp(l4) NEXT:[r(1)] PREV:[jf(l6)] +- jmp(l7) NEXT:[jmp?(l4)] PREV:[] l6: - read (Unit) NEXT:[jmp?(l4)] PREV:[jf(l6)] + read (Unit) NEXT:[jmp?(l4)] PREV:[jf(l6)] l7: - jmp?(l4) NEXT:[r(1), read (Unit)] PREV:[read (Unit)] + jmp?(l4) NEXT:[r(1), read (Unit)] PREV:[read (Unit)] l2: - read (Unit) NEXT:[r(5)] PREV:[jmp?(l2), jmp?(l4)] - r(5) NEXT:[r(2)] PREV:[read (Unit)] + read (Unit) NEXT:[r(5)] PREV:[jmp?(l2), jmp?(l4)] + r(5) NEXT:[r(2)] PREV:[read (Unit)] l8: - r(2) NEXT:[] PREV:[r(5)] + r(2) NEXT:[] PREV:[r(5)] l1: l9: - NEXT:[] PREV:[r(2)] + NEXT:[] PREV:[r(2)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t10 == fun t10(a : Int) { @@ -503,42 +632,58 @@ fun t10(a : Int) { } --------------------- l0: - NEXT:[v(a : Int)] PREV:[] - v(a : Int) NEXT:[w(a)] PREV:[] - w(a) NEXT:[r(1)] PREV:[v(a : Int)] - r(1) NEXT:[r(a)] PREV:[w(a)] - r(a) NEXT:[r(..)] PREV:[r(1)] - r(..) NEXT:[r(1..a)] PREV:[r(a)] - r(1..a) NEXT:[v(i)] PREV:[r(..)] - v(i) NEXT:[w(i)] PREV:[r(1..a)] - w(i) NEXT:[jmp?(l2)] PREV:[v(i)] + NEXT:[v(a : Int)] PREV:[] + v(a : Int) NEXT:[w(a)] PREV:[] + w(a) NEXT:[r(try { @ for (i in 1..a) { ..)] PREV:[v(a : Int)] + r(try { + @ for (i in 1..a) { + 1 + if (2 > 3) { + continue @ + } + } + } finally { + 2 + }) NEXT:[r(for (i in 1..a) { 1 if (2 ..)] PREV:[w(a)] + r(for (i in 1..a) { + 1 + if (2 > 3) { + continue @ + } + }) NEXT:[r(1)] PREV:[r(try { @ for (i in 1..a) { ..)] + r(1) NEXT:[r(a)] PREV:[r(for (i in 1..a) { 1 if (2 ..)] + r(a) NEXT:[r(..)] PREV:[r(1)] + r(..) NEXT:[r(1..a)] PREV:[r(a)] + r(1..a) NEXT:[v(i)] PREV:[r(..)] + v(i) NEXT:[w(i)] PREV:[r(1..a)] + w(i) NEXT:[jmp?(l2)] PREV:[v(i)] l3: - jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)] + jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)] l4: l5: - r(1) NEXT:[r(2)] PREV:[jmp?(l2), jmp(l4), jmp?(l4)] - r(2) NEXT:[r(3)] PREV:[r(1)] - r(3) NEXT:[r(>)] PREV:[r(2)] - r(>) NEXT:[r(2 > 3)] PREV:[r(3)] - r(2 > 3) NEXT:[jf(l6)] PREV:[r(>)] - jf(l6) NEXT:[read (Unit), jmp(l4)] PREV:[r(2 > 3)] - jmp(l4) NEXT:[r(1)] PREV:[jf(l6)] -- jmp(l7) NEXT:[jmp?(l4)] PREV:[] + r(1) NEXT:[r(2)] PREV:[jmp?(l2), jmp(l4), jmp?(l4)] + r(2) NEXT:[r(3)] PREV:[r(1)] + r(3) NEXT:[r(>)] PREV:[r(2)] + r(>) NEXT:[r(2 > 3)] PREV:[r(3)] + r(2 > 3) NEXT:[jf(l6)] PREV:[r(>)] + jf(l6) NEXT:[read (Unit), jmp(l4)] PREV:[r(2 > 3)] + jmp(l4) NEXT:[r(1)] PREV:[jf(l6)] +- jmp(l7) NEXT:[jmp?(l4)] PREV:[] l6: - read (Unit) NEXT:[jmp?(l4)] PREV:[jf(l6)] + read (Unit) NEXT:[jmp?(l4)] PREV:[jf(l6)] l7: - jmp?(l4) NEXT:[r(1), read (Unit)] PREV:[read (Unit)] + jmp?(l4) NEXT:[r(1), read (Unit)] PREV:[read (Unit)] l2: - read (Unit) NEXT:[r(2)] PREV:[jmp?(l2), jmp?(l4)] + read (Unit) NEXT:[r(2)] PREV:[jmp?(l2), jmp?(l4)] l8: - r(2) NEXT:[] PREV:[read (Unit)] + r(2) NEXT:[] PREV:[read (Unit)] l1: l9: - NEXT:[] PREV:[r(2)] + NEXT:[] PREV:[r(2)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t11 == fun t11() { @@ -551,21 +696,27 @@ fun t11() { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[r(2)] PREV:[] - r(2) NEXT:[ret(*) l1] PREV:[r(1)] - ret(*) l1 NEXT:[] PREV:[r(2)] -- ret(*) l1 NEXT:[] PREV:[] + NEXT:[r(try { return 1 } finally {..)] PREV:[] + r(try { + return 1 + } + finally { + return 2 + }) NEXT:[r(1)] PREV:[] + r(1) NEXT:[r(2)] PREV:[r(try { return 1 } finally {..)] + r(2) NEXT:[ret(*) l1] PREV:[r(1)] + ret(*) l1 NEXT:[] PREV:[r(2)] +- ret(*) l1 NEXT:[] PREV:[] l2: -- r(2) NEXT:[ret(*) l1] PREV:[] -- ret(*) l1 NEXT:[] PREV:[] +- r(2) NEXT:[ret(*) l1] PREV:[] +- ret(*) l1 NEXT:[] PREV:[] l1: l3: - NEXT:[] PREV:[ret(*) l1] + NEXT:[] PREV:[ret(*) l1] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t12 == fun t12() : Int { @@ -578,23 +729,29 @@ fun t12() : Int { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[r(3)] PREV:[] - r(3) NEXT:[r(doSmth)] PREV:[r(1)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] - ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] + NEXT:[r(try { return 1 } finally {..)] PREV:[] + r(try { + return 1 + } + finally { + doSmth(3) + }) NEXT:[r(1)] PREV:[] + r(1) NEXT:[r(3)] PREV:[r(try { return 1 } finally {..)] + r(3) NEXT:[r(doSmth)] PREV:[r(1)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] + ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] l2: -- r(3) NEXT:[r(doSmth)] PREV:[] -- r(doSmth) NEXT:[r(doSmth(3))] PREV:[] -- r(doSmth(3)) NEXT:[] PREV:[] +- r(3) NEXT:[r(doSmth)] PREV:[] +- r(doSmth) NEXT:[r(doSmth(3))] PREV:[] +- r(doSmth(3)) NEXT:[] PREV:[] l1: l3: - NEXT:[] PREV:[ret(*) l1] + NEXT:[] PREV:[ret(*) l1] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t13 == fun t13() : Int { @@ -610,35 +767,44 @@ fun t13() : Int { } --------------------- l0: - NEXT:[jmp?(l2)] PREV:[] - jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[] - r(1) NEXT:[r(3)] PREV:[jmp?(l2)] - r(3) NEXT:[r(doSmth)] PREV:[r(1)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] - ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] + NEXT:[r(try { return 1 } catch (e:..)] PREV:[] + r(try { + return 1 + } + catch (e: UnsupportedOperationException) { + doSmth(2) + } + finally { + doSmth(3) + }) NEXT:[jmp?(l2)] PREV:[] + jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[r(try { return 1 } catch (e:..)] + r(1) NEXT:[r(3)] PREV:[jmp?(l2)] + r(3) NEXT:[r(doSmth)] PREV:[r(1)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] + ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] l3: -- jmp(l4) NEXT:[r(3)] PREV:[] +- jmp(l4) NEXT:[r(3)] PREV:[] l2: - jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)] - v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()] - w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] - r(2) NEXT:[r(doSmth)] PREV:[w(e)] - r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)] - r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)] + jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)] + v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()] + w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] + r(2) NEXT:[r(doSmth)] PREV:[w(e)] + r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)] + r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)] l5: - jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(2))] + jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(2))] l4: - r(3) NEXT:[r(doSmth)] PREV:[jmp(l4)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[] PREV:[r(doSmth)] + r(3) NEXT:[r(doSmth)] PREV:[jmp(l4)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[] PREV:[r(doSmth)] l1: l6: - NEXT:[] PREV:[ret(*) l1, r(doSmth(3))] + NEXT:[] PREV:[ret(*) l1, r(doSmth(3))] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t14 == fun t14() : Int { @@ -651,29 +817,35 @@ fun t14() : Int { } --------------------- l0: - NEXT:[jmp?(l2)] PREV:[] - jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[] - r(1) NEXT:[ret(*) l1] PREV:[jmp?(l2)] - ret(*) l1 NEXT:[] PREV:[r(1)] + NEXT:[r(try { return 1 } catch (e:..)] PREV:[] + r(try { + return 1 + } + catch (e: UnsupportedOperationException) { + doSmth(2) + }) NEXT:[jmp?(l2)] PREV:[] + jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[r(try { return 1 } catch (e:..)] + r(1) NEXT:[ret(*) l1] PREV:[jmp?(l2)] + ret(*) l1 NEXT:[] PREV:[r(1)] l3: -- jmp(l4) NEXT:[] PREV:[] +- jmp(l4) NEXT:[] PREV:[] l2: - jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)] - v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()] - w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] - r(2) NEXT:[r(doSmth)] PREV:[w(e)] - r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)] - r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)] + jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)] + v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()] + w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] + r(2) NEXT:[r(doSmth)] PREV:[w(e)] + r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)] + r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)] l5: - jmp(l4) NEXT:[] PREV:[r(doSmth(2))] + jmp(l4) NEXT:[] PREV:[r(doSmth(2))] l1: l4: l6: - NEXT:[] PREV:[ret(*) l1, jmp(l4)] + NEXT:[] PREV:[ret(*) l1, jmp(l4)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t15 == fun t15() : Int { @@ -689,37 +861,46 @@ fun t15() : Int { } --------------------- l0: - NEXT:[jmp?(l2)] PREV:[] - jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[] - r(1) NEXT:[r(3)] PREV:[jmp?(l2)] - r(3) NEXT:[r(doSmth)] PREV:[r(1)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] - ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] + NEXT:[r(try { return 1 } catch (e:..)] PREV:[] + r(try { + return 1 + } + catch (e: UnsupportedOperationException) { + return 2 + } + finally { + doSmth(3) + }) NEXT:[jmp?(l2)] PREV:[] + jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[r(try { return 1 } catch (e:..)] + r(1) NEXT:[r(3)] PREV:[jmp?(l2)] + r(3) NEXT:[r(doSmth)] PREV:[r(1)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] + ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] l3: -- jmp(l4) NEXT:[r(3)] PREV:[] +- jmp(l4) NEXT:[r(3)] PREV:[] l2: - jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)] - v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()] - w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] - r(2) NEXT:[r(3)] PREV:[w(e)] - r(3) NEXT:[r(doSmth)] PREV:[r(2)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] - ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] + jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)] + v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()] + w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] + r(2) NEXT:[r(3)] PREV:[w(e)] + r(3) NEXT:[r(doSmth)] PREV:[r(2)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] + ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] l5: -- jmp(l4) NEXT:[r(3)] PREV:[] +- jmp(l4) NEXT:[r(3)] PREV:[] l4: -- r(3) NEXT:[r(doSmth)] PREV:[] -- r(doSmth) NEXT:[r(doSmth(3))] PREV:[] -- r(doSmth(3)) NEXT:[] PREV:[] +- r(3) NEXT:[r(doSmth)] PREV:[] +- r(doSmth) NEXT:[r(doSmth(3))] PREV:[] +- r(doSmth(3)) NEXT:[] PREV:[] l1: l6: - NEXT:[] PREV:[ret(*) l1, ret(*) l1] + NEXT:[] PREV:[ret(*) l1, ret(*) l1] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t16 == fun t16() : Int { @@ -735,35 +916,44 @@ fun t16() : Int { } --------------------- l0: - NEXT:[jmp?(l2)] PREV:[] - jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[] - r(1) NEXT:[r(doSmth)] PREV:[jmp?(l2)] - r(doSmth) NEXT:[r(doSmth(1))] PREV:[r(1)] - r(doSmth(1)) NEXT:[jmp(l4)] PREV:[r(doSmth)] + NEXT:[r(try { doSmth(1) } catch (e..)] PREV:[] + r(try { + doSmth(1) + } + catch (e: UnsupportedOperationException) { + return 2 + } + finally { + doSmth(3) + }) NEXT:[jmp?(l2)] PREV:[] + jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[r(try { doSmth(1) } catch (e..)] + r(1) NEXT:[r(doSmth)] PREV:[jmp?(l2)] + r(doSmth) NEXT:[r(doSmth(1))] PREV:[r(1)] + r(doSmth(1)) NEXT:[jmp(l4)] PREV:[r(doSmth)] l3: - jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(1))] + jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(1))] l2: - jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)] - v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()] - w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] - r(2) NEXT:[r(3)] PREV:[w(e)] - r(3) NEXT:[r(doSmth)] PREV:[r(2)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] - ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] + jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)] + v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()] + w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] + r(2) NEXT:[r(3)] PREV:[w(e)] + r(3) NEXT:[r(doSmth)] PREV:[r(2)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] + ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] l5: -- jmp(l4) NEXT:[r(3)] PREV:[] +- jmp(l4) NEXT:[r(3)] PREV:[] l4: - r(3) NEXT:[r(doSmth)] PREV:[jmp(l4)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[] PREV:[r(doSmth)] + r(3) NEXT:[r(doSmth)] PREV:[jmp(l4)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[] PREV:[r(doSmth)] l1: l6: - NEXT:[] PREV:[ret(*) l1, r(doSmth(3))] + NEXT:[] PREV:[ret(*) l1, r(doSmth(3))] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == doSmth == fun doSmth(i: Int) { diff --git a/compiler/testData/cfg/For.instructions b/compiler/testData/cfg/For.instructions index 6a8ceb0d916..9361d5f5882 100644 --- a/compiler/testData/cfg/For.instructions +++ b/compiler/testData/cfg/For.instructions @@ -6,29 +6,32 @@ fun t1() { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[r(2)] PREV:[] - r(2) NEXT:[r(..)] PREV:[r(1)] - r(..) NEXT:[r(1..2)] PREV:[r(2)] - r(1..2) NEXT:[v(i)] PREV:[r(..)] - v(i) NEXT:[w(i)] PREV:[r(1..2)] - w(i) NEXT:[jmp?(l2)] PREV:[v(i)] + NEXT:[r(for (i in 1..2) { doSmth(i..)] PREV:[] + r(for (i in 1..2) { + doSmth(i) + }) NEXT:[r(1)] PREV:[] + r(1) NEXT:[r(2)] PREV:[r(for (i in 1..2) { doSmth(i..)] + r(2) NEXT:[r(..)] PREV:[r(1)] + r(..) NEXT:[r(1..2)] PREV:[r(2)] + r(1..2) NEXT:[v(i)] PREV:[r(..)] + v(i) NEXT:[w(i)] PREV:[r(1..2)] + w(i) NEXT:[jmp?(l2)] PREV:[v(i)] l3: - jmp?(l2) NEXT:[read (Unit), r(i)] PREV:[w(i)] + jmp?(l2) NEXT:[read (Unit), r(i)] PREV:[w(i)] l4: l5: - r(i) NEXT:[r(doSmth)] PREV:[jmp?(l2), jmp?(l4)] - r(doSmth) NEXT:[r(doSmth(i))] PREV:[r(i)] - r(doSmth(i)) NEXT:[jmp?(l4)] PREV:[r(doSmth)] - jmp?(l4) NEXT:[r(i), read (Unit)] PREV:[r(doSmth(i))] + r(i) NEXT:[r(doSmth)] PREV:[jmp?(l2), jmp?(l4)] + r(doSmth) NEXT:[r(doSmth(i))] PREV:[r(i)] + r(doSmth(i)) NEXT:[jmp?(l4)] PREV:[r(doSmth)] + jmp?(l4) NEXT:[r(i), read (Unit)] PREV:[r(doSmth(i))] l2: - read (Unit) NEXT:[] PREV:[jmp?(l2), jmp?(l4)] + read (Unit) NEXT:[] PREV:[jmp?(l2), jmp?(l4)] l1: - NEXT:[] PREV:[read (Unit)] + NEXT:[] PREV:[read (Unit)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == doSmth == fun doSmth(i: Int) {} diff --git a/compiler/testData/cfg/OnlyWhileInFunctionBody.instructions b/compiler/testData/cfg/OnlyWhileInFunctionBody.instructions index 7a0e7786a0d..800e16ea283 100644 --- a/compiler/testData/cfg/OnlyWhileInFunctionBody.instructions +++ b/compiler/testData/cfg/OnlyWhileInFunctionBody.instructions @@ -6,25 +6,28 @@ fun main() { } --------------------- l0: - NEXT:[r(1)] PREV:[] + NEXT:[r(while(1 > 0) { 2 }) ] PREV:[] + r(while(1 > 0) { + 2 + }) NEXT:[r(1)] PREV:[] l2: l5: - r(1) NEXT:[r(0)] PREV:[, jmp(l2)] - r(0) NEXT:[r(>)] PREV:[r(1)] - r(>) NEXT:[r(1 > 0)] PREV:[r(0)] - r(1 > 0) NEXT:[jf(l3)] PREV:[r(>)] - jf(l3) NEXT:[read (Unit), r(2)] PREV:[r(1 > 0)] + r(1) NEXT:[r(0)] PREV:[r(while(1 > 0) { 2 }) , jmp(l2)] + r(0) NEXT:[r(>)] PREV:[r(1)] + r(>) NEXT:[r(1 > 0)] PREV:[r(0)] + r(1 > 0) NEXT:[jf(l3)] PREV:[r(>)] + jf(l3) NEXT:[read (Unit), r(2)] PREV:[r(1 > 0)] l4: - r(2) NEXT:[jmp(l2)] PREV:[jf(l3)] - jmp(l2) NEXT:[r(1)] PREV:[r(2)] + r(2) NEXT:[jmp(l2)] PREV:[jf(l3)] + jmp(l2) NEXT:[r(1)] PREV:[r(2)] l3: - read (Unit) NEXT:[] PREV:[jf(l3)] + read (Unit) NEXT:[] PREV:[jf(l3)] l1: - NEXT:[] PREV:[read (Unit)] + NEXT:[] PREV:[read (Unit)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == dowhile == fun dowhile() { @@ -33,22 +36,24 @@ fun dowhile() { } --------------------- l0: - NEXT:[ret l1] PREV:[] + NEXT:[r(do {return} while(1 > 0)) ] PREV:[] + r(do {return} + while(1 > 0)) NEXT:[ret l1] PREV:[] l2: l4: - ret l1 NEXT:[] PREV:[] + ret l1 NEXT:[] PREV:[r(do {return} while(1 > 0)) ] l5: -- r(1) NEXT:[r(0)] PREV:[] -- r(0) NEXT:[r(>)] PREV:[] -- r(>) NEXT:[r(1 > 0)] PREV:[] -- r(1 > 0) NEXT:[jt(l2)] PREV:[] -- jt(l2) NEXT:[read (Unit), ret l1] PREV:[] +- r(1) NEXT:[r(0)] PREV:[] +- r(0) NEXT:[r(>)] PREV:[] +- r(>) NEXT:[r(1 > 0)] PREV:[] +- r(1 > 0) NEXT:[jt(l2)] PREV:[] +- jt(l2) NEXT:[read (Unit), ret l1] PREV:[] l3: -- read (Unit) NEXT:[] PREV:[] +- read (Unit) NEXT:[] PREV:[] l1: - NEXT:[] PREV:[ret l1] + NEXT:[] PREV:[ret l1] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== diff --git a/compiler/testData/cfg/ReturnFromExpression.instructions b/compiler/testData/cfg/ReturnFromExpression.instructions index 0fb6dc06df5..42171bf2a21 100644 --- a/compiler/testData/cfg/ReturnFromExpression.instructions +++ b/compiler/testData/cfg/ReturnFromExpression.instructions @@ -4,17 +4,18 @@ fun blockAndAndMismatch() : Boolean { } --------------------- l0: - NEXT:[r(false)] PREV:[] - r(false) NEXT:[jt(l2)] PREV:[] - jt(l2) NEXT:[r(false), r(false || (return false))] PREV:[r(false)] - r(false) NEXT:[ret(*) l1] PREV:[jt(l2)] - ret(*) l1 NEXT:[] PREV:[r(false)] + NEXT:[r(false)] PREV:[] + r(false) NEXT:[jt(l2)] PREV:[] + jt(l2) NEXT:[r((return false)), r(false || (return false))] PREV:[r(false)] + r((return false)) NEXT:[r(false)] PREV:[jt(l2)] + r(false) NEXT:[ret(*) l1] PREV:[r((return false))] + ret(*) l1 NEXT:[] PREV:[r(false)] l2: - r(false || (return false)) NEXT:[] PREV:[jt(l2)] + r(false || (return false)) NEXT:[] PREV:[jt(l2)] l1: - NEXT:[] PREV:[ret(*) l1, r(false || (return false))] + NEXT:[] PREV:[ret(*) l1, r(false || (return false))] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1001.jet b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1001.jet index 976b25fe07d..0bd9ae456d1 100644 --- a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1001.jet +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1001.jet @@ -6,8 +6,8 @@ package kt1001 fun foo(c: Array) { return - for (i in c) {} - for (i in c) {} + for (i in c) {} + for (i in c) {} } //more tests diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1027.jet b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1027.jet new file mode 100644 index 00000000000..214f475f9e8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt1027.jet @@ -0,0 +1,51 @@ +//KT-1027 Strange selection of unreachable code +//+JDK + +package kt1027 + +import java.util.List + +fun foo(c: List) { + var i = 2 + + return + + for (j in c) { //strange selection of unreachable code + i += 23 + } +} + +fun t1() { + return + + while(true) { + doSmth() + } +} + +fun t2() { + return + + do { + doSmth() + } while (true) +} + +fun t3() { + return + + try { + doSmth() + } + finally { + doSmth() + } +} + +fun t4() { + return + + (43) +} + +fun doSmth() {} \ No newline at end of file