//KT-1027 Strange selection of unreachable code
This commit is contained in:
@@ -153,6 +153,8 @@ public class JetControlFlowProcessor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitParenthesizedExpression(JetParenthesizedExpression expression) {
|
public void visitParenthesizedExpression(JetParenthesizedExpression expression) {
|
||||||
|
builder.read(expression);
|
||||||
|
|
||||||
JetExpression innerExpression = expression.getExpression();
|
JetExpression innerExpression = expression.getExpression();
|
||||||
if (innerExpression != null) {
|
if (innerExpression != null) {
|
||||||
value(innerExpression, inCondition);
|
value(innerExpression, inCondition);
|
||||||
@@ -340,6 +342,7 @@ public class JetControlFlowProcessor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitTryExpression(JetTryExpression expression) {
|
public void visitTryExpression(JetTryExpression expression) {
|
||||||
|
builder.read(expression);
|
||||||
final JetFinallySection finallyBlock = expression.getFinallyBlock();
|
final JetFinallySection finallyBlock = expression.getFinallyBlock();
|
||||||
if (finallyBlock != null) {
|
if (finallyBlock != null) {
|
||||||
builder.enterTryFinally(new GenerationTrigger() {
|
builder.enterTryFinally(new GenerationTrigger() {
|
||||||
@@ -413,6 +416,7 @@ public class JetControlFlowProcessor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitWhileExpression(JetWhileExpression expression) {
|
public void visitWhileExpression(JetWhileExpression expression) {
|
||||||
|
builder.read(expression);
|
||||||
LoopInfo loopInfo = builder.enterLoop(expression, null, null);
|
LoopInfo loopInfo = builder.enterLoop(expression, null, null);
|
||||||
|
|
||||||
builder.bindLabel(loopInfo.getConditionEntryPoint());
|
builder.bindLabel(loopInfo.getConditionEntryPoint());
|
||||||
@@ -434,6 +438,7 @@ public class JetControlFlowProcessor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitDoWhileExpression(JetDoWhileExpression expression) {
|
public void visitDoWhileExpression(JetDoWhileExpression expression) {
|
||||||
|
builder.read(expression);
|
||||||
LoopInfo loopInfo = builder.enterLoop(expression, null, null);
|
LoopInfo loopInfo = builder.enterLoop(expression, null, null);
|
||||||
|
|
||||||
builder.bindLabel(loopInfo.getBodyEntryPoint());
|
builder.bindLabel(loopInfo.getBodyEntryPoint());
|
||||||
@@ -453,6 +458,7 @@ public class JetControlFlowProcessor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitForExpression(JetForExpression expression) {
|
public void visitForExpression(JetForExpression expression) {
|
||||||
|
builder.read(expression);
|
||||||
JetExpression loopRange = expression.getLoopRange();
|
JetExpression loopRange = expression.getLoopRange();
|
||||||
if (loopRange != null) {
|
if (loopRange != null) {
|
||||||
value(loopRange, false);
|
value(loopRange, false);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -6,29 +6,32 @@ fun t1() {
|
|||||||
}
|
}
|
||||||
---------------------
|
---------------------
|
||||||
l0:
|
l0:
|
||||||
<START> NEXT:[r(1)] PREV:[]
|
<START> NEXT:[r(for (i in 1..2) { doSmth(i..)] PREV:[]
|
||||||
r(1) NEXT:[r(2)] PREV:[<START>]
|
r(for (i in 1..2) {
|
||||||
r(2) NEXT:[r(..)] PREV:[r(1)]
|
doSmth(i)
|
||||||
r(..) NEXT:[r(1..2)] PREV:[r(2)]
|
}) NEXT:[r(1)] PREV:[<START>]
|
||||||
r(1..2) NEXT:[v(i)] PREV:[r(..)]
|
r(1) NEXT:[r(2)] PREV:[r(for (i in 1..2) { doSmth(i..)]
|
||||||
v(i) NEXT:[w(i)] PREV:[r(1..2)]
|
r(2) NEXT:[r(..)] PREV:[r(1)]
|
||||||
w(i) NEXT:[jmp?(l2)] PREV:[v(i)]
|
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:
|
l3:
|
||||||
jmp?(l2) NEXT:[read (Unit), r(i)] PREV:[w(i)]
|
jmp?(l2) NEXT:[read (Unit), r(i)] PREV:[w(i)]
|
||||||
l4:
|
l4:
|
||||||
l5:
|
l5:
|
||||||
r(i) NEXT:[r(doSmth)] PREV:[jmp?(l2), jmp?(l4)]
|
r(i) NEXT:[r(doSmth)] PREV:[jmp?(l2), jmp?(l4)]
|
||||||
r(doSmth) NEXT:[r(doSmth(i))] PREV:[r(i)]
|
r(doSmth) NEXT:[r(doSmth(i))] PREV:[r(i)]
|
||||||
r(doSmth(i)) NEXT:[jmp?(l4)] PREV:[r(doSmth)]
|
r(doSmth(i)) NEXT:[jmp?(l4)] PREV:[r(doSmth)]
|
||||||
jmp?(l4) NEXT:[r(i), read (Unit)] PREV:[r(doSmth(i))]
|
jmp?(l4) NEXT:[r(i), read (Unit)] PREV:[r(doSmth(i))]
|
||||||
l2:
|
l2:
|
||||||
read (Unit) NEXT:[<END>] PREV:[jmp?(l2), jmp?(l4)]
|
read (Unit) NEXT:[<END>] PREV:[jmp?(l2), jmp?(l4)]
|
||||||
l1:
|
l1:
|
||||||
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
||||||
error:
|
error:
|
||||||
<ERROR> NEXT:[] PREV:[]
|
<ERROR> NEXT:[] PREV:[]
|
||||||
sink:
|
sink:
|
||||||
<SINK> NEXT:[] PREV:[<END>]
|
<SINK> NEXT:[] PREV:[<END>]
|
||||||
=====================
|
=====================
|
||||||
== doSmth ==
|
== doSmth ==
|
||||||
fun doSmth(i: Int) {}
|
fun doSmth(i: Int) {}
|
||||||
|
|||||||
@@ -6,25 +6,28 @@ fun main() {
|
|||||||
}
|
}
|
||||||
---------------------
|
---------------------
|
||||||
l0:
|
l0:
|
||||||
<START> NEXT:[r(1)] PREV:[]
|
<START> NEXT:[r(while(1 > 0) { 2 }) ] PREV:[]
|
||||||
|
r(while(1 > 0) {
|
||||||
|
2
|
||||||
|
}) NEXT:[r(1)] PREV:[<START>]
|
||||||
l2:
|
l2:
|
||||||
l5:
|
l5:
|
||||||
r(1) NEXT:[r(0)] PREV:[<START>, jmp(l2)]
|
r(1) NEXT:[r(0)] PREV:[r(while(1 > 0) { 2 }) , jmp(l2)]
|
||||||
r(0) NEXT:[r(>)] PREV:[r(1)]
|
r(0) NEXT:[r(>)] PREV:[r(1)]
|
||||||
r(>) NEXT:[r(1 > 0)] PREV:[r(0)]
|
r(>) NEXT:[r(1 > 0)] PREV:[r(0)]
|
||||||
r(1 > 0) NEXT:[jf(l3)] PREV:[r(>)]
|
r(1 > 0) NEXT:[jf(l3)] PREV:[r(>)]
|
||||||
jf(l3) NEXT:[read (Unit), r(2)] PREV:[r(1 > 0)]
|
jf(l3) NEXT:[read (Unit), r(2)] PREV:[r(1 > 0)]
|
||||||
l4:
|
l4:
|
||||||
r(2) NEXT:[jmp(l2)] PREV:[jf(l3)]
|
r(2) NEXT:[jmp(l2)] PREV:[jf(l3)]
|
||||||
jmp(l2) NEXT:[r(1)] PREV:[r(2)]
|
jmp(l2) NEXT:[r(1)] PREV:[r(2)]
|
||||||
l3:
|
l3:
|
||||||
read (Unit) NEXT:[<END>] PREV:[jf(l3)]
|
read (Unit) NEXT:[<END>] PREV:[jf(l3)]
|
||||||
l1:
|
l1:
|
||||||
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
<END> NEXT:[<SINK>] PREV:[read (Unit)]
|
||||||
error:
|
error:
|
||||||
<ERROR> NEXT:[] PREV:[]
|
<ERROR> NEXT:[] PREV:[]
|
||||||
sink:
|
sink:
|
||||||
<SINK> NEXT:[] PREV:[<END>]
|
<SINK> NEXT:[] PREV:[<END>]
|
||||||
=====================
|
=====================
|
||||||
== dowhile ==
|
== dowhile ==
|
||||||
fun dowhile() {
|
fun dowhile() {
|
||||||
@@ -33,22 +36,24 @@ fun dowhile() {
|
|||||||
}
|
}
|
||||||
---------------------
|
---------------------
|
||||||
l0:
|
l0:
|
||||||
<START> NEXT:[ret l1] PREV:[]
|
<START> NEXT:[r(do {return} while(1 > 0)) ] PREV:[]
|
||||||
|
r(do {return}
|
||||||
|
while(1 > 0)) NEXT:[ret l1] PREV:[<START>]
|
||||||
l2:
|
l2:
|
||||||
l4:
|
l4:
|
||||||
ret l1 NEXT:[<END>] PREV:[<START>]
|
ret l1 NEXT:[<END>] PREV:[r(do {return} while(1 > 0)) ]
|
||||||
l5:
|
l5:
|
||||||
- r(1) NEXT:[r(0)] PREV:[]
|
- r(1) NEXT:[r(0)] PREV:[]
|
||||||
- r(0) NEXT:[r(>)] PREV:[]
|
- r(0) NEXT:[r(>)] PREV:[]
|
||||||
- r(>) NEXT:[r(1 > 0)] PREV:[]
|
- r(>) NEXT:[r(1 > 0)] PREV:[]
|
||||||
- r(1 > 0) NEXT:[jt(l2)] PREV:[]
|
- r(1 > 0) NEXT:[jt(l2)] PREV:[]
|
||||||
- jt(l2) NEXT:[read (Unit), ret l1] PREV:[]
|
- jt(l2) NEXT:[read (Unit), ret l1] PREV:[]
|
||||||
l3:
|
l3:
|
||||||
- read (Unit) NEXT:[<END>] PREV:[]
|
- read (Unit) NEXT:[<END>] PREV:[]
|
||||||
l1:
|
l1:
|
||||||
<END> NEXT:[<SINK>] PREV:[ret l1]
|
<END> NEXT:[<SINK>] PREV:[ret l1]
|
||||||
error:
|
error:
|
||||||
<ERROR> NEXT:[] PREV:[]
|
<ERROR> NEXT:[] PREV:[]
|
||||||
sink:
|
sink:
|
||||||
<SINK> NEXT:[] PREV:[<END>]
|
<SINK> NEXT:[] PREV:[<END>]
|
||||||
=====================
|
=====================
|
||||||
|
|||||||
@@ -4,17 +4,18 @@ fun blockAndAndMismatch() : Boolean {
|
|||||||
}
|
}
|
||||||
---------------------
|
---------------------
|
||||||
l0:
|
l0:
|
||||||
<START> NEXT:[r(false)] PREV:[]
|
<START> NEXT:[r(false)] PREV:[]
|
||||||
r(false) NEXT:[jt(l2)] PREV:[<START>]
|
r(false) NEXT:[jt(l2)] PREV:[<START>]
|
||||||
jt(l2) NEXT:[r(false), r(false || (return false))] PREV:[r(false)]
|
jt(l2) NEXT:[r((return false)), r(false || (return false))] PREV:[r(false)]
|
||||||
r(false) NEXT:[ret(*) l1] PREV:[jt(l2)]
|
r((return false)) NEXT:[r(false)] PREV:[jt(l2)]
|
||||||
ret(*) l1 NEXT:[<END>] PREV:[r(false)]
|
r(false) NEXT:[ret(*) l1] PREV:[r((return false))]
|
||||||
|
ret(*) l1 NEXT:[<END>] PREV:[r(false)]
|
||||||
l2:
|
l2:
|
||||||
r(false || (return false)) NEXT:[<END>] PREV:[jt(l2)]
|
r(false || (return false)) NEXT:[<END>] PREV:[jt(l2)]
|
||||||
l1:
|
l1:
|
||||||
<END> NEXT:[<SINK>] PREV:[ret(*) l1, r(false || (return false))]
|
<END> NEXT:[<SINK>] PREV:[ret(*) l1, r(false || (return false))]
|
||||||
error:
|
error:
|
||||||
<ERROR> NEXT:[] PREV:[]
|
<ERROR> NEXT:[] PREV:[]
|
||||||
sink:
|
sink:
|
||||||
<SINK> NEXT:[] PREV:[<END>]
|
<SINK> NEXT:[] PREV:[<END>]
|
||||||
=====================
|
=====================
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ package kt1001
|
|||||||
fun foo(<!UNUSED_PARAMETER!>c<!>: Array<Int>) {
|
fun foo(<!UNUSED_PARAMETER!>c<!>: Array<Int>) {
|
||||||
return
|
return
|
||||||
|
|
||||||
for (<!UNREACHABLE_CODE!>i<!> in <!UNREACHABLE_CODE!>c<!>) {}
|
<!UNREACHABLE_CODE!>for (i in c) {}<!>
|
||||||
for (<!UNREACHABLE_CODE!>i<!> in <!UNREACHABLE_CODE!>c<!>) {}
|
<!UNREACHABLE_CODE!>for (i in c) {}<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
//more tests
|
//more tests
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
//KT-1027 Strange selection of unreachable code
|
||||||
|
//+JDK
|
||||||
|
|
||||||
|
package kt1027
|
||||||
|
|
||||||
|
import java.util.List
|
||||||
|
|
||||||
|
fun foo(<!UNUSED_PARAMETER!>c<!>: List<Int>) {
|
||||||
|
var <!UNUSED_VARIABLE!>i<!> = 2
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
<!UNREACHABLE_CODE!>for (j in c) { //strange selection of unreachable code
|
||||||
|
i += 23
|
||||||
|
}<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
fun t1() {
|
||||||
|
return
|
||||||
|
|
||||||
|
<!UNREACHABLE_CODE!>while(true) {
|
||||||
|
doSmth()
|
||||||
|
}<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
fun t2() {
|
||||||
|
return
|
||||||
|
|
||||||
|
<!UNREACHABLE_CODE!>do {
|
||||||
|
doSmth()
|
||||||
|
} while (true)<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
fun t3() {
|
||||||
|
return
|
||||||
|
|
||||||
|
<!UNREACHABLE_CODE!>try {
|
||||||
|
doSmth()
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
doSmth()
|
||||||
|
}<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
fun t4() {
|
||||||
|
return
|
||||||
|
|
||||||
|
<!UNREACHABLE_CODE!>(43)<!>
|
||||||
|
}
|
||||||
|
|
||||||
|
fun doSmth() {}
|
||||||
Reference in New Issue
Block a user