From c33b880a57e2c62aa3062d739865dc3abe52cf8a Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 13 Sep 2012 23:24:58 +0400 Subject: [PATCH] EA-39177 - CCE: ArrayIterator.generate If local variable is auto-casted to array, it should be iterated as array. --- .../org/jetbrains/jet/codegen/ExpressionCodegen.java | 6 +++--- .../jetbrains/jet/lang/resolve/calls/CallResolver.java | 1 + .../controlStructures/forInSmartCastedToArray.kt | 10 ++++++++++ .../jetbrains/jet/codegen/ControlStructuresTest.java | 6 ++++++ 4 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/controlStructures/forInSmartCastedToArray.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 7e2c44d71ec..dfe48c29a64 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -680,8 +680,9 @@ public class ExpressionCodegen extends JetVisitor implem JetExpression loopRange = forExpression.getLoopRange(); StackValue value = gen(loopRange); - if (value instanceof StackValue.Local) { - arrayVar = ((StackValue.Local) value).index; + Type asmLoopRangeType = asmType(loopRangeType); + if (value instanceof StackValue.Local && value.type.equals(asmLoopRangeType)) { + arrayVar = ((StackValue.Local) value).index; // no need to copy local variable into another variable } else { arrayVar = myFrameMap.enterTemp(OBJECT_TYPE); @@ -691,7 +692,6 @@ public class ExpressionCodegen extends JetVisitor implem myFrameMap.leaveTemp(OBJECT_TYPE); } }; - Type asmLoopRangeType = asmType(loopRangeType); value.put(asmLoopRangeType, v); v.store(arrayVar, OBJECT_TYPE); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java index 459807caeae..54ef4ec182e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolver.java @@ -819,6 +819,7 @@ public class CallResolver { ExpressionReceiver expressionReceiver = (ExpressionReceiver) original; if (autoCastReceiver.canCast()) { trace.record(AUTOCAST, expressionReceiver.getExpression(), autoCastReceiver.getType()); + trace.record(EXPRESSION_TYPE, expressionReceiver.getExpression(), autoCastReceiver.getType()); } else { trace.report(AUTOCAST_IMPOSSIBLE.on(expressionReceiver.getExpression(), autoCastReceiver.getType(), expressionReceiver.getExpression().getText())); diff --git a/compiler/testData/codegen/controlStructures/forInSmartCastedToArray.kt b/compiler/testData/codegen/controlStructures/forInSmartCastedToArray.kt new file mode 100644 index 00000000000..183fe28c63b --- /dev/null +++ b/compiler/testData/codegen/controlStructures/forInSmartCastedToArray.kt @@ -0,0 +1,10 @@ +fun f(x: Any?): String { + if (x is Array) { + for (i in x) { + return i + } + } + return "FAIL" +} + +fun box(): String = f(Array(1, {"OK"})) diff --git a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java index f63c27f72d8..1392652e441 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ControlStructuresTest.java @@ -438,4 +438,10 @@ public class ControlStructuresTest extends CodegenTestCase { createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); blackBoxFile("controlStructures/longRange.jet"); } + + public void testForInSmartCastedToArray() { + createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY); + blackBoxFile("controlStructures/forInSmartCastedToArray.kt"); + System.out.println(generateToText()); + } }