Automatically cast error for intrinsic methods in array
#KT-2997 Fixed
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<Any>(1) { 1 }
|
||||
if (foo(oA) != 1) return "fail Any[]"
|
||||
|
||||
val sArray = Array<String>(0) { "" }
|
||||
if (foo(sArray) != 0) return "fail String[]"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user