diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index db167226987..b817ec7dc73 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2256,8 +2256,6 @@ public class ExpressionCodegen extends JetVisitor implem public StackValue generateThisOrOuter(@NotNull ClassDescriptor calleeContainingClass, boolean isSuper) { boolean isSingleton = CodegenBinding.isSingleton(bindingContext, calleeContainingClass); if (isSingleton) { - assert !isSuper; - if (context.hasThisDescriptor() && context.getThisDescriptor().equals(calleeContainingClass)) { return StackValue.local(0, typeMapper.mapType(calleeContainingClass)); } diff --git a/compiler/testData/codegen/box/objects/nestedObjectWithSuperclass.kt b/compiler/testData/codegen/box/objects/nestedObjectWithSuperclass.kt new file mode 100644 index 00000000000..596801c7050 --- /dev/null +++ b/compiler/testData/codegen/box/objects/nestedObjectWithSuperclass.kt @@ -0,0 +1,18 @@ +open class A (val s: Int) { + open fun foo(): Int { + return s + } +} + +object Outer: A(1) { + object O: A(2) { + override fun foo(): Int { + val s = super.foo() + return s + 3 + } + } +} + +fun box() : String { + return if (Outer.O.foo() == 5) "OK" else "fail" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/objectWithSuperclass.kt b/compiler/testData/codegen/box/objects/objectWithSuperclass.kt new file mode 100644 index 00000000000..31c004a45fb --- /dev/null +++ b/compiler/testData/codegen/box/objects/objectWithSuperclass.kt @@ -0,0 +1,16 @@ +open class A { + open fun foo(): Int { + return 2 + } +} + +object O: A() { + override fun foo(): Int { + val s = super.foo() + return s + 3 + } +} + +fun box() : String { + return if (O.foo() == 5) "OK" else "fail" +} diff --git a/compiler/testData/codegen/box/objects/objectWithSuperclassAndTrait.kt b/compiler/testData/codegen/box/objects/objectWithSuperclassAndTrait.kt new file mode 100644 index 00000000000..ad0d2513d01 --- /dev/null +++ b/compiler/testData/codegen/box/objects/objectWithSuperclassAndTrait.kt @@ -0,0 +1,21 @@ +open class A { + open fun foo(): Int { + return 2 + } +} + +trait T { + open fun foo(): Int { + return 3 + } +} + +object O: A(), T { + override fun foo(): Int { + return super.foo() + super.foo() + } +} + +fun box() : String { + return if (O.foo() == 5) "OK" else "fail" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 70c310c0579..3b98d709d28 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -3531,6 +3531,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/objects/methodOnObject.kt"); } + @TestMetadata("nestedObjectWithSuperclass.kt") + public void testNestedObjectWithSuperclass() throws Exception { + doTest("compiler/testData/codegen/box/objects/nestedObjectWithSuperclass.kt"); + } + @TestMetadata("objectLiteral.kt") public void testObjectLiteral() throws Exception { doTest("compiler/testData/codegen/box/objects/objectLiteral.kt"); @@ -3541,6 +3546,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/objects/objectLiteralInClosure.kt"); } + @TestMetadata("objectWithSuperclass.kt") + public void testObjectWithSuperclass() throws Exception { + doTest("compiler/testData/codegen/box/objects/objectWithSuperclass.kt"); + } + + @TestMetadata("objectWithSuperclassAndTrait.kt") + public void testObjectWithSuperclassAndTrait() throws Exception { + doTest("compiler/testData/codegen/box/objects/objectWithSuperclassAndTrait.kt"); + } + @TestMetadata("receiverInConstructor.kt") public void testReceiverInConstructor() throws Exception { doTest("compiler/testData/codegen/box/objects/receiverInConstructor.kt");