diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/overload-resolution/building-the-overload-candidate-set-ocs/infix-function-call/pos/1.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/overload-resolution/building-the-overload-candidate-set-ocs/infix-function-call/pos/1.fir.kt new file mode 100644 index 00000000000..3612c725935 --- /dev/null +++ b/compiler/tests-spec/testData/diagnostics/notLinked/overload-resolution/building-the-overload-candidate-set-ocs/infix-function-call/pos/1.fir.kt @@ -0,0 +1,33 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// SKIP_TXT + +/* + * KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (POSITIVE) + * + * SECTIONS: overload-resolution, building-the-overload-candidate-set-ocs, infix-function-call + * NUMBER: 1 + * DESCRIPTION: Not null Smartcast doesn't work in case of property infix call + * UNEXPECTED BEHAVIOUR + * ISSUES: KT-36786 + */ + +class C() { + infix operator fun invoke(i: Int) { } //(1) +} + +class B(val memberValCNull: C? = null) { + infix fun bar(i: Int) {} +} + +// TESTCASE NUMBER: 1 +fun case1() { + val b: B = B() +// b memberValCNull 1 //nok (UNSAFE_INFIX_CALL) +// b.memberValCNull.invoke(1) //nok (UNSAFE_CALL) + + if (b.memberValCNull != null) { + b memberValCNull 1 //nok (UNSAFE_INFIX_CALL) !!!! + b.memberValCNull.invoke(2) //ok + b.memberValCNull(3) //nok (UNSAFE_CALL) !!! + } +} diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/overload-resolution/building-the-overload-candidate-set-ocs/infix-function-call/pos/2.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/overload-resolution/building-the-overload-candidate-set-ocs/infix-function-call/pos/2.fir.kt new file mode 100644 index 00000000000..c4a64045bd7 --- /dev/null +++ b/compiler/tests-spec/testData/diagnostics/notLinked/overload-resolution/building-the-overload-candidate-set-ocs/infix-function-call/pos/2.fir.kt @@ -0,0 +1,33 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// SKIP_TXT + +/* + * KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (POSITIVE) + * + * SECTIONS: overload-resolution, building-the-overload-candidate-set-ocs, infix-function-call + * NUMBER: 2 + * DESCRIPTION: is-check Smartcast doesn't work in case of property infix call + * UNEXPECTED BEHAVIOUR + * ISSUES: KT-36786 + */ + +class B(val memberVal: Any) +class C() { + infix operator fun invoke(i: Int) { } //(1) +} +// TESTCASE NUMBER: 1 +fun case1() { + val b: B = B(C()) + b memberVal 1 //nok UNRESOLVED_REFERENCE + b.memberVal.invoke(2) //nok UNRESOLVED_REFERENCE + b.memberVal(1) //nok FUNCTION_EXPECTED + + if (b.memberVal is C) { + + b memberVal 1 //nok UNRESOLVED_REFERENCE !!!! + b.memberVal.invoke(1) //ok + + b.memberVal(1) //nok FUNCTION_EXPECTED !!! + (b.memberVal)(1) //ok + } +} diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/overload-resolution/building-the-overload-candidate-set-ocs/infix-function-call/pos/3.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/overload-resolution/building-the-overload-candidate-set-ocs/infix-function-call/pos/3.fir.kt new file mode 100644 index 00000000000..0247b3edd17 --- /dev/null +++ b/compiler/tests-spec/testData/diagnostics/notLinked/overload-resolution/building-the-overload-candidate-set-ocs/infix-function-call/pos/3.fir.kt @@ -0,0 +1,34 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// SKIP_TXT + +/* + * KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (POSITIVE) + * + * SECTIONS: overload-resolution, building-the-overload-candidate-set-ocs, infix-function-call + * NUMBER: 3 + * DESCRIPTION: "Unsafe" cast doesn't work in case of property infix call + * UNEXPECTED BEHAVIOUR + * ISSUES: KT-36786 + */ + +class B(val memberVal: Any) +class C() { + infix operator fun invoke(i: Int) { } //(1) +} + +// TESTCASE NUMBER: 1 +fun case1() { + val b: B = B(C()) + b memberVal 1 //nok UNRESOLVED_REFERENCE + b.memberVal.invoke(2) //nok UNRESOLVED_REFERENCE + b.memberVal(1) //nok FUNCTION_EXPECTED + + b.memberVal as C + + b memberVal 1 //nok UNRESOLVED_REFERENCE !!!! + b.memberVal.invoke(1) //ok + + b.memberVal(1) //nok FUNCTION_EXPECTED !!! + (b.memberVal)(1) //ok + +} diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/overload-resolution/building-the-overload-candidate-set-ocs/infix-function-call/pos/4.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/overload-resolution/building-the-overload-candidate-set-ocs/infix-function-call/pos/4.fir.kt new file mode 100644 index 00000000000..b2aa4430e9d --- /dev/null +++ b/compiler/tests-spec/testData/diagnostics/notLinked/overload-resolution/building-the-overload-candidate-set-ocs/infix-function-call/pos/4.fir.kt @@ -0,0 +1,109 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// SKIP_TXT + +/* + * KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (POSITIVE) + * + * SECTIONS: overload-resolution, building-the-overload-candidate-set-ocs, infix-function-call + * NUMBER: 4 + * DESCRIPTION: Local extension infix extension callables + * UNEXPECTED BEHAVIOUR + * ISSUES: KT-36786 + */ + + +// TESTCASE NUMBER: 1, 2 +// FILE: infixLib.kt +package libPackage + +class C() { + infix operator fun invoke(i: Int) {} +} + +class B() { + val barC: C = TODO() + val B.barC: C + get() = TODO() + + infix fun fooC(i: Int) = {} + infix fun B.fooC(i: Int) = + {} +} + +infix fun B.fooC(i: Int) = {} +val B.barC: C +get() = TODO() + + +// FILE: TestCase1.kt +/* + * TESTCASE NUMBER: 1 + * NOTE: should be resolved to member properties, others should be shadowed by member function + */ +package testPackInfix +import libPackage.C +import libPackage.B +import libPackage.* + + +fun case1() { + class Case() { + val B.barC: C + get() = TODO() + + fun case() { + val b = B() + b fooC 3 + b barC 3 + } + } + + fun case() { + val b = B() + b fooC 3 + b barC 3 + } +} + +// FILE: TestCase2.kt +/* + * TESTCASE NUMBER: 2 + * NOTE: should be resolved to member properties, others should be shadowed by member property with invoke or by member function + */ +package testPackInfix +import libPackage.C +import libPackage.B +import libPackage.* +import libPackage.fooC +import libPackage.barC + +/*should be shadowed by member function*/ +infix fun B.fooC(i: Int) = {} +/*should be shadowed by member property with invoke*/ +infix fun B.barC(i: Int) = {} +/*should be shadowed by member property*/ +val B.barC: C +get() = TODO() + +fun case2() { + class Case() { + /*should be shadowed by member property*/ + val B.barC: C + get() = TODO() + /*should be shadowed by member property with invoke*/ + infix fun B.barC(i: Int) = {} + /*should be shadowed by member function*/ + infix fun B.fooC(i: Int) = {} + fun case() { + val b = B() + b fooC 3 + b barC 3 + } + } + + fun case() { + val b = B() + b fooC 3 + b barC 3 + } +}