From a79a31cf0176bad795717da777a299cfcbe6cfff Mon Sep 17 00:00:00 2001 From: "Natalia.Ukhorskaya" Date: Tue, 23 Oct 2012 11:42:44 +0400 Subject: [PATCH] #KT-2811 Fixed VerifyError on smart-cast 'this' --- .../jet/codegen/ExpressionCodegen.java | 6 ++--- compiler/testData/codegen/typeInfo/kt2811.kt | 25 +++++++++++++++++++ .../jetbrains/jet/codegen/TypeInfoTest.java | 4 +++ 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/typeInfo/kt2811.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 55d90d5d140..86e2555e61a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1911,9 +1911,9 @@ public class ExpressionCodegen extends JetVisitor implem } else if (descriptor instanceof AutoCastReceiver) { AutoCastReceiver autoCastReceiver = (AutoCastReceiver) descriptor; - Type intermediateType = asmType(autoCastReceiver.getType()); - generateFromResolvedCall(autoCastReceiver.getOriginal(), intermediateType); - StackValue.onStack(intermediateType).put(type, v); + Type originalType = asmType(autoCastReceiver.getOriginal().getType()); + generateFromResolvedCall(autoCastReceiver.getOriginal(), originalType); + StackValue.onStack(originalType).put(type, v); } else { throw new UnsupportedOperationException("Unsupported receiver type: " + descriptor); diff --git a/compiler/testData/codegen/typeInfo/kt2811.kt b/compiler/testData/codegen/typeInfo/kt2811.kt new file mode 100644 index 00000000000..51aef75ea61 --- /dev/null +++ b/compiler/testData/codegen/typeInfo/kt2811.kt @@ -0,0 +1,25 @@ +open class Test1 { + fun test1(): String { + if (this is Test2) { + return this.foo() + } + return "fail" + } +} + +class Test2(): Test1() { + fun foo(): String { + return "OK" + } +} + +fun Test1.test2(): String { + if (this is Test2) return this.foo() else return "fail" +} + +fun box(): String { + if ("OK" == Test2().test1() && "OK" == Test2().test2()) { + return "OK" + } + return "fail" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/TypeInfoTest.java b/compiler/tests/org/jetbrains/jet/codegen/TypeInfoTest.java index 83bb1985807..d78cbd0c2a7 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/TypeInfoTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/TypeInfoTest.java @@ -157,6 +157,10 @@ public class TypeInfoTest extends CodegenTestCase { // System.out.println(generateToText()); } + public void testKt2811() throws Exception { + blackBoxFile("typeInfo/kt2811.kt"); + } + public void testInheritance() throws Exception { blackBoxFile("typeInfo/inheritance.jet"); // System.out.println(generateToText());