[NI] Restore missing smart casts after another smart cast in call
Expression type serves as a part of a key for retrieving smart cast info. Rewriting expression type with SmartCastManager leads to incorrect processing of following smartcasts for same expression, therefore it was removed. KT-32507 Fixed KT-32358 Fixed
This commit is contained in:
Generated
+5
@@ -17663,6 +17663,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte
|
|||||||
runTest("compiler/testData/diagnostics/tests/regressions/kt32205.kt");
|
runTest("compiler/testData/diagnostics/tests/regressions/kt32205.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt32507.kt")
|
||||||
|
public void testKt32507() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/regressions/kt32507.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt328.kt")
|
@TestMetadata("kt328.kt")
|
||||||
public void testKt328() throws Exception {
|
public void testKt328() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/regressions/kt328.kt");
|
runTest("compiler/testData/diagnostics/tests/regressions/kt328.kt");
|
||||||
|
|||||||
+1
-1
@@ -232,7 +232,7 @@ class DiagnosticReporterByTrackingStrategy(
|
|||||||
val call = if (call.callElement is KtBinaryExpression) null else call
|
val call = if (call.callElement is KtBinaryExpression) null else call
|
||||||
smartCastManager.checkAndRecordPossibleCast(
|
smartCastManager.checkAndRecordPossibleCast(
|
||||||
dataFlowValue, smartCastDiagnostic.smartCastType, argumentExpression, context, call,
|
dataFlowValue, smartCastDiagnostic.smartCastType, argumentExpression, context, call,
|
||||||
recordExpressionType = true
|
recordExpressionType = false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
is ReceiverExpressionKotlinCallArgument -> {
|
is ReceiverExpressionKotlinCallArgument -> {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// !DIAGNOSTICS: -DEBUG_INFO_SMARTCAST
|
// !DIAGNOSTICS: -DEBUG_INFO_SMARTCAST
|
||||||
// !WITH_NEW_INFERENCE
|
|
||||||
fun bar(x: Int) = x + 1
|
fun bar(x: Int) = x + 1
|
||||||
|
|
||||||
fun foo() {
|
fun foo() {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
// !DIAGNOSTICS: -DEBUG_INFO_SMARTCAST
|
// !DIAGNOSTICS: -DEBUG_INFO_SMARTCAST
|
||||||
// !WITH_NEW_INFERENCE
|
|
||||||
fun bar(x: Int) = x + 1
|
fun bar(x: Int) = x + 1
|
||||||
|
|
||||||
fun foo() {
|
fun foo() {
|
||||||
@@ -13,17 +12,17 @@ fun foo() {
|
|||||||
if (1 > 2) bar(x)
|
if (1 > 2) bar(x)
|
||||||
}
|
}
|
||||||
if (<!SENSELESS_COMPARISON!>x == null<!>) {
|
if (<!SENSELESS_COMPARISON!>x == null<!>) {
|
||||||
<!NI;UNREACHABLE_CODE!>bar(<!>x<!NI;UNREACHABLE_CODE!>)<!>
|
bar(x)
|
||||||
}
|
}
|
||||||
if (<!SENSELESS_COMPARISON!>x == null<!>) <!NI;UNREACHABLE_CODE!>bar(<!>x<!NI;UNREACHABLE_CODE!>)<!> else bar(x)
|
if (<!SENSELESS_COMPARISON!>x == null<!>) bar(x) else bar(x)
|
||||||
bar(bar(x))
|
bar(bar(x))
|
||||||
} else if (<!SENSELESS_COMPARISON!><!DEBUG_INFO_CONSTANT!>x<!> == null<!>) {
|
} else if (<!SENSELESS_COMPARISON!><!DEBUG_INFO_CONSTANT!>x<!> == null<!>) {
|
||||||
bar(<!DEBUG_INFO_CONSTANT, TYPE_MISMATCH!>x<!>)
|
bar(<!DEBUG_INFO_CONSTANT, TYPE_MISMATCH!>x<!>)
|
||||||
if (<!SENSELESS_COMPARISON!><!DEBUG_INFO_CONSTANT!>x<!> != null<!>) {
|
if (<!SENSELESS_COMPARISON!><!DEBUG_INFO_CONSTANT!>x<!> != null<!>) {
|
||||||
<!NI;UNREACHABLE_CODE!>bar(<!>x<!NI;UNREACHABLE_CODE!>)<!>
|
bar(x)
|
||||||
<!NI;UNREACHABLE_CODE!>if (<!SENSELESS_COMPARISON!>x == null<!>) bar(x)<!>
|
if (<!SENSELESS_COMPARISON!>x == null<!>) bar(x)
|
||||||
<!NI;UNREACHABLE_CODE!>if (<!SENSELESS_COMPARISON!>x == null<!>) bar(x) else bar(x)<!>
|
if (<!SENSELESS_COMPARISON!>x == null<!>) bar(x) else bar(x)
|
||||||
<!NI;UNREACHABLE_CODE!>bar(bar(x) + bar(x))<!>
|
bar(bar(x) + bar(x))
|
||||||
} else if (<!SENSELESS_COMPARISON!><!DEBUG_INFO_CONSTANT!>x<!> == null<!>) {
|
} else if (<!SENSELESS_COMPARISON!><!DEBUG_INFO_CONSTANT!>x<!> == null<!>) {
|
||||||
bar(<!DEBUG_INFO_CONSTANT, TYPE_MISMATCH!>x<!>)
|
bar(<!DEBUG_INFO_CONSTANT, TYPE_MISMATCH!>x<!>)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// !WITH_NEW_INFERENCE
|
|
||||||
fun bar(x: Int): Int = x + 1
|
fun bar(x: Int): Int = x + 1
|
||||||
|
|
||||||
fun foo() {
|
fun foo() {
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// !WITH_NEW_INFERENCE
|
|
||||||
fun bar(x: Int): Int = x + 1
|
fun bar(x: Int): Int = x + 1
|
||||||
|
|
||||||
fun foo() {
|
fun foo() {
|
||||||
@@ -11,7 +10,7 @@ fun foo() {
|
|||||||
bar(<!DEBUG_INFO_SMARTCAST!>x<!>)
|
bar(<!DEBUG_INFO_SMARTCAST!>x<!>)
|
||||||
for (q in a) {
|
for (q in a) {
|
||||||
bar(<!DEBUG_INFO_SMARTCAST!>x<!>)
|
bar(<!DEBUG_INFO_SMARTCAST!>x<!>)
|
||||||
if (<!SENSELESS_COMPARISON!>x == null<!>) <!NI;UNREACHABLE_CODE!>bar(<!><!DEBUG_INFO_SMARTCAST!>x<!><!NI;UNREACHABLE_CODE!>)<!>
|
if (<!SENSELESS_COMPARISON!>x == null<!>) bar(<!DEBUG_INFO_SMARTCAST!>x<!>)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
-2
@@ -1,5 +1,3 @@
|
|||||||
// !WITH_NEW_INFERENCE
|
|
||||||
|
|
||||||
fun foo(d: Any?) {
|
fun foo(d: Any?) {
|
||||||
if (d is String?) {
|
if (d is String?) {
|
||||||
d!!
|
d!!
|
||||||
|
|||||||
+1
-3
@@ -1,9 +1,7 @@
|
|||||||
// !WITH_NEW_INFERENCE
|
|
||||||
|
|
||||||
fun foo(d: Any?) {
|
fun foo(d: Any?) {
|
||||||
if (d is String?) {
|
if (d is String?) {
|
||||||
<!DEBUG_INFO_SMARTCAST!>d<!>!!
|
<!DEBUG_INFO_SMARTCAST!>d<!>!!
|
||||||
doString(<!NI;TYPE_MISMATCH, OI;DEBUG_INFO_SMARTCAST!>d<!>)
|
doString(<!DEBUG_INFO_SMARTCAST!>d<!>)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// !LANGUAGE: +NewInference
|
||||||
|
|
||||||
|
fun foo(bar: Any?): Int {
|
||||||
|
bar as String?
|
||||||
|
bar ?: throw IllegalStateException()
|
||||||
|
return bar.length
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// !LANGUAGE: +NewInference
|
||||||
|
|
||||||
|
fun foo(bar: Any?): Int {
|
||||||
|
bar as String?
|
||||||
|
<!DEBUG_INFO_SMARTCAST!>bar<!> ?: throw IllegalStateException()
|
||||||
|
return <!DEBUG_INFO_SMARTCAST!>bar<!>.length
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun foo(/*0*/ bar: kotlin.Any?): kotlin.Int
|
||||||
@@ -17675,6 +17675,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/regressions/kt32205.kt");
|
runTest("compiler/testData/diagnostics/tests/regressions/kt32205.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt32507.kt")
|
||||||
|
public void testKt32507() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/regressions/kt32507.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt328.kt")
|
@TestMetadata("kt328.kt")
|
||||||
public void testKt328() throws Exception {
|
public void testKt328() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/regressions/kt328.kt");
|
runTest("compiler/testData/diagnostics/tests/regressions/kt328.kt");
|
||||||
|
|||||||
Generated
+5
@@ -17665,6 +17665,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
|
|||||||
runTest("compiler/testData/diagnostics/tests/regressions/kt32205.kt");
|
runTest("compiler/testData/diagnostics/tests/regressions/kt32205.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt32507.kt")
|
||||||
|
public void testKt32507() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/regressions/kt32507.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt328.kt")
|
@TestMetadata("kt328.kt")
|
||||||
public void testKt328() throws Exception {
|
public void testKt328() throws Exception {
|
||||||
runTest("compiler/testData/diagnostics/tests/regressions/kt328.kt");
|
runTest("compiler/testData/diagnostics/tests/regressions/kt328.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user