diff --git a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/bridges/bridges.kt b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/bridges/bridges.kt index ef205d59729..a8e9079bbb0 100644 --- a/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/bridges/bridges.kt +++ b/compiler/backend-common/src/org/jetbrains/kotlin/backend/common/bridges/bridges.kt @@ -56,7 +56,7 @@ fun generateBridges( // into some of the super-classes and will be inherited in this class if (fake && function.getOverridden().none { it.isAbstract }) return setOf() - val implementation = findConcreteSuperDeclaration(function) + val implementation = findConcreteSuperDeclaration(function) ?: return setOf() val bridgesToGenerate = findAllReachableDeclarations(function).mapTo(LinkedHashSet(), signature) @@ -94,7 +94,7 @@ fun findAllReachableDeclarations(function: Function) * Given a concrete function, finds an implementation (a concrete declaration) of this function in the supertypes. * The implementation is guaranteed to exist because if it wouldn't, the given function would've been abstract */ -fun findConcreteSuperDeclaration(function: Function): Function { +fun findConcreteSuperDeclaration(function: Function): Function? { require(!function.isAbstract, { "Only concrete functions have implementations: $function" }) if (function.isDeclaration) return function @@ -118,7 +118,11 @@ fun findConcreteSuperDeclaration(function: Function) val concreteRelevantDeclarations = result.filter { !it.isAbstract && it.mayBeUsedAsSuperImplementation } if (concreteRelevantDeclarations.size != 1) { - error("Concrete fake override $function should have exactly one concrete super-declaration: $concreteRelevantDeclarations") + if (!function.mightBeIncorrectCode) { + error("Concrete fake override $function should have exactly one concrete super-declaration: $concreteRelevantDeclarations") + } else { + return null + } } return concreteRelevantDeclarations[0] diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/builtinSpecialBridges.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/builtinSpecialBridges.kt index 1c70a2f3f3e..cd52ee48afc 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/builtinSpecialBridges.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/builtinSpecialBridges.kt @@ -153,7 +153,7 @@ private fun findSuperImplementationForStubDelegation( state: GenerationState, signatureByDescriptor: (FunctionDescriptor) -> Signature ): FunctionDescriptor? { - val implementation = findConcreteSuperDeclaration(DescriptorBasedFunctionHandleForJvm(function, state)) + val implementation = findConcreteSuperDeclaration(DescriptorBasedFunctionHandleForJvm(function, state)) ?: return null // Implementation from interface will be generated by common mechanism if (!implementation.mayBeUsedAsSuperImplementation) return null diff --git a/compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.java b/compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.java new file mode 100644 index 00000000000..1e8085706f0 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.java @@ -0,0 +1,5 @@ +public enum EnumNameOverride implements Bar { + ; + + private EnumNameOverride() { /* compiled code */ } +} diff --git a/compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.kt b/compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.kt new file mode 100644 index 00000000000..150fc7a0abe --- /dev/null +++ b/compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.kt @@ -0,0 +1,11 @@ +// EnumNameOverride +interface Foo { + fun name(): String +} + +interface Bar : Foo { + override fun name() = name + var name: String +} + +enum class EnumNameOverride : Bar diff --git a/compiler/testData/asJava/lightClasses/compilationErrors/TwoOverrides.java b/compiler/testData/asJava/lightClasses/compilationErrors/TwoOverrides.java new file mode 100644 index 00000000000..7b6ddd37000 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/compilationErrors/TwoOverrides.java @@ -0,0 +1,9 @@ +public final class TwoOverrides implements java.lang.Iterable, kotlin.collections.Iterable, kotlin.jvm.internal.markers.KMappedMarker { + @org.jetbrains.annotations.Nullable + public java.lang.Void iterator() { /* compiled code */ } + + @org.jetbrains.annotations.Nullable + public java.lang.Void iterator() { /* compiled code */ } + + public TwoOverrides() { /* compiled code */ } +} diff --git a/compiler/testData/asJava/lightClasses/compilationErrors/TwoOverrides.kt b/compiler/testData/asJava/lightClasses/compilationErrors/TwoOverrides.kt new file mode 100644 index 00000000000..ef89a998fa5 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/compilationErrors/TwoOverrides.kt @@ -0,0 +1,6 @@ +// TwoOverrides +class TwoOverrides : Iterable { + override fun iterator() = null + + override fun iterator() = null +} diff --git a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index d1aefabd9e3..6cb1024793e 100644 --- a/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -181,6 +181,11 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT runTest("compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.kt"); } + @TestMetadata("EnumNameOverride.kt") + public void testEnumNameOverride() throws Exception { + runTest("compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.kt"); + } + @TestMetadata("ExpectClass.kt") public void testExpectClass() throws Exception { runTest("compiler/testData/asJava/lightClasses/compilationErrors/ExpectClass.kt"); @@ -236,6 +241,11 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT runTest("compiler/testData/asJava/lightClasses/compilationErrors/TraitClassObjectField.kt"); } + @TestMetadata("TwoOverrides.kt") + public void testTwoOverrides() throws Exception { + runTest("compiler/testData/asJava/lightClasses/compilationErrors/TwoOverrides.kt"); + } + @TestMetadata("WrongAnnotations.kt") public void testWrongAnnotations() throws Exception { runTest("compiler/testData/asJava/lightClasses/compilationErrors/WrongAnnotations.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassSanityTestGenerated.java b/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassSanityTestGenerated.java index 25c2fd8c5b3..15d02454bd1 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassSanityTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightClassSanityTestGenerated.java @@ -181,6 +181,11 @@ public class UltraLightClassSanityTestGenerated extends AbstractUltraLightClassS runTest("compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.kt"); } + @TestMetadata("EnumNameOverride.kt") + public void testEnumNameOverride() throws Exception { + runTest("compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.kt"); + } + @TestMetadata("ExpectClass.kt") public void testExpectClass() throws Exception { runTest("compiler/testData/asJava/lightClasses/compilationErrors/ExpectClass.kt"); @@ -236,6 +241,11 @@ public class UltraLightClassSanityTestGenerated extends AbstractUltraLightClassS runTest("compiler/testData/asJava/lightClasses/compilationErrors/TraitClassObjectField.kt"); } + @TestMetadata("TwoOverrides.kt") + public void testTwoOverrides() throws Exception { + runTest("compiler/testData/asJava/lightClasses/compilationErrors/TwoOverrides.kt"); + } + @TestMetadata("WrongAnnotations.kt") public void testWrongAnnotations() throws Exception { runTest("compiler/testData/asJava/lightClasses/compilationErrors/WrongAnnotations.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java index e50bceaf2cf..afcc634a38f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/caches/resolve/IdeLightClassTestGenerated.java @@ -181,6 +181,11 @@ public class IdeLightClassTestGenerated extends AbstractIdeLightClassTest { runTest("compiler/testData/asJava/lightClasses/compilationErrors/AnnotationModifiers.kt"); } + @TestMetadata("EnumNameOverride.kt") + public void testEnumNameOverride() throws Exception { + runTest("compiler/testData/asJava/lightClasses/compilationErrors/EnumNameOverride.kt"); + } + @TestMetadata("ExpectClass.kt") public void testExpectClass() throws Exception { runTest("compiler/testData/asJava/lightClasses/compilationErrors/ExpectClass.kt"); @@ -236,6 +241,11 @@ public class IdeLightClassTestGenerated extends AbstractIdeLightClassTest { runTest("compiler/testData/asJava/lightClasses/compilationErrors/TraitClassObjectField.kt"); } + @TestMetadata("TwoOverrides.kt") + public void testTwoOverrides() throws Exception { + runTest("compiler/testData/asJava/lightClasses/compilationErrors/TwoOverrides.kt"); + } + @TestMetadata("WrongAnnotations.kt") public void testWrongAnnotations() throws Exception { runTest("compiler/testData/asJava/lightClasses/compilationErrors/WrongAnnotations.kt");