Fix exponential pseudocode size on incorrect prefix increments and decrements
#KT-44153 Fixed
This commit is contained in:
@@ -538,7 +538,7 @@ class ControlFlowProcessor(
|
|||||||
createNonSyntheticValue(expression, MagicKind.UNRESOLVED_CALL, baseExpression)
|
createNonSyntheticValue(expression, MagicKind.UNRESOLVED_CALL, baseExpression)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (incrementOrDecrement) {
|
if (incrementOrDecrement && resolvedCall != null) {
|
||||||
visitAssignment(baseExpression, getValueAsFunction(rhsValue), expression)
|
visitAssignment(baseExpression, getValueAsFunction(rhsValue), expression)
|
||||||
if (expression is KtPostfixExpression) {
|
if (expression is KtPostfixExpression) {
|
||||||
copyValue(baseExpression, expression)
|
copyValue(baseExpression, expression)
|
||||||
|
|||||||
@@ -26,11 +26,10 @@ L0:
|
|||||||
r(0) -> <v2>
|
r(0) -> <v2>
|
||||||
magic[UNRESOLVED_CALL](a[0]|<v1>, <v2>) -> <v3>
|
magic[UNRESOLVED_CALL](a[0]|<v1>, <v2>) -> <v3>
|
||||||
magic[UNRESOLVED_CALL](a[0]++|<v3>) -> <v4>
|
magic[UNRESOLVED_CALL](a[0]++|<v3>) -> <v4>
|
||||||
magic[UNRESOLVED_CALL](a[0]++|<v3>, <v4>) -> <v5>
|
|
||||||
L1:
|
L1:
|
||||||
1 <END> NEXT:[<SINK>]
|
1 <END> NEXT:[<SINK>]
|
||||||
error:
|
error:
|
||||||
<ERROR> PREV:[]
|
<ERROR> PREV:[]
|
||||||
sink:
|
sink:
|
||||||
<SINK> PREV:[<ERROR>, <END>]
|
<SINK> PREV:[<ERROR>, <END>]
|
||||||
=====================
|
=====================
|
||||||
|
|||||||
+2
-2
@@ -11,6 +11,6 @@ fun foo(a: A) {
|
|||||||
a <v1>: * NEW: r(a) -> <v1>
|
a <v1>: * NEW: r(a) -> <v1>
|
||||||
0 <v2>: * NEW: r(0) -> <v2>
|
0 <v2>: * NEW: r(0) -> <v2>
|
||||||
a[0] <v3>: * NEW: magic[UNRESOLVED_CALL](a[0]|<v1>, <v2>) -> <v3>
|
a[0] <v3>: * NEW: magic[UNRESOLVED_CALL](a[0]|<v1>, <v2>) -> <v3>
|
||||||
a[0]++ <v3>: * COPY
|
a[0]++ <v4>: * NEW: magic[UNRESOLVED_CALL](a[0]++|<v3>) -> <v4>
|
||||||
{ a[0]++ } <v3>: * COPY
|
{ a[0]++ } <v4>: * COPY
|
||||||
=====================
|
=====================
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
== crash_1 ==
|
||||||
|
fun crash_1() {
|
||||||
|
"".split(----------------------------------)
|
||||||
|
}
|
||||||
|
---------------------
|
||||||
|
L0:
|
||||||
|
1 <START>
|
||||||
|
2 mark({ "".split(----------------------------------) })
|
||||||
|
mark("".split(----------------------------------))
|
||||||
|
magic[UNRESOLVED_CALL](----|!<v0>) -> <v1>
|
||||||
|
magic[UNRESOLVED_CALL](------|<v1>) -> <v2>
|
||||||
|
magic[UNRESOLVED_CALL](--------|<v2>) -> <v3>
|
||||||
|
magic[UNRESOLVED_CALL](----------|<v3>) -> <v4>
|
||||||
|
magic[UNRESOLVED_CALL](------------|<v4>) -> <v5>
|
||||||
|
magic[UNRESOLVED_CALL](--------------|<v5>) -> <v6>
|
||||||
|
magic[UNRESOLVED_CALL](----------------|<v6>) -> <v7>
|
||||||
|
magic[UNRESOLVED_CALL](------------------|<v7>) -> <v8>
|
||||||
|
magic[UNRESOLVED_CALL](--------------------|<v8>) -> <v9>
|
||||||
|
magic[UNRESOLVED_CALL](----------------------|<v9>) -> <v10>
|
||||||
|
magic[UNRESOLVED_CALL](------------------------|<v10>) -> <v11>
|
||||||
|
magic[UNRESOLVED_CALL](--------------------------|<v11>) -> <v12>
|
||||||
|
magic[UNRESOLVED_CALL](----------------------------|<v12>) -> <v13>
|
||||||
|
magic[UNRESOLVED_CALL](------------------------------|<v13>) -> <v14>
|
||||||
|
magic[UNRESOLVED_CALL](--------------------------------|<v14>) -> <v15>
|
||||||
|
magic[UNRESOLVED_CALL](----------------------------------|<v15>) -> <v16>
|
||||||
|
mark("")
|
||||||
|
r("") -> <v17>
|
||||||
|
mark(split(----------------------------------))
|
||||||
|
magic[UNRESOLVED_CALL](split(----------------------------------)|<v16>, !<v18>, <v17>) -> <v19>
|
||||||
|
L1:
|
||||||
|
1 <END> NEXT:[<SINK>]
|
||||||
|
error:
|
||||||
|
<ERROR> PREV:[]
|
||||||
|
sink:
|
||||||
|
<SINK> PREV:[<ERROR>, <END>]
|
||||||
|
=====================
|
||||||
|
== crash_2 ==
|
||||||
|
fun crash_2() {
|
||||||
|
"".split(-----------------------------------)
|
||||||
|
}
|
||||||
|
---------------------
|
||||||
|
L0:
|
||||||
|
1 <START>
|
||||||
|
2 mark({ "".split(-----------------------------------) })
|
||||||
|
mark("".split(-----------------------------------))
|
||||||
|
magic[UNRESOLVED_CALL](---|!<v0>) -> <v1>
|
||||||
|
magic[UNRESOLVED_CALL](-----|<v1>) -> <v2>
|
||||||
|
magic[UNRESOLVED_CALL](-------|<v2>) -> <v3>
|
||||||
|
magic[UNRESOLVED_CALL](---------|<v3>) -> <v4>
|
||||||
|
magic[UNRESOLVED_CALL](-----------|<v4>) -> <v5>
|
||||||
|
magic[UNRESOLVED_CALL](-------------|<v5>) -> <v6>
|
||||||
|
magic[UNRESOLVED_CALL](---------------|<v6>) -> <v7>
|
||||||
|
magic[UNRESOLVED_CALL](-----------------|<v7>) -> <v8>
|
||||||
|
magic[UNRESOLVED_CALL](-------------------|<v8>) -> <v9>
|
||||||
|
magic[UNRESOLVED_CALL](---------------------|<v9>) -> <v10>
|
||||||
|
magic[UNRESOLVED_CALL](-----------------------|<v10>) -> <v11>
|
||||||
|
magic[UNRESOLVED_CALL](-------------------------|<v11>) -> <v12>
|
||||||
|
magic[UNRESOLVED_CALL](---------------------------|<v12>) -> <v13>
|
||||||
|
magic[UNRESOLVED_CALL](-----------------------------|<v13>) -> <v14>
|
||||||
|
magic[UNRESOLVED_CALL](-------------------------------|<v14>) -> <v15>
|
||||||
|
magic[UNRESOLVED_CALL](---------------------------------|<v15>) -> <v16>
|
||||||
|
magic[UNRESOLVED_CALL](-----------------------------------|<v16>) -> <v17>
|
||||||
|
mark("")
|
||||||
|
r("") -> <v18>
|
||||||
|
mark(split(-----------------------------------))
|
||||||
|
magic[UNRESOLVED_CALL](split(-----------------------------------)|<v17>, !<v19>, <v18>) -> <v20>
|
||||||
|
L1:
|
||||||
|
1 <END> NEXT:[<SINK>]
|
||||||
|
error:
|
||||||
|
<ERROR> PREV:[]
|
||||||
|
sink:
|
||||||
|
<SINK> PREV:[<ERROR>, <END>]
|
||||||
|
=====================
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
// ISSUE: KT-44153
|
||||||
|
|
||||||
|
fun crash_1() {
|
||||||
|
"".split(----------------------------------)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun crash_2() {
|
||||||
|
"".split(-----------------------------------)
|
||||||
|
}
|
||||||
+57
@@ -0,0 +1,57 @@
|
|||||||
|
== crash_1 ==
|
||||||
|
fun crash_1() {
|
||||||
|
"".split(----------------------------------)
|
||||||
|
}
|
||||||
|
---------------------
|
||||||
|
"" <v17>: * NEW: r("") -> <v17>
|
||||||
|
split !<v18>: *
|
||||||
|
-- !<v0>: *
|
||||||
|
---- <v1>: * NEW: magic[UNRESOLVED_CALL](----|!<v0>) -> <v1>
|
||||||
|
------ <v2>: * NEW: magic[UNRESOLVED_CALL](------|<v1>) -> <v2>
|
||||||
|
-------- <v3>: * NEW: magic[UNRESOLVED_CALL](--------|<v2>) -> <v3>
|
||||||
|
---------- <v4>: * NEW: magic[UNRESOLVED_CALL](----------|<v3>) -> <v4>
|
||||||
|
------------ <v5>: * NEW: magic[UNRESOLVED_CALL](------------|<v4>) -> <v5>
|
||||||
|
-------------- <v6>: * NEW: magic[UNRESOLVED_CALL](--------------|<v5>) -> <v6>
|
||||||
|
---------------- <v7>: * NEW: magic[UNRESOLVED_CALL](----------------|<v6>) -> <v7>
|
||||||
|
------------------ <v8>: * NEW: magic[UNRESOLVED_CALL](------------------|<v7>) -> <v8>
|
||||||
|
-------------------- <v9>: * NEW: magic[UNRESOLVED_CALL](--------------------|<v8>) -> <v9>
|
||||||
|
---------------------- <v10>: * NEW: magic[UNRESOLVED_CALL](----------------------|<v9>) -> <v10>
|
||||||
|
------------------------ <v11>: * NEW: magic[UNRESOLVED_CALL](------------------------|<v10>) -> <v11>
|
||||||
|
-------------------------- <v12>: * NEW: magic[UNRESOLVED_CALL](--------------------------|<v11>) -> <v12>
|
||||||
|
---------------------------- <v13>: * NEW: magic[UNRESOLVED_CALL](----------------------------|<v12>) -> <v13>
|
||||||
|
------------------------------ <v14>: * NEW: magic[UNRESOLVED_CALL](------------------------------|<v13>) -> <v14>
|
||||||
|
-------------------------------- <v15>: * NEW: magic[UNRESOLVED_CALL](--------------------------------|<v14>) -> <v15>
|
||||||
|
---------------------------------- <v16>: * NEW: magic[UNRESOLVED_CALL](----------------------------------|<v15>) -> <v16>
|
||||||
|
split(----------------------------------) <v19>: * NEW: magic[UNRESOLVED_CALL](split(----------------------------------)|<v16>, !<v18>, <v17>) -> <v19>
|
||||||
|
"".split(----------------------------------) <v19>: * COPY
|
||||||
|
{ "".split(----------------------------------) } <v19>: * COPY
|
||||||
|
=====================
|
||||||
|
== crash_2 ==
|
||||||
|
fun crash_2() {
|
||||||
|
"".split(-----------------------------------)
|
||||||
|
}
|
||||||
|
---------------------
|
||||||
|
"" <v18>: * NEW: r("") -> <v18>
|
||||||
|
split !<v19>: *
|
||||||
|
- !<v0>: *
|
||||||
|
--- <v1>: * NEW: magic[UNRESOLVED_CALL](---|!<v0>) -> <v1>
|
||||||
|
----- <v2>: * NEW: magic[UNRESOLVED_CALL](-----|<v1>) -> <v2>
|
||||||
|
------- <v3>: * NEW: magic[UNRESOLVED_CALL](-------|<v2>) -> <v3>
|
||||||
|
--------- <v4>: * NEW: magic[UNRESOLVED_CALL](---------|<v3>) -> <v4>
|
||||||
|
----------- <v5>: * NEW: magic[UNRESOLVED_CALL](-----------|<v4>) -> <v5>
|
||||||
|
------------- <v6>: * NEW: magic[UNRESOLVED_CALL](-------------|<v5>) -> <v6>
|
||||||
|
--------------- <v7>: * NEW: magic[UNRESOLVED_CALL](---------------|<v6>) -> <v7>
|
||||||
|
----------------- <v8>: * NEW: magic[UNRESOLVED_CALL](-----------------|<v7>) -> <v8>
|
||||||
|
------------------- <v9>: * NEW: magic[UNRESOLVED_CALL](-------------------|<v8>) -> <v9>
|
||||||
|
--------------------- <v10>: * NEW: magic[UNRESOLVED_CALL](---------------------|<v9>) -> <v10>
|
||||||
|
----------------------- <v11>: * NEW: magic[UNRESOLVED_CALL](-----------------------|<v10>) -> <v11>
|
||||||
|
------------------------- <v12>: * NEW: magic[UNRESOLVED_CALL](-------------------------|<v11>) -> <v12>
|
||||||
|
--------------------------- <v13>: * NEW: magic[UNRESOLVED_CALL](---------------------------|<v12>) -> <v13>
|
||||||
|
----------------------------- <v14>: * NEW: magic[UNRESOLVED_CALL](-----------------------------|<v13>) -> <v14>
|
||||||
|
------------------------------- <v15>: * NEW: magic[UNRESOLVED_CALL](-------------------------------|<v14>) -> <v15>
|
||||||
|
--------------------------------- <v16>: * NEW: magic[UNRESOLVED_CALL](---------------------------------|<v15>) -> <v16>
|
||||||
|
----------------------------------- <v17>: * NEW: magic[UNRESOLVED_CALL](-----------------------------------|<v16>) -> <v17>
|
||||||
|
split(-----------------------------------) <v20>: * NEW: magic[UNRESOLVED_CALL](split(-----------------------------------)|<v17>, !<v19>, <v18>) -> <v20>
|
||||||
|
"".split(-----------------------------------) <v20>: * COPY
|
||||||
|
{ "".split(-----------------------------------) } <v20>: * COPY
|
||||||
|
=====================
|
||||||
-9
@@ -1,9 +0,0 @@
|
|||||||
public fun foo() {
|
|
||||||
var i: Any = 1
|
|
||||||
if (i is Int) {
|
|
||||||
while (i != 10) {
|
|
||||||
i<!UNRESOLVED_REFERENCE!>++<!> // Here smart cast should not be performed due to a successor
|
|
||||||
i = ""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+3
-1
@@ -1,8 +1,10 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
|
|
||||||
public fun foo() {
|
public fun foo() {
|
||||||
var i: Any = 1
|
var i: Any = 1
|
||||||
if (i is Int) {
|
if (i is Int) {
|
||||||
while (i != 10) {
|
while (i != 10) {
|
||||||
<!UNUSED_CHANGED_VALUE!>i<!UNRESOLVED_REFERENCE!>++<!><!> // Here smart cast should not be performed due to a successor
|
i<!UNRESOLVED_REFERENCE!>++<!> // Here smart cast should not be performed due to a successor
|
||||||
i = ""
|
i = ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,6 +154,11 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest {
|
|||||||
runTest("compiler/testData/cfg/bugs/kt37447.kt");
|
runTest("compiler/testData/cfg/bugs/kt37447.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt44153.kt")
|
||||||
|
public void testKt44153() throws Exception {
|
||||||
|
runTest("compiler/testData/cfg/bugs/kt44153.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt7761.kt")
|
@TestMetadata("kt7761.kt")
|
||||||
public void testKt7761() throws Exception {
|
public void testKt7761() throws Exception {
|
||||||
runTest("compiler/testData/cfg/bugs/kt7761.kt");
|
runTest("compiler/testData/cfg/bugs/kt7761.kt");
|
||||||
|
|||||||
@@ -154,6 +154,11 @@ public class PseudoValueTestGenerated extends AbstractPseudoValueTest {
|
|||||||
runTest("compiler/testData/cfg/bugs/kt37447.kt");
|
runTest("compiler/testData/cfg/bugs/kt37447.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt44153.kt")
|
||||||
|
public void testKt44153() throws Exception {
|
||||||
|
runTest("compiler/testData/cfg/bugs/kt44153.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt7761.kt")
|
@TestMetadata("kt7761.kt")
|
||||||
public void testKt7761() throws Exception {
|
public void testKt7761() throws Exception {
|
||||||
runTest("compiler/testData/cfg/bugs/kt7761.kt");
|
runTest("compiler/testData/cfg/bugs/kt7761.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user