[FIR] Fix exponential analysis of augmented array access calls

^KT-50861 Fixed
This commit is contained in:
Dmitriy Novozhilov
2022-03-07 10:40:14 +03:00
committed by teamcity
parent c4735f9f29
commit ade2307345
40 changed files with 919 additions and 288 deletions
@@ -0,0 +1,116 @@
// ISSUE: KT-50861
// only plusAssign, no set
class A {
operator fun get(i: Int): A = this
operator fun plusAssign(v: () -> Unit) {}
}
fun test_1(x: A) {
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
x[1] += {
someCallInsideLambda()
Unit
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
// both fit
class D {
operator fun set(i: Int, x: D) {}
operator fun get(i: Int): D = this
operator fun plusAssign(x: () -> Unit) {}
operator fun plus(v: () -> Unit): D = this
}
fun test_2(x: D) {
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
x[1] <!ASSIGN_OPERATOR_AMBIGUITY!>+=<!> {
someCallInsideLambda()
Unit
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
fun someCallInsideLambda() {}