Fix exponential pseudocode size on incorrect prefix increments and decrements

#KT-44153 Fixed
This commit is contained in:
Dmitriy Novozhilov
2021-03-15 18:34:28 +03:00
parent 6c5557dae3
commit cef859fced
10 changed files with 161 additions and 20 deletions
@@ -538,7 +538,7 @@ class ControlFlowProcessor(
createNonSyntheticValue(expression, MagicKind.UNRESOLVED_CALL, baseExpression)
}
if (incrementOrDecrement) {
if (incrementOrDecrement && resolvedCall != null) {
visitAssignment(baseExpression, getValueAsFunction(rhsValue), expression)
if (expression is KtPostfixExpression) {
copyValue(baseExpression, expression)
@@ -1681,4 +1681,4 @@ class ControlFlowProcessor(
return parameterValues
}
}
}
}
@@ -26,11 +26,10 @@ L0:
r(0) -> <v2>
magic[UNRESOLVED_CALL](a[0]|<v1>, <v2>) -> <v3>
magic[UNRESOLVED_CALL](a[0]++|<v3>) -> <v4>
magic[UNRESOLVED_CALL](a[0]++|<v3>, <v4>) -> <v5>
L1:
1 <END> NEXT:[<SINK>]
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
+3 -3
View File
@@ -11,6 +11,6 @@ fun foo(a: A) {
a <v1>: * NEW: r(a) -> <v1>
0 <v2>: * NEW: r(0) -> <v2>
a[0] <v3>: * NEW: magic[UNRESOLVED_CALL](a[0]|<v1>, <v2>) -> <v3>
a[0]++ <v3>: * COPY
{ a[0]++ } <v3>: * COPY
=====================
a[0]++ <v4>: * NEW: magic[UNRESOLVED_CALL](a[0]++|<v3>) -> <v4>
{ a[0]++ } <v4>: * COPY
=====================
+73
View File
@@ -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
View File
@@ -0,0 +1,9 @@
// ISSUE: KT-44153
fun crash_1() {
"".split(----------------------------------)
}
fun crash_2() {
"".split(-----------------------------------)
}
+57
View File
@@ -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
=====================
@@ -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 = ""
}
}
}
@@ -1,9 +1,11 @@
// FIR_IDENTICAL
public fun foo() {
var i: Any = 1
if (i is Int) {
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 = ""
}
}
}
}
@@ -154,6 +154,11 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest {
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")
public void testKt7761() throws Exception {
runTest("compiler/testData/cfg/bugs/kt7761.kt");
@@ -154,6 +154,11 @@ public class PseudoValueTestGenerated extends AbstractPseudoValueTest {
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")
public void testKt7761() throws Exception {
runTest("compiler/testData/cfg/bugs/kt7761.kt");