From ac0db5ce807b6637326f89edb74e7f630594f8b0 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Sat, 4 Jul 2015 03:18:50 +0300 Subject: [PATCH] Fix incorrect TypeCastException message when casting null #KT-5121 Fixed --- .../kotlin/codegen/ExpressionCodegen.java | 7 ++----- .../regressions/typeCastException.kt | 20 ++++++++++++++++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 47dc409c800..99be45477c4 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -3727,7 +3727,7 @@ The "returned" value of try expression with no finally is either the last expres @Override public StackValue visitBinaryWithTypeRHSExpression(@NotNull JetBinaryExpressionWithTypeRHS expression, StackValue receiver) { - final JetExpression left = expression.getLeft(); + JetExpression left = expression.getLeft(); final IElementType opToken = expression.getOperationReference().getReferencedNameElementType(); if (opToken == JetTokens.COLON) { return gen(left); @@ -3752,10 +3752,7 @@ The "returned" value of try expression with no finally is either the last expres v.dup(); Label nonnull = new Label(); v.ifnonnull(nonnull); - JetType leftType = bindingContext.getType(left); - assert leftType != null; - genThrow(v, "kotlin/TypeCastException", DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(leftType) + - " cannot be cast to " + + genThrow(v, "kotlin/TypeCastException", "null cannot be cast to non-null type " + DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(rightType)); v.mark(nonnull); } diff --git a/compiler/testData/codegen/boxWithStdlib/regressions/typeCastException.kt b/compiler/testData/codegen/boxWithStdlib/regressions/typeCastException.kt index e67ff8472d5..5a25780bb51 100644 --- a/compiler/testData/codegen/boxWithStdlib/regressions/typeCastException.kt +++ b/compiler/testData/codegen/boxWithStdlib/regressions/typeCastException.kt @@ -1,4 +1,7 @@ +import java.util.ArrayList + // KT-2823 TypeCastException has no message +// KT-5121 Better error message in on casting null to non-null type fun box(): String { try { @@ -6,9 +9,20 @@ fun box(): String { a as Array } catch (e: TypeCastException) { - if (e.getMessage() == "kotlin.Any? cannot be cast to kotlin.Array") { - return "OK" + if (e.getMessage() != "null cannot be cast to non-null type kotlin.Array") { + return "Fail 1: $e" } } - return "fail" + + try { + val x: String? = null + x as String + } + catch (e: TypeCastException) { + if (e.getMessage() != "null cannot be cast to non-null type kotlin.String") { + return "Fail 2: $e" + } + } + + return "OK" }