diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java index 99eb010c74c..85d64e0a06f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.annotations.Annotated; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.load.java.JvmAbi; +import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor; import org.jetbrains.kotlin.load.kotlin.PackageClassUtils; import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils; import org.jetbrains.kotlin.load.kotlin.nativeDeclarations.NativeDeclarationsPackage; @@ -566,10 +567,17 @@ public class JetTypeMapper { ownerForDefaultImpl = isInterface(ownerForDefault) ? mapTraitImpl(ownerForDefault) : ownerForDefaultParam; if (isInterface && superCall) { - invokeOpcode = INVOKESTATIC; - signature = mapSignature(functionDescriptor, OwnerKind.TRAIT_IMPL); - owner = mapTraitImpl(currentOwner); thisClass = mapClass(currentOwner); + if (declarationOwner instanceof JavaClassDescriptor) { + invokeOpcode = INVOKESPECIAL; + signature = mapSignature(functionDescriptor); + owner = thisClass; + } + else { + invokeOpcode = INVOKESTATIC; + signature = mapSignature(functionDescriptor, OwnerKind.TRAIT_IMPL); + owner = mapTraitImpl(currentOwner); + } } else { if (isStaticDeclaration(functionDescriptor) || diff --git a/compiler/java8-tests/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJava8CodegenTestGenerated.java b/compiler/java8-tests/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJava8CodegenTestGenerated.java index 4e17e4b4d7a..886acb407b8 100644 --- a/compiler/java8-tests/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJava8CodegenTestGenerated.java +++ b/compiler/java8-tests/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithJava8CodegenTestGenerated.java @@ -71,6 +71,12 @@ public class BlackBoxWithJava8CodegenTestGenerated extends AbstractBlackBoxCodeg doTestWithJava(fileName); } + @TestMetadata("invokeDefaultViaSuper") + public void testInvokeDefaultViaSuper() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/java8/boxWithJava/invokeDefaultViaSuper/"); + doTestWithJava(fileName); + } + @TestMetadata("samOnInterfaceWithDefaultMethod") public void testSamOnInterfaceWithDefaultMethod() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/java8/boxWithJava/samOnInterfaceWithDefaultMethod/"); diff --git a/compiler/testData/codegen/java8/boxWithJava/invokeDefaultViaSuper/Test.java b/compiler/testData/codegen/java8/boxWithJava/invokeDefaultViaSuper/Test.java new file mode 100644 index 00000000000..f660dc34662 --- /dev/null +++ b/compiler/testData/codegen/java8/boxWithJava/invokeDefaultViaSuper/Test.java @@ -0,0 +1,5 @@ +public interface Test { + default String test() { + return "OK"; + } +} diff --git a/compiler/testData/codegen/java8/boxWithJava/invokeDefaultViaSuper/tesk.kt b/compiler/testData/codegen/java8/boxWithJava/invokeDefaultViaSuper/tesk.kt new file mode 100644 index 00000000000..50db9b69aa4 --- /dev/null +++ b/compiler/testData/codegen/java8/boxWithJava/invokeDefaultViaSuper/tesk.kt @@ -0,0 +1,32 @@ +trait KTrait : Test { + +} + +class KClass : Test { + fun ktest(): String { + return super.test() + test() + } +} + +class KTClass : KTrait { + fun ktest(): String { + return super.test() + test() + } +} + + +fun box(): String { + val p = object : KTrait { + fun ktest(): String { + return super.test() + test() + } + }.ktest() + + if (p != "OKOK") return "fail1: $p" + + if (KClass().ktest() != "OKOK") return "fail 2: ${KClass().ktest()}" + + if (KTClass().ktest() != "OKOK") return "fail 3: ${KTClass().ktest()}" + + return "OK" +}