diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java index 14877e4811f..686f483b618 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java @@ -63,10 +63,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions; import org.jetbrains.org.objectweb.asm.Type; import org.jetbrains.org.objectweb.asm.commons.Method; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Stream; import static org.jetbrains.kotlin.codegen.AsmUtil.isStaticMethod; @@ -1681,10 +1678,13 @@ public class KotlinTypeMapper { @Nullable private ResolvedCall findFirstDelegatingSuperCall(@NotNull ConstructorDescriptor descriptor) { ClassifierDescriptorWithTypeParameters constructorOwner = descriptor.getContainingDeclaration(); + Set visited = new HashSet<>(); + visited.add(descriptor); while (true) { ResolvedCall next = getDelegationConstructorCall(bindingContext, descriptor); if (next == null) return null; descriptor = next.getResultingDescriptor().getOriginal(); + if (!visited.add(descriptor)) return null; if (descriptor.getContainingDeclaration() != constructorOwner) return next; } }