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)
|
||||
}
|
||||
|
||||
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
@@ -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
@@ -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 = ""
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-2
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user