From f139b637f372672bf4a64474ecf8dcee1f80368d Mon Sep 17 00:00:00 2001 From: "Natalia.Ukhorskaya" Date: Tue, 6 Nov 2012 16:18:18 +0400 Subject: [PATCH] Automatically cast error for intrinsic methods in array #KT-2997 Fixed --- .../jet/codegen/intrinsics/ArrayGet.java | 2 +- .../jet/codegen/intrinsics/ArrayIndices.java | 2 +- .../jet/codegen/intrinsics/ArrayIterator.java | 2 +- .../jet/codegen/intrinsics/ArraySet.java | 2 +- .../jet/codegen/intrinsics/ArraySize.java | 2 +- .../testData/codegen/regressions/kt2997.kt | 85 +++++++++++++++++++ .../jetbrains/jet/codegen/ArrayGenTest.java | 4 + 7 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt2997.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayGet.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayGet.java index 1e1afa1c699..b65955111a3 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayGet.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayGet.java @@ -44,7 +44,7 @@ public class ArrayGet implements IntrinsicMethod { StackValue receiver, @NotNull GenerationState state ) { - receiver.put(AsmTypeConstants.OBJECT_TYPE, v); + receiver.put(receiver.type, v); Type type = correctElementType(receiver.type); codegen.gen(arguments.get(0), Type.INT_TYPE); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIndices.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIndices.java index 401faafc20f..04915604179 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIndices.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIndices.java @@ -39,7 +39,7 @@ public class ArrayIndices implements IntrinsicMethod { StackValue receiver, @NotNull GenerationState state ) { - receiver.put(AsmTypeConstants.OBJECT_TYPE, v); + receiver.put(receiver.type, v); v.arraylength(); v.invokestatic(AsmTypeConstants.JET_INT_RANGE_TYPE.getInternalName(), "count", "(I)Ljet/IntRange;"); return StackValue.onStack(AsmTypeConstants.JET_INT_RANGE_TYPE); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIterator.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIterator.java index 8c7cdb5be88..24dded67bd6 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIterator.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIterator.java @@ -50,7 +50,7 @@ public class ArrayIterator implements IntrinsicMethod { StackValue receiver, @NotNull GenerationState state ) { - receiver.put(AsmTypeConstants.OBJECT_TYPE, v); + receiver.put(receiver.type, v); JetCallExpression call = (JetCallExpression) element; FunctionDescriptor funDescriptor = (FunctionDescriptor) codegen.getBindingContext() .get(BindingContext.REFERENCE_TARGET, (JetSimpleNameExpression) call.getCalleeExpression()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySet.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySet.java index b6d55db6c64..718c9a8786d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySet.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySet.java @@ -44,7 +44,7 @@ public class ArraySet implements IntrinsicMethod { StackValue receiver, @NotNull GenerationState state ) { - receiver.put(AsmTypeConstants.OBJECT_TYPE, v); + receiver.put(receiver.type, v); Type type = correctElementType(receiver.type); codegen.gen(arguments.get(0), Type.INT_TYPE); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.java index 895a52a32ee..6ab8f098dfc 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.java @@ -42,7 +42,7 @@ public class ArraySize implements IntrinsicMethod { StackValue receiver, @NotNull GenerationState state ) { - receiver.put(AsmTypeConstants.OBJECT_TYPE, v); + receiver.put(receiver.type, v); v.arraylength(); return StackValue.onStack(Type.INT_TYPE); diff --git a/compiler/testData/codegen/regressions/kt2997.kt b/compiler/testData/codegen/regressions/kt2997.kt new file mode 100644 index 00000000000..5d148563f76 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt2997.kt @@ -0,0 +1,85 @@ +//KT-2997 Automatically cast error (Array) + +fun foo(a: Any): Int { + if (a is IntArray) { + a.get(0) + a.set(0, 1) + a.iterator() + a.indices + return a.size + } + if (a is ShortArray) { + a.get(0) + a.set(0, 1) + a.iterator() + a.indices + return a.size + } + if (a is ByteArray) { + a.get(0) + a.set(0, 1) + a.iterator() + a.indices + return a.size + } + if (a is FloatArray) { + a.get(0) + a.set(0, 1.toFloat()) + a.iterator() + a.indices + return a.size + } + if (a is DoubleArray) { + a.get(0) + a.set(0, 1.0) + a.iterator() + a.indices + return a.size + } + if (a is BooleanArray) { + a.get(0) + a.set(0, false) + a.iterator() + a.indices + return a.size + } + if (a is CharArray) { + a.get(0) + a.set(0, 'a') + a.iterator() + a.indices + return a.size + } + if (a is Array<*>) { + if (a.size > 0) a.get(0) + a.iterator() + a.indices + return a.size + } + + return 0 +} + +fun box(): String { + val iA = IntArray(1) + if (foo(iA) != 1) return "fail int[]" + val sA = ShortArray(1) + if (foo(sA) != 1) return "fail short[]" + val bA = ByteArray(1) + if (foo(bA) != 1) return "fail byte[]" + val fA = FloatArray(1) + if (foo(fA) != 1) return "fail float[]" + val dA = DoubleArray(1) + if (foo(dA) != 1) return "fail double[]" + val boolA = BooleanArray(1) + if (foo(boolA) != 1) return "fail boolean[]" + val cA = CharArray(1) + if (foo(cA) != 1) return "fail char[]" + val oA = Array(1) { 1 } + if (foo(oA) != 1) return "fail Any[]" + + val sArray = Array(0) { "" } + if (foo(sArray) != 0) return "fail String[]" + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java index b591819c982..cdc2bf150a9 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java @@ -332,4 +332,8 @@ public class ArrayGenTest extends CodegenTestCase { blackBoxFile("classes/nonnullarray.jet"); // System.out.println(generateToText()); } + + public void testArrayCast() throws Exception { + blackBoxFile("regressions/kt2997.kt"); + } }