From d4278250e68f3b9c1330dd063b021738e6079f41 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 26 Feb 2024 12:20:32 +0100 Subject: [PATCH] IR: never check static members for overridability #KT-66077 Fixed --- ...LFirBlackBoxCodegenBasedTestGenerated.java | 6 +++++ ...rsedBlackBoxCodegenBasedTestGenerated.java | 6 +++++ ...LightTreeBlackBoxCodegenTestGenerated.java | 6 +++++ ...hIrFakeOverrideGeneratorTestGenerated.java | 6 +++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 +++++ .../ir/overrides/IrFakeOverrideBuilder.kt | 22 ++++++++++--------- .../statics/inheritTwoStaticMethods2.kt | 18 +++++++++++++++ .../JvmAbiConsistencyTestBoxGenerated.java | 6 +++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ ...kBoxCodegenWithIrInlinerTestGenerated.java | 6 +++++ ...xCodegenTestWithInlineScopesGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ 13 files changed, 95 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java index c2f3fe166e1..603fb7e182c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java @@ -34077,6 +34077,12 @@ public class LLFirBlackBoxCodegenBasedTestGenerated extends AbstractLLFirBlackBo runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("inheritTwoStaticMethods2.kt") + public void testInheritTwoStaticMethods2() { + runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt"); + } + @Test @TestMetadata("jkkjk.kt") public void testJkkjk() { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java index 49da0ed21b9..43d5e537aca 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java @@ -34077,6 +34077,12 @@ public class LLFirReversedBlackBoxCodegenBasedTestGenerated extends AbstractLLFi runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("inheritTwoStaticMethods2.kt") + public void testInheritTwoStaticMethods2() { + runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt"); + } + @Test @TestMetadata("jkkjk.kt") public void testJkkjk() { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index 1d05283f7e3..966eb87479d 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -33946,6 +33946,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("inheritTwoStaticMethods2.kt") + public void testInheritTwoStaticMethods2() { + runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt"); + } + @Test @TestMetadata("jkkjk.kt") public void testJkkjk() { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java index ed76ed632ed..97fd5c299de 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java @@ -33946,6 +33946,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("inheritTwoStaticMethods2.kt") + public void testInheritTwoStaticMethods2() { + runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt"); + } + @Test @TestMetadata("jkkjk.kt") public void testJkkjk() { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index a91112d293c..9135180233d 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -33946,6 +33946,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("inheritTwoStaticMethods2.kt") + public void testInheritTwoStaticMethods2() { + runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt"); + } + @Test @TestMetadata("jkkjk.kt") public void testJkkjk() { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt index 1285b555619..ef2dc2fd4e8 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/overrides/IrFakeOverrideBuilder.kt @@ -67,7 +67,7 @@ class IrFakeOverrideBuilder( val (staticMembers, instanceMembers) = clazz.declarations.filterIsInstance().partition { it.isStaticMember } - buildFakeOverridesForClassImpl(clazz, instanceMembers, oldSignatures, clazz.superTypes) { !it.isStaticMember } + buildFakeOverridesForClassImpl(clazz, instanceMembers, oldSignatures, clazz.superTypes, isStaticMembers = false) // Static Java members from the superclass need fake overrides in the subclass, to support the case when the static member is // declared in an inaccessible grandparent class but is exposed as public in the parent. For example: @@ -80,7 +80,7 @@ class IrFakeOverrideBuilder( // we need to generate a fake override in class B. This is only possible in case of superclasses, as static _interface_ members // are not inherited (see JLS 8.4.8 and 9.4.1). val superClass = clazz.superTypes.filter { it.classOrFail.owner.isClass } - buildFakeOverridesForClassImpl(clazz, staticMembers, oldSignatures, superClass) { it.isStaticMember } + buildFakeOverridesForClassImpl(clazz, staticMembers, oldSignatures, superClass, isStaticMembers = true) } } @@ -89,11 +89,11 @@ class IrFakeOverrideBuilder( allFromCurrent: List, oldSignatures: Boolean, supertypes: List, - declarationFilter: (IrOverridableMember) -> Boolean, + isStaticMembers: Boolean, ) { val allFromSuper = supertypes.flatMap { superType -> superType.classOrFail.owner.declarations - .filterIsInstanceAnd(declarationFilter) + .filterIsInstanceAnd { it.isStaticMember == isStaticMembers } .mapNotNull { val fakeOverride = strategy.fakeOverrideMember(superType, it, clazz) ?: return@mapNotNull null FakeOverride(fakeOverride, it) @@ -105,10 +105,7 @@ class IrFakeOverrideBuilder( allFromSuperByName.forEach { (name, superMembers) -> generateOverridesInFunctionGroup( - superMembers, - allFromCurrentByName[name] ?: emptyList(), - clazz, - oldSignatures + superMembers, allFromCurrentByName[name] ?: emptyList(), clazz, oldSignatures, isStaticMembers ) } @@ -164,7 +161,8 @@ class IrFakeOverrideBuilder( membersFromSupertypes: List, membersFromCurrent: List, current: IrClass, - compatibilityMode: Boolean + compatibilityMode: Boolean, + isStaticMembers: Boolean, ) { val notOverridden = membersFromSupertypes.toMutableSet() @@ -174,7 +172,11 @@ class IrFakeOverrideBuilder( } val addedFakeOverrides = mutableListOf() - createAndBindFakeOverrides(current, notOverridden, addedFakeOverrides, compatibilityMode) + if (isStaticMembers) { + createAndBindFakeOverride(notOverridden.toList(), current, addedFakeOverrides, compatibilityMode) + } else { + createAndBindFakeOverrides(current, notOverridden, addedFakeOverrides, compatibilityMode) + } current.declarations.addAll(addedFakeOverrides) } diff --git a/compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt b/compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt new file mode 100644 index 00000000000..4ca5f2203f6 --- /dev/null +++ b/compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt @@ -0,0 +1,18 @@ +// TARGET_BACKEND: JVM +// FILE: A.java +public class A { + public static String f(Long x) { + return "Fail"; + } + + public static String f(long x) { + return "OK"; + } +} + +// FILE: 1.kt +class B : A() { + fun g(): String = f(0L) +} + +fun box(): String = B().g() diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java index e44ad573513..d8bd2a08ebb 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/JvmAbiConsistencyTestBoxGenerated.java @@ -33946,6 +33946,12 @@ public class JvmAbiConsistencyTestBoxGenerated extends AbstractJvmAbiConsistency runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("inheritTwoStaticMethods2.kt") + public void testInheritTwoStaticMethods2() { + runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt"); + } + @Test @TestMetadata("jkkjk.kt") public void testJkkjk() { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index d4a48e0882f..f5e9a837c97 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -32086,6 +32086,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("inheritTwoStaticMethods2.kt") + public void testInheritTwoStaticMethods2() { + runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt"); + } + @Test @TestMetadata("jkkjk.kt") public void testJkkjk() { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index bf1009b7d56..70839f1a469 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -33946,6 +33946,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("inheritTwoStaticMethods2.kt") + public void testInheritTwoStaticMethods2() { + runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt"); + } + @Test @TestMetadata("jkkjk.kt") public void testJkkjk() { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index 698b761b151..7af20ab648a 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -33946,6 +33946,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("inheritTwoStaticMethods2.kt") + public void testInheritTwoStaticMethods2() { + runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt"); + } + @Test @TestMetadata("jkkjk.kt") public void testJkkjk() { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/inlineScopes/FirBlackBoxCodegenTestWithInlineScopesGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/inlineScopes/FirBlackBoxCodegenTestWithInlineScopesGenerated.java index e368594da7b..43147b724ce 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/inlineScopes/FirBlackBoxCodegenTestWithInlineScopesGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/inlineScopes/FirBlackBoxCodegenTestWithInlineScopesGenerated.java @@ -33946,6 +33946,12 @@ public class FirBlackBoxCodegenTestWithInlineScopesGenerated extends AbstractFir runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @Test + @TestMetadata("inheritTwoStaticMethods2.kt") + public void testInheritTwoStaticMethods2() { + runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt"); + } + @Test @TestMetadata("jkkjk.kt") public void testJkkjk() { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 1ea213a8946..8a6737b67d6 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -28808,6 +28808,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods.kt"); } + @TestMetadata("inheritTwoStaticMethods2.kt") + public void testInheritTwoStaticMethods2() { + runTest("compiler/testData/codegen/box/javaInterop/statics/inheritTwoStaticMethods2.kt"); + } + @TestMetadata("jkkjk.kt") public void testJkkjk() { runTest("compiler/testData/codegen/box/javaInterop/statics/jkkjk.kt");