diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 4f6aca72695..129320f3fee 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -221,21 +221,21 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { if (!CastDiagnosticsUtil.isCastPossible(actualType, targetType, platformToKotlinClassMap)) { context.trace.report(CAST_NEVER_SUCCEEDS.on(expression.getOperationReference())); } - - JetTypeChecker typeChecker = JetTypeChecker.INSTANCE; - if (!typeChecker.isSubtypeOf(targetType, actualType)) { - if (typeChecker.isSubtypeOf(actualType, targetType)) { - context.trace.report(USELESS_CAST_STATIC_ASSERT_IS_FINE.on(expression.getOperationReference())); - } - } else { + JetTypeChecker typeChecker = JetTypeChecker.INSTANCE; + // Upcast? if (typeChecker.isSubtypeOf(actualType, targetType)) { - context.trace.report(USELESS_CAST.on(expression.getOperationReference())); - } - else { - if (CastDiagnosticsUtil.isCastErased(actualType, targetType, typeChecker)) { - context.trace.report(Errors.UNCHECKED_CAST.on(expression, actualType, targetType)); + if (!typeChecker.isSubtypeOf(targetType, actualType)) { + // proper upcast: String as Any + context.trace.report(USELESS_CAST_STATIC_ASSERT_IS_FINE.on(expression.getOperationReference())); } + else { + // cast to itself: String as String + context.trace.report(USELESS_CAST.on(expression.getOperationReference())); + } + } + else if (CastDiagnosticsUtil.isCastErased(actualType, targetType, typeChecker)) { + context.trace.report(Errors.UNCHECKED_CAST.on(expression, actualType, targetType)); } } } diff --git a/compiler/testData/diagnostics/tests/ResolveToJava.kt b/compiler/testData/diagnostics/tests/ResolveToJava.kt index 4959e4a4153..7132e3988a1 100644 --- a/compiler/testData/diagnostics/tests/ResolveToJava.kt +++ b/compiler/testData/diagnostics/tests/ResolveToJava.kt @@ -29,7 +29,7 @@ fun test(l : java.util List - val o = "sdf" as Object + val o = "sdf" as Object try { // ... diff --git a/compiler/testData/diagnostics/tests/cast/AsErasedError.kt b/compiler/testData/diagnostics/tests/cast/AsErasedError.kt index 8c22aade491..a9c644c04aa 100644 --- a/compiler/testData/diagnostics/tests/cast/AsErasedError.kt +++ b/compiler/testData/diagnostics/tests/cast/AsErasedError.kt @@ -1,2 +1,2 @@ -fun ff(c: MutableCollection) = c as MutableList +fun ff(c: MutableCollection) = c as MutableList diff --git a/compiler/testData/diagnostics/tests/delegatedProperty/inference/differentDelegatedExpressions.kt b/compiler/testData/diagnostics/tests/delegatedProperty/inference/differentDelegatedExpressions.kt index fe071d20932..3ab3468e5f5 100644 --- a/compiler/testData/diagnostics/tests/delegatedProperty/inference/differentDelegatedExpressions.kt +++ b/compiler/testData/diagnostics/tests/delegatedProperty/inference/differentDelegatedExpressions.kt @@ -23,7 +23,7 @@ class MyProperty { public fun get(thisRef: R, desc: PropertyMetadata): T { println("get $thisRef ${desc.name}") - return null as T + return null as T } public fun set(thisRef: R, desc: PropertyMetadata, value: T) { diff --git a/compiler/testData/diagnostics/tests/nullableTypes/uselessElvis.kt b/compiler/testData/diagnostics/tests/nullableTypes/uselessElvis.kt index 86cf6a5aee6..257a5594aed 100644 --- a/compiler/testData/diagnostics/tests/nullableTypes/uselessElvis.kt +++ b/compiler/testData/diagnostics/tests/nullableTypes/uselessElvis.kt @@ -1,11 +1,11 @@ // For KT-3491 fun test1(t: Any?): Any { - return t as T ?: "" + return t as T ?: "" } fun test2(t: Any?): Any { - return t as T ?: "" + return t as T ?: "" } fun test3(t: Any?): Any { diff --git a/compiler/testData/diagnostics/tests/regressions/kt307.kt b/compiler/testData/diagnostics/tests/regressions/kt307.kt index bdd29c2979e..f8a60f9485b 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt307.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt307.kt @@ -6,6 +6,6 @@ open class AL { trait ALE : AL { fun getOrNull(index: Int, value: T) : T { -return get(index) as? T ?: value -} +return get(index) as? T ?: value } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/regressions/kt398.kt b/compiler/testData/diagnostics/tests/regressions/kt398.kt index af43ee1df3b..a6d63cddc40 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt398.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt398.kt @@ -1,11 +1,11 @@ // KT-398 Internal error when property initializes with function class X() { - val check = { (a : Any) -> a is T } + val check = { (a : Any) -> a is T } } fun box() : String { if(X().check(10)) return "fail" if(!X().check("lala")) return "fail" return "OK" -} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/regressions/kt399.kt b/compiler/testData/diagnostics/tests/regressions/kt399.kt index f4d3352ba63..ed8841417c6 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt399.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt399.kt @@ -1,11 +1,11 @@ // KT-399 Type argument inference not implemented for CALL_EXPRESSION fun getSameTypeChecker(obj: T) : Function1 { - return { (a : Any) -> a is T } + return { (a : Any) -> a is T } } fun box() : String { if(getSameTypeChecker("lala")(10)) return "fail" if(!getSameTypeChecker("mama")("lala")) return "fail" return "OK" -} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/regressions/kt498.kt b/compiler/testData/diagnostics/tests/regressions/kt498.kt index 43ce035ad93..5af9b46576d 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt498.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt498.kt @@ -3,5 +3,5 @@ class IdUnavailableException() : Exception() {} fun T.getJavaClass() : Class { - return ((this as Object).getClass()) as Class // Some error here, because of Exception() used above. ?!!! + return ((this as Object).getClass()) as Class // Some error here, because of Exception() used above. ?!!! } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/regressions/kt716.kt b/compiler/testData/diagnostics/tests/regressions/kt716.kt index 7eac06bcde1..6080f624ce2 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt716.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt716.kt @@ -5,7 +5,7 @@ class TypeInfo fun typeinfo() : TypeInfo = null as TypeInfo fun TypeInfo.getJavaClass() : java.lang.Class { - val t : java.lang.Object = this as java.lang.Object + val t : java.lang.Object = this as java.lang.Object return t.getClass() as java.lang.Class // inferred type is Object but Serializable was expected } diff --git a/idea/testData/checker/ResolveToJava.kt b/idea/testData/checker/ResolveToJava.kt index 762cf70beac..12e68044a07 100644 --- a/idea/testData/checker/ResolveToJava.kt +++ b/idea/testData/checker/ResolveToJava.kt @@ -27,7 +27,7 @@ fun test(l : List) { List - val o = "sdf" as Object + val o = "sdf" as Object try { // ...