[FIR] Desugar increment/decrement in body resolve phase
The expression needs to be resolved first to determine if there is a receiver that needs to be extracted to a temporary variable. Also, the special case for prefix increment/decrement on local variable without delegates requires resolution to check if the variable is local. ^KT-56771 Fixed ^KT-56659 Fixed
This commit is contained in:
committed by
Space Team
parent
5ecf9cce25
commit
3b9724d20e
@@ -1,3 +1,6 @@
|
||||
// IGNORE_BACKEND_K2: ANY
|
||||
// Behavior changed in K2, see KT-42077
|
||||
|
||||
public var inc: Int = 0
|
||||
|
||||
public var propInc: Int = 0
|
||||
@@ -26,4 +29,4 @@ fun box(): String {
|
||||
if (propDec != -1) return "fail in prefix decrement: ${propDec} != -1"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
// IGNORE_BACKEND_K1: ANY
|
||||
// Behavior changed in K2, see KT-42077
|
||||
// IGNORE_BACKEND: WASM
|
||||
// SKIP_NODE_JS
|
||||
|
||||
public var inc: Int = 0
|
||||
|
||||
public var propInc: Int = 0
|
||||
get() {++inc; return field}
|
||||
set(a: Int) {
|
||||
++inc
|
||||
field = a
|
||||
}
|
||||
|
||||
public var dec: Int = 0
|
||||
|
||||
public var propDec: Int = 0
|
||||
get() { --dec; return field}
|
||||
set(a: Int) {
|
||||
--dec
|
||||
field = a
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
++propInc
|
||||
if (inc != 2) return "fail in prefix increment: ${inc} != 2"
|
||||
if (propInc != 1) return "fail in prefix increment: ${propInc} != 1"
|
||||
|
||||
--propDec
|
||||
if (dec != -2) return "fail in prefix decrement: ${dec} != -2"
|
||||
if (propDec != -1) return "fail in prefix decrement: ${propDec} != -1"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,3 +1,6 @@
|
||||
// IGNORE_BACKEND_K2: ANY
|
||||
// Behavior changed in K2, see KT-42077
|
||||
|
||||
class A {
|
||||
companion object {
|
||||
private var r: Int = 1;
|
||||
@@ -70,4 +73,4 @@ fun box() : String {
|
||||
if (p4 != 3 || A.holder != "getR4setR4:getR4setR4getR4getR4") return "fail 4: $p4 ${A.holder}"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
// IGNORE_BACKEND_K1: ANY
|
||||
// Behavior changed in K2, see KT-42077
|
||||
// IGNORE_BACKEND: WASM
|
||||
// SKIP_NODE_JS
|
||||
|
||||
class A {
|
||||
companion object {
|
||||
private var r: Int = 1;
|
||||
|
||||
fun test(): Int {
|
||||
r++
|
||||
++r
|
||||
return r
|
||||
}
|
||||
|
||||
var holder: String = ""
|
||||
|
||||
var r2: Int = 1
|
||||
get() {
|
||||
holder += "getR2"
|
||||
return field
|
||||
}
|
||||
|
||||
fun test2() : Int {
|
||||
r2++
|
||||
++r2
|
||||
return r2
|
||||
}
|
||||
|
||||
var r3: Int = 1
|
||||
set(p: Int) {
|
||||
holder += "setR3"
|
||||
field = p
|
||||
}
|
||||
|
||||
fun test3() : Int {
|
||||
r3++
|
||||
++r3
|
||||
return r3
|
||||
}
|
||||
|
||||
var r4: Int = 1
|
||||
get() {
|
||||
holder += "getR4"
|
||||
return field
|
||||
}
|
||||
set(p: Int) {
|
||||
holder += "setR4"
|
||||
field = p
|
||||
}
|
||||
|
||||
fun test4() : Int {
|
||||
r4++
|
||||
holder += ":"
|
||||
++r4
|
||||
return r4
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun box() : String {
|
||||
val p = A.test()
|
||||
if (p != 3) return "fail 1: $p"
|
||||
|
||||
val p2 = A.test2()
|
||||
var holderValue = A.holder
|
||||
if (p2 != 3 || holderValue != "getR2getR2getR2") return "fail 2: $p2 ${holderValue}"
|
||||
|
||||
A.holder = ""
|
||||
val p3 = A.test3()
|
||||
if (p3 != 3 || A.holder != "setR3setR3") return "fail 3: $p3 ${A.holder}"
|
||||
|
||||
A.holder = ""
|
||||
val p4 = A.test4()
|
||||
if (p4 != 3 || A.holder != "getR4setR4:getR4setR4getR4") return "fail 4: $p4 ${A.holder}"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+4
-1
@@ -1,3 +1,6 @@
|
||||
// IGNORE_BACKEND_K2: ANY
|
||||
// Behavior changed in K2, see KT-42077
|
||||
|
||||
object A {
|
||||
private var r: Int = 1;
|
||||
|
||||
@@ -68,4 +71,4 @@ fun box() : String {
|
||||
if (p4 != 3 || A.holder != "getR4setR4:getR4setR4getR4getR4") return "fail 4: $p4 ${A.holder}"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
// IGNORE_BACKEND_K1: ANY
|
||||
// Behavior changed in K2, see KT-42077
|
||||
// IGNORE_BACKEND: WASM
|
||||
// SKIP_NODE_JS
|
||||
|
||||
object A {
|
||||
private var r: Int = 1;
|
||||
|
||||
fun test() : Int {
|
||||
r++
|
||||
++r
|
||||
return r
|
||||
}
|
||||
|
||||
var holder: String = ""
|
||||
|
||||
var r2: Int = 1
|
||||
get() {
|
||||
holder += "getR2"
|
||||
return field
|
||||
}
|
||||
|
||||
fun test2() : Int {
|
||||
r2++
|
||||
++r2
|
||||
return r2
|
||||
}
|
||||
|
||||
var r3: Int = 1
|
||||
set(p: Int) {
|
||||
holder += "setR3"
|
||||
field = p
|
||||
}
|
||||
|
||||
fun test3() : Int {
|
||||
r3++
|
||||
++r3
|
||||
return r3
|
||||
}
|
||||
|
||||
var r4: Int = 1
|
||||
get() {
|
||||
holder += "getR4"
|
||||
return field
|
||||
}
|
||||
set(p: Int) {
|
||||
holder += "setR4"
|
||||
field = p
|
||||
}
|
||||
|
||||
fun test4() : Int {
|
||||
r4++
|
||||
holder += ":"
|
||||
++r4
|
||||
return r4
|
||||
}
|
||||
}
|
||||
|
||||
fun box() : String {
|
||||
val p = A.test()
|
||||
if (p != 3) return "fail 1: $p"
|
||||
|
||||
val p2 = A.test2()
|
||||
val holderValue = A.holder
|
||||
if (p2 != 3 || holderValue != "getR2getR2getR2") return "fail 2: $p2 ${holderValue}"
|
||||
|
||||
A.holder = ""
|
||||
val p3 = A.test3()
|
||||
if (p3 != 3 || A.holder != "setR3setR3") return "fail 3: $p3 ${A.holder}"
|
||||
|
||||
A.holder = ""
|
||||
val p4 = A.test4()
|
||||
if (p4 != 3 || A.holder != "getR4setR4:getR4setR4getR4") return "fail 4: $p4 ${A.holder}"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user