diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java
index 754eebd36f44..42f1494bad2e 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java
@@ -128,6 +128,9 @@ public class TypeConversionUtil {
return boxedType != null && areTypesConvertible(boxedType, toType);
}
if (!fromIsPrimitive) {
+ // 5.5. Casting Contexts
+ if ((fromTypeRank == SHORT_RANK || fromTypeRank == BYTE_RANK) && toTypeRank == CHAR_RANK) return false;
+
if (fromType instanceof PsiClassType) {
if (languageLevel == null) {
languageLevel = ((PsiClassType)fromType).getLanguageLevel();
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/PolymorphicTypeCast.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/PolymorphicTypeCast.java
index 8be16fc1db85..8ba3ea4f8037 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/PolymorphicTypeCast.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/PolymorphicTypeCast.java
@@ -94,4 +94,96 @@ class C {
void asLongs(Integer i) {
long l = (long) i;
}
+
+ void foo(Object o) {}
+ public void cast2(Byte operand) {
+ foo((byte)operand);
+ foo((short)operand);
+ foo((char)operand);
+ foo((int)operand);
+ foo((long)operand);
+ foo((float)operand);
+ foo((double)operand);
+ foo((boolean)operand);
+ }
+ public void cast2(Short operand) {
+ foo((byte)operand);
+ foo((short)operand);
+ foo((char)operand);
+ foo((int)operand);
+ foo((long)operand);
+ foo((float)operand);
+ foo((double)operand);
+ foo((boolean)operand);
+ }
+ public void cast2(Character operand) {
+ foo((byte)operand);
+ foo((short)operand);
+ foo((char)operand);
+ foo((int)operand);
+ foo((long)operand);
+ foo((float)operand);
+ foo((double)operand);
+ foo((boolean)operand);
+ }
+ public void cast2(Integer operand) {
+ foo((byte)operand);
+ foo((short)operand);
+ foo((char)operand);
+ foo((int)operand);
+ foo((long)operand);
+ foo((float)operand);
+ foo((double)operand);
+ foo((boolean)operand);
+ }
+ public void cast2(Long operand) {
+ foo((byte)operand);
+ foo((short)operand);
+ foo((char)operand);
+ foo((int)operand);
+ foo((long)operand);
+ foo((float)operand);
+ foo((double)operand);
+ foo((boolean)operand);
+ }
+ public void cast2(Float operand) {
+ foo((byte)operand);
+ foo((short)operand);
+ foo((char)operand);
+ foo((int)operand);
+ foo((long)operand);
+ foo((float)operand);
+ foo((double)operand);
+ foo((boolean)operand);
+ }
+ public void cast2(Double operand) {
+ foo((byte)operand);
+ foo((short)operand);
+ foo((char)operand);
+ foo((int)operand);
+ foo((long)operand);
+ foo((float)operand);
+ foo((double)operand);
+ foo((boolean)operand);
+ }
+ public void cast2(Boolean operand) {
+ foo((byte)operand);
+ foo((short)operand);
+ foo((char)operand);
+ foo((int)operand);
+ foo((long)operand);
+ foo((float)operand);
+ foo((double)operand);
+ foo((boolean)operand);
+ }
+ public void cast2(Object operand) {
+ foo((byte)operand);
+ foo((short)operand);
+ foo((char)operand);
+ foo((int)operand);
+ foo((long)operand);
+ foo((float)operand);
+ foo((double)operand);
+ foo((boolean)operand);
+ }
}
\ No newline at end of file