FIR: Change semantics for combination of safe calls and operators
^KT-41034 Fixed
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
var cnt = 0
|
||||
|
||||
class A
|
||||
|
||||
var A?.b: A?
|
||||
get() {
|
||||
return this
|
||||
}
|
||||
set(v) {
|
||||
cnt++
|
||||
}
|
||||
|
||||
var A?.c: A?
|
||||
get() {
|
||||
return this
|
||||
}
|
||||
set(v) {
|
||||
cnt++
|
||||
}
|
||||
|
||||
operator fun A?.get(i: Int): A? = this
|
||||
operator fun A?.set(i: Int, v: A?): A? {
|
||||
cnt++
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
operator fun A?.plus(a: A?) = this
|
||||
|
||||
fun test(a: A?) {
|
||||
a?.b += null
|
||||
a?.b?.c += null
|
||||
a?.b.c += null // ".c" will be called anyway
|
||||
|
||||
a?.b[0] += null
|
||||
a?.b?.c[0] += null
|
||||
a?.b.c[0] += null // ".c" will be called anyway
|
||||
|
||||
a?.b[0][0] += null
|
||||
a?.b?.c[0][0] += null
|
||||
a?.b.c[0][0] += null // ".c" will be called anyway
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
test(null)
|
||||
if (cnt != 3) return "fail 1: $cnt"
|
||||
|
||||
cnt = 0
|
||||
test(A())
|
||||
if (cnt != 9) return "fail 2: $cnt"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
var cnt = 0
|
||||
|
||||
class A
|
||||
|
||||
var A?.b: A?
|
||||
get() {
|
||||
return this
|
||||
}
|
||||
set(v) {
|
||||
cnt++
|
||||
}
|
||||
|
||||
var A?.c: A?
|
||||
get() {
|
||||
return this
|
||||
}
|
||||
set(v) {
|
||||
cnt++
|
||||
}
|
||||
|
||||
operator fun A?.get(i: Int): A? = this
|
||||
|
||||
operator fun A?.plusAssign(a: A?) {
|
||||
cnt++
|
||||
}
|
||||
|
||||
fun test(a: A?) {
|
||||
a?.b += null
|
||||
a?.b?.c += null
|
||||
a?.b.c += null // ".c" will be called anyway
|
||||
|
||||
a?.b[0] += null
|
||||
a?.b?.c[0] += null
|
||||
a?.b.c[0] += null // ".c" will be called anyway
|
||||
|
||||
a?.b[0][0] += null
|
||||
a?.b?.c[0][0] += null
|
||||
a?.b.c[0][0] += null // ".c" will be called anyway
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
test(null)
|
||||
if (cnt != 3) return "fail 1: $cnt"
|
||||
|
||||
cnt = 0
|
||||
test(A())
|
||||
if (cnt != 9) return "fail 2: $cnt"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
var cnt = 0
|
||||
|
||||
class A
|
||||
|
||||
var A?.b: A?
|
||||
get() {
|
||||
return this
|
||||
}
|
||||
set(v) {
|
||||
cnt++
|
||||
}
|
||||
|
||||
var A?.c: A?
|
||||
get() {
|
||||
return this
|
||||
}
|
||||
set(v) {
|
||||
cnt++
|
||||
}
|
||||
|
||||
operator fun A?.get(i: Int): A? = this
|
||||
operator fun A?.set(i: Int, v: A?): A? {
|
||||
cnt++
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
operator fun A?.inc(): A? {
|
||||
return this
|
||||
}
|
||||
|
||||
fun test(a: A?) {
|
||||
a?.b++
|
||||
a?.b?.c++
|
||||
a?.b.c++ // ".c" will be called anyway
|
||||
|
||||
a?.b[0]++
|
||||
a?.b?.c[0]++
|
||||
a?.b.c[0]++ // ".c" will be called anyway
|
||||
|
||||
a?.b[0][0]++
|
||||
a?.b?.c[0][0]++
|
||||
a?.b.c[0][0]++ // ".c" will be called anyway
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
test(null)
|
||||
if (cnt != 3) return "fail 1: $cnt"
|
||||
|
||||
cnt = 0
|
||||
test(A())
|
||||
if (cnt != 9) return "fail 2: $cnt"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
var cnt = 0
|
||||
|
||||
class A
|
||||
|
||||
var A?.b: A?
|
||||
get() {
|
||||
return this
|
||||
}
|
||||
set(v) {
|
||||
cnt++
|
||||
}
|
||||
|
||||
var A?.c: A?
|
||||
get() {
|
||||
return this
|
||||
}
|
||||
set(v) {
|
||||
cnt++
|
||||
}
|
||||
|
||||
operator fun A?.get(i: Int): A? = this
|
||||
operator fun A?.set(i: Int, v: A?): A? {
|
||||
cnt++
|
||||
return this
|
||||
}
|
||||
|
||||
operator fun A?.inc(): A? {
|
||||
return this
|
||||
}
|
||||
|
||||
fun test(a: A?) {
|
||||
++a?.b
|
||||
++a?.b?.c
|
||||
++a?.b.c // ".c" will be called anyway
|
||||
|
||||
++a?.b[0]
|
||||
++a?.b?.c[0]
|
||||
++a?.b.c[0] // ".c" will be called anyway
|
||||
|
||||
++a?.b[0][0]
|
||||
++a?.b?.c[0][0]
|
||||
++a?.b.c[0][0] // ".c" will be called anyway
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
test(null)
|
||||
if (cnt != 3) return "fail 1: $cnt"
|
||||
|
||||
cnt = 0
|
||||
test(A())
|
||||
if (cnt != 9) return "fail 2: $cnt"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
|
||||
var cnt = 0
|
||||
|
||||
class A
|
||||
|
||||
var A?.b: A?
|
||||
get() {
|
||||
return this
|
||||
}
|
||||
set(v) {
|
||||
cnt++
|
||||
}
|
||||
|
||||
var A?.c: A?
|
||||
get() {
|
||||
return this
|
||||
}
|
||||
set(v) {
|
||||
cnt++
|
||||
}
|
||||
|
||||
operator fun A?.get(i: Int): A? = this
|
||||
operator fun A?.set(i: Int, v: A?): A? {
|
||||
cnt++
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
fun test(a: A?) {
|
||||
a?.b = null
|
||||
a?.b?.c = null
|
||||
a?.b.c = null // ".c" will be called anyway
|
||||
|
||||
a?.b[0] = null
|
||||
a?.b?.c[0] = null
|
||||
a?.b.c[0] = null // ".c" will be called anyway
|
||||
|
||||
a?.b[0][0] = null
|
||||
a?.b?.c[0][0] = null
|
||||
a?.b.c[0][0] = null // ".c" will be called anyway
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
test(null)
|
||||
if (cnt != 3) return "fail 1: $cnt"
|
||||
|
||||
cnt = 0
|
||||
test(A())
|
||||
if (cnt != 9) return "fail 2: $cnt"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user