[NI] Don't stop on a candidate with unstable smartcast error

#KT-36847 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2020-02-20 03:08:29 +03:00
parent 162a2d5851
commit 83824d0ba6
7 changed files with 86 additions and 100 deletions
@@ -152,9 +152,7 @@ sealed class UnstableSmartCast(
targetType: UnwrappedType,
isReceiver: Boolean = false, // for reproducing OI behaviour
): UnstableSmartCast {
return if (isReceiver)
UnstableSmartCastResolutionError(argument, targetType)
else UnstableSmartCastDiagnosticError(argument, targetType)
return UnstableSmartCastResolutionError(argument, targetType)
}
}
}
+1 -1
View File
@@ -12,7 +12,7 @@ class Cls {
fun test(s: String) {
if (s.ext is B)
take(<!NI;SMARTCAST_IMPOSSIBLE, SMARTCAST_IMPOSSIBLE!>s.ext<!>)
take(<!OI;SMARTCAST_IMPOSSIBLE!>s.ext<!>)
}
}
@@ -18,7 +18,7 @@ fun foo(list: StringList, arg: Unstable) {
list.remove(arg.first)
if (arg.first?.isEmpty() ?: false) {
// Should be still resolved to extension, without smart cast or smart cast impossible
list.remove(<!NI;SMARTCAST_IMPOSSIBLE, SMARTCAST_IMPOSSIBLE!>arg.first<!>)
list.remove(<!OI;SMARTCAST_IMPOSSIBLE!>arg.first<!>)
}
}
@@ -36,6 +36,6 @@ fun bar(list: BooleanList, arg: UnstableBoolean) {
list.remove(arg.first)
if (arg.first ?: false) {
// Should be still resolved to extension, without smart cast or smart cast impossible
list.remove(<!NI;SMARTCAST_IMPOSSIBLE, SMARTCAST_IMPOSSIBLE!>arg.first<!>)
list.remove(<!OI;SMARTCAST_IMPOSSIBLE!>arg.first<!>)
}
}
@@ -9,5 +9,5 @@ fun main() {
var y: Number? = null
y = 2
{ y = 1 }
Test.foo(<!SMARTCAST_IMPOSSIBLE, SMARTCAST_IMPOSSIBLE!>y<!>)
Test.foo(y)
}
@@ -1,88 +0,0 @@
// !LANGUAGE: +NewInference
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -UNUSED_VALUE -VARIABLE_WITH_REDUNDANT_INITIALIZER
// SKIP_TXT
/*
* KOTLIN DIAGNOSTICS NOT LINKED SPEC TEST (NEGATIVE)
*
* SECTIONS: dfa
* NUMBER: 46
* DESCRIPTION: Raw data flow analysis test
* HELPERS: classes, objects, typealiases, functions, enumClasses, interfaces, sealedClasses
*/
// TESTCASE NUMBER: 1
fun case_1(x: Int) = ""
fun case_1(x: Int?) = 10
fun case_1() {
var x: Int? = 10
var y = { x = null }
if (x != null) {
val z = case_1(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?"), SMARTCAST_IMPOSSIBLE, SMARTCAST_IMPOSSIBLE!>x<!>)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>z<!>
}
}
// TESTCASE NUMBER: 2
val case_2_prop: Int?
get() = 10
fun case_2(x: Int) = ""
fun case_2(x: Int?) = 10
fun case_2() {
if (case_2_prop != null) {
val z = case_2(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?"), SMARTCAST_IMPOSSIBLE, SMARTCAST_IMPOSSIBLE!>case_2_prop<!>)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>z<!>
}
}
// TESTCASE NUMBER: 3
class Case4 {
var x: Int? = 10
}
fun case_3(x: Int) = ""
fun case_3(x: Int?) = 10
fun case_3(y: Case4) {
if (y.x != null) {
val z = case_3(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?"), SMARTCAST_IMPOSSIBLE, SMARTCAST_IMPOSSIBLE!>y.x<!>)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>z<!>
}
}
// TESTCASE NUMBER: 4
open class Case5 {
open val x: Int? = 10
}
fun case_4(x: Int) = ""
fun case_4(x: Int?) = 10
fun case_4(y: Case4) {
if (y.x != null) {
val z = case_4(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?"), SMARTCAST_IMPOSSIBLE, SMARTCAST_IMPOSSIBLE!>y.x<!>)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>z<!>
}
}
// TESTCASE NUMBER: 5
class Case6 {
val x: Int? by lazy { 10 }
}
fun case_5(x: Int) = ""
fun case_5(x: Int?) = 10
fun case_5(y: Case4) {
if (y.x != null) {
val z = case_5(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?"), SMARTCAST_IMPOSSIBLE, SMARTCAST_IMPOSSIBLE!>y.x<!>)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>z<!>
}
}
// TESTCASE NUMBER: 6
var case_6_prop: Int?
get() = 10
set(value) {}
fun case_6(x: Int) = ""
fun case_6(x: Int?) = 10
fun case_6() {
if (case_6_prop != null) {
val z = case_6(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?"), SMARTCAST_IMPOSSIBLE, SMARTCAST_IMPOSSIBLE!>case_6_prop<!>)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>z<!>
}
}
@@ -21,3 +21,84 @@ fun case_1() {
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.String")!>z<!>
}
}
// TESTCASE NUMBER: 2
fun case_2(x: Int) = ""
fun case_2(x: Int?) = 10
fun case_2() {
var x: Int? = 10
var y = { x = null }
if (x != null) {
val z = case_2(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?")!>x<!>)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>z<!>
}
}
// TESTCASE NUMBER: 3
val case_3_prop: Int?
get() = 10
fun case_3(x: Int) = ""
fun case_3(x: Int?) = 10
fun case_3() {
if (case_3_prop != null) {
val z = case_3(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?")!>case_3_prop<!>)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>z<!>
}
}
// TESTCASE NUMBER: 4
class Case4 {
var x: Int? = 10
}
fun case_4(x: Int) = ""
fun case_4(x: Int?) = 10
fun case_4(y: Case4) {
if (y.x != null) {
val z = case_4(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?")!>y.x<!>)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>z<!>
}
}
// TESTCASE NUMBER: 5
open class Case5 {
open val x: Int? = 10
}
fun case_5(x: Int) = ""
fun case_5(x: Int?) = 10
fun case_5(y: Case4) {
if (y.x != null) {
val z = case_5(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?")!>y.x<!>)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>z<!>
}
}
// TESTCASE NUMBER: 6
class Case6 {
val x: Int? by lazy { 10 }
}
fun case_6(x: Int) = ""
fun case_6(x: Int?) = 10
fun case_6(y: Case4) {
if (y.x != null) {
val z = case_6(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?")!>y.x<!>)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>z<!>
}
}
// TESTCASE NUMBER: 7
var case_7_prop: Int?
get() = 10
set(value) {}
fun case_7(x: Int) = ""
fun case_7(x: Int?) = 10
fun case_7() {
if (case_7_prop != null) {
val z = case_7(<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int?")!>case_7_prop<!>)
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Int")!>z<!>
}
}
@@ -4842,11 +4842,6 @@ public class DiagnosticsTestSpecGenerated extends AbstractDiagnosticsTestSpec {
runTest("compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/45.kt");
}
@TestMetadata("46.kt")
public void test46() throws Exception {
runTest("compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/46.kt");
}
@TestMetadata("5.kt")
public void test5() throws Exception {
runTest("compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/5.kt");