From dbbc4ec2813b3414fd9998d363aad0ec8219d28e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 19 Jul 2016 16:40:43 +0300 Subject: [PATCH] Array can be now cast to Array without CAST_NEVER_SUCCEEDS #KT-6391 Fixed (cherry picked from commit 2629d55) --- .../src/org/jetbrains/kotlin/types/CastDiagnosticsUtil.kt | 8 ++++++-- .../diagnostics/tests/cast/AsWithOtherParameter.kt | 7 +++++++ .../diagnostics/tests/cast/AsWithOtherParameter.txt | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/CastDiagnosticsUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/types/CastDiagnosticsUtil.kt index ba09dd4bcec..db816bff4f1 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/CastDiagnosticsUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/CastDiagnosticsUtil.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.checker.TypeCheckingProcedure import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.types.typeUtil.isPrimitiveNumberType object CastDiagnosticsUtil { @@ -46,8 +47,11 @@ object CastDiagnosticsUtil { if (KotlinBuiltIns.isArray(lhsType)) { val lhsArgument = lhsType.arguments.firstOrNull() val rhsArgument = rhsType.arguments.firstOrNull() - if (lhsArgument != null && rhsArgument != null && lhsArgument.type.constructor == rhsArgument.type.constructor) { - return true + if (lhsArgument != null && rhsArgument != null) { + if (lhsArgument.type.constructor == rhsArgument.type.constructor) return true + if (KotlinTypeChecker.DEFAULT.isSubtypeOf(TypeUtils.makeNotNullable(lhsArgument.type), rhsArgument.type)) { + return true + } } } } diff --git a/compiler/testData/diagnostics/tests/cast/AsWithOtherParameter.kt b/compiler/testData/diagnostics/tests/cast/AsWithOtherParameter.kt index 97e355b37e8..a3665133963 100644 --- a/compiler/testData/diagnostics/tests/cast/AsWithOtherParameter.kt +++ b/compiler/testData/diagnostics/tests/cast/AsWithOtherParameter.kt @@ -23,5 +23,12 @@ fun checkArrays2(): Array> { return someArray as Array> } +fun checkArrays3() { + val someArray = arrayOfNulls(1) + someArray as Array + val intArray = arrayOfNulls(1) + intArray as Array +} + fun println(s: String) = s diff --git a/compiler/testData/diagnostics/tests/cast/AsWithOtherParameter.txt b/compiler/testData/diagnostics/tests/cast/AsWithOtherParameter.txt index e27b19b636e..67aaffa013a 100644 --- a/compiler/testData/diagnostics/tests/cast/AsWithOtherParameter.txt +++ b/compiler/testData/diagnostics/tests/cast/AsWithOtherParameter.txt @@ -2,6 +2,7 @@ package public fun checkArrays(): kotlin.Array public fun checkArrays2(): kotlin.Array> +public fun checkArrays3(): kotlin.Unit public fun println(/*0*/ s: kotlin.String): kotlin.String public fun test(/*0*/ clazz: Class): kotlin.Unit public fun use(): kotlin.Unit