diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java
index 847eef08375..15d735c55eb 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java
@@ -508,9 +508,11 @@ public class JetTypeMapper extends BindingTraceAware {
boolean isInterface = originalIsInterface && currentIsInterface;
Type type = mapType(receiver.getDefaultType(), JetTypeMapperMode.TYPE_PARAMETER);
owner = JvmClassName.byType(type);
- ownerForDefaultParam = JvmClassName.byType(mapType(declarationOwner.getDefaultType(), JetTypeMapperMode.TYPE_PARAMETER));
+
+ ClassDescriptor declarationOwnerForDefault = (ClassDescriptor) findBaseDeclaration(functionDescriptor).getContainingDeclaration();
+ ownerForDefaultParam = JvmClassName.byType(mapType(declarationOwnerForDefault.getDefaultType(), JetTypeMapperMode.TYPE_PARAMETER));
ownerForDefaultImpl = JvmClassName.byInternalName(
- ownerForDefaultParam.getInternalName() + (originalIsInterface ? JvmAbi.TRAIT_IMPL_SUFFIX : ""));
+ ownerForDefaultParam.getInternalName() + (isInterface(declarationOwnerForDefault) ? JvmAbi.TRAIT_IMPL_SUFFIX : ""));
if (isInterface) {
invokeOpcode = superCall ? INVOKESTATIC : INVOKEINTERFACE;
}
@@ -557,13 +559,20 @@ public class JetTypeMapper extends BindingTraceAware {
@NotNull
private static FunctionDescriptor findAnyDeclaration(@NotNull FunctionDescriptor function) {
- //if (function.getKind() == CallableMemberDescriptor.Kind.DECLARATION) {
+ if (function.getKind() == CallableMemberDescriptor.Kind.DECLARATION) {
+ return function;
+ }
+ return findBaseDeclaration(function);
+ }
+
+ @NotNull
+ private static FunctionDescriptor findBaseDeclaration(@NotNull FunctionDescriptor function) {
if (function.getOverriddenDescriptors().isEmpty()) {
return function;
}
else {
// TODO: prefer class to interface
- return findAnyDeclaration(function.getOverriddenDescriptors().iterator().next());
+ return findBaseDeclaration(function.getOverriddenDescriptors().iterator().next());
}
}
diff --git a/compiler/testData/codegen/box/super/kt3538.kt b/compiler/testData/codegen/box/super/kt3538.kt
new file mode 100644
index 00000000000..47656e7b4df
--- /dev/null
+++ b/compiler/testData/codegen/box/super/kt3538.kt
@@ -0,0 +1,21 @@
+open class Base {
+ open fun sayHello(): String {
+ return "O"
+ }
+}
+
+trait Trait: Base {
+ override fun sayHello(): String {
+ return "K"
+ }
+}
+
+class Derived(): Base(), Trait {
+ override fun sayHello(): String {
+ return super.sayHello() + super.sayHello()
+ }
+}
+
+fun box(): String {
+ return Derived().sayHello()
+}
\ No newline at end of file
diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java
index 16187b82f7d..6c6efcd6d59 100644
--- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java
+++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java
@@ -3616,6 +3616,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
doTest("compiler/testData/codegen/box/super/kt3492TraitProperty.kt");
}
+ @TestMetadata("kt3538.kt")
+ public void testKt3538() throws Exception {
+ doTest("compiler/testData/codegen/box/super/kt3538.kt");
+ }
+
@TestMetadata("multipleSuperTraits.kt")
public void testMultipleSuperTraits() throws Exception {
doTest("compiler/testData/codegen/box/super/multipleSuperTraits.kt");