fix for KT=2702 - wrong bridges on super call
This commit is contained in:
@@ -370,4 +370,12 @@ public class CodegenUtil {
|
||||
}
|
||||
return JetStandardClasses.getAnyType();
|
||||
}
|
||||
|
||||
public static <T extends CallableMemberDescriptor> T unwrapFakeOverride(T member) {
|
||||
while (member.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
|
||||
//noinspection unchecked
|
||||
member = (T) member.getOverriddenDescriptors().iterator().next();
|
||||
}
|
||||
return member;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1317,9 +1317,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
IntrinsicMethod intrinsic = null;
|
||||
if (descriptor instanceof CallableMemberDescriptor) {
|
||||
CallableMemberDescriptor memberDescriptor = (CallableMemberDescriptor) descriptor;
|
||||
while (memberDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
|
||||
memberDescriptor = memberDescriptor.getOverriddenDescriptors().iterator().next();
|
||||
}
|
||||
memberDescriptor = unwrapFakeOverride(memberDescriptor);
|
||||
|
||||
intrinsic = state.getIntrinsics().getIntrinsic(memberDescriptor);
|
||||
}
|
||||
if (intrinsic != null) {
|
||||
@@ -1696,6 +1695,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
c = c.getParentContext();
|
||||
assert c != null;
|
||||
}
|
||||
fd = unwrapFakeOverride(fd);
|
||||
fd = (FunctionDescriptor) c.getAccessor(fd);
|
||||
superCall = false;
|
||||
receiver = StackValue.thisOrOuter(this, enclosed);
|
||||
|
||||
@@ -357,9 +357,7 @@ public class JetTypeMapper extends BindingTraceAware {
|
||||
public CallableMethod mapToCallableMethod(@NotNull FunctionDescriptor functionDescriptor, boolean superCall, OwnerKind kind) {
|
||||
final DeclarationDescriptor functionParent = functionDescriptor.getOriginal().getContainingDeclaration();
|
||||
|
||||
while (functionDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
|
||||
functionDescriptor = functionDescriptor.getOverriddenDescriptors().iterator().next();
|
||||
}
|
||||
functionDescriptor = unwrapFakeOverride(functionDescriptor);
|
||||
|
||||
JvmMethodSignature descriptor = mapSignature(functionDescriptor.getOriginal(), true, kind);
|
||||
JvmClassName owner;
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
open class A<R> {
|
||||
open fun foo(r: R): R {return r}
|
||||
}
|
||||
|
||||
open class B : A<String>() {
|
||||
}
|
||||
|
||||
open class C : B() {
|
||||
override fun foo(r: String): String {
|
||||
return super.foo(r) + "K"
|
||||
}
|
||||
}
|
||||
|
||||
fun box() = C().foo("O")
|
||||
@@ -144,4 +144,9 @@ public class BridgeMethodGenTest extends CodegenTestCase {
|
||||
createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY);
|
||||
blackBoxFile("regressions/kt1939.kt");
|
||||
}
|
||||
|
||||
public void testKt2702() {
|
||||
createEnvironmentWithMockJdkAndIdeaAnnotations(ConfigurationKind.JDK_ONLY);
|
||||
blackBoxFile("regressions/kt2702.kt");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user