diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtControlFlowBuilder.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtControlFlowBuilder.kt
index d1ef63ebf388..8b25ad2fffc4 100644
--- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtControlFlowBuilder.kt
+++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/dfa/KtControlFlowBuilder.kt
@@ -61,6 +61,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ExpressionValueArgument
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.calls.model.VarargValueArgument
import org.jetbrains.kotlin.resolve.constants.IntegerLiteralTypeConstructor
+import org.jetbrains.kotlin.resolve.constants.TypedCompileTimeConstant
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.types.KotlinType
@@ -141,12 +142,14 @@ class KtControlFlowBuilder(val factory: DfaValueFactory, val context: KtExpressi
private fun processConstant(expr: KtExpression?): Boolean {
expr ?: return false
val context = expr.analyze(BodyResolveMode.PARTIAL)
- val constant = ConstantExpressionEvaluator.getConstant(expr, context) ?: return false
- val kotlinType = expr.getKotlinType() ?: return false
- val value = constant.getValue(kotlinType) ?: return false
+ val constant = ConstantExpressionEvaluator.getConstant(expr, context) as? TypedCompileTimeConstant<*> ?: return false
+ val declaredType = expr.getKotlinType() ?: return false
+ val value = constant.getValue(declaredType) ?: return false
if (value !is Int && value !is Long && value !is Float && value !is Double && value !is String) return false
- val dfConstantType = DfTypes.constant(value, kotlinType.toDfType())
+ val actualType = constant.type
+ val dfConstantType = DfTypes.constant(value, actualType.toDfType())
addInstruction(PushValueInstruction(dfConstantType, KotlinExpressionAnchor(expr)))
+ addImplicitConversion(expr, actualType, declaredType)
return true
}
diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/KtDataFlowInspectionTest.kt b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/KtDataFlowInspectionTest.kt
index 839c643e04a8..83cfa1b90efc 100644
--- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/KtDataFlowInspectionTest.kt
+++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/KtDataFlowInspectionTest.kt
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.test.TestMetadata
@TestMetadata("testData/inspections/dfa")
class KtDataFlowInspectionTest : KotlinLightCodeInsightFixtureTestCase() {
fun testAlwaysZero() = doTest()
+ fun testAnyType() = doTest()
fun testArrays() = doTest()
fun testBoolean() = doTest()
fun testBooleanConst() = doTest()
diff --git a/plugins/kotlin/idea/tests/testData/inspections/dfa/AnyType.kt b/plugins/kotlin/idea/tests/testData/inspections/dfa/AnyType.kt
new file mode 100644
index 000000000000..c37b16146869
--- /dev/null
+++ b/plugins/kotlin/idea/tests/testData/inspections/dfa/AnyType.kt
@@ -0,0 +1,11 @@
+// WITH_STDLIB
+fun main() {
+ val a: Any = 0
+ println(a is Int)
+}
+
+fun main2(b: Boolean) {
+ var a: Any = 0
+ if (b) a = 1
+ println(a is Int)
+}
\ No newline at end of file