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