From 475e40b3e426d820da22e8e732e70d27d980cacb Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 12 Jul 2022 11:34:42 +0200 Subject: [PATCH] K1: report warning for inline virtual member in enum #KT-53148 Fixed Related to KT-34372 --- ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...irOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ .../jetbrains/kotlin/diagnostics/Errors.java | 1 + .../rendering/DefaultErrorMessages.java | 1 + .../resolve/inline/InlineAnalyzerExtension.kt | 6 ++++-- .../tests/inline/virtualMemberInEnum.fir.kt | 12 +++++++++++ .../tests/inline/virtualMemberInEnum.kt | 12 +++++++++++ .../tests/inline/virtualMemberInEnum.txt | 21 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 10 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.fir.kt create mode 100644 compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.kt create mode 100644 compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.txt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 4bcd570f6a0..1cf9760be81 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -17310,6 +17310,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/inline/vararg.kt"); } + @Test + @TestMetadata("virtualMemberInEnum.kt") + public void testVirtualMemberInEnum() throws Exception { + runTest("compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.kt"); + } + @Test @TestMetadata("when.kt") public void testWhen() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index e774e8fd210..3506f45a0bb 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -17310,6 +17310,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/inline/vararg.kt"); } + @Test + @TestMetadata("virtualMemberInEnum.kt") + public void testVirtualMemberInEnum() throws Exception { + runTest("compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.kt"); + } + @Test @TestMetadata("when.kt") public void testWhen() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 7d0c7d1cc10..7705c96b00e 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -17310,6 +17310,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/inline/vararg.kt"); } + @Test + @TestMetadata("virtualMemberInEnum.kt") + public void testVirtualMemberInEnum() throws Exception { + runTest("compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.kt"); + } + @Test @TestMetadata("when.kt") public void testWhen() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 8700376e570..e39f2898cc3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -1274,6 +1274,7 @@ public interface Errors { DiagnosticFactory2 NULLABLE_INLINE_PARAMETER = DiagnosticFactory2.create(ERROR); DiagnosticFactory2 RECURSION_IN_INLINE = DiagnosticFactory2.create(ERROR); DiagnosticFactory0 DECLARATION_CANT_BE_INLINED = DiagnosticFactory0.create(ERROR, INLINE_FUN_MODIFIER); + DiagnosticFactory0 DECLARATION_CANT_BE_INLINED_WARNING = DiagnosticFactory0.create(WARNING, INLINE_FUN_MODIFIER); DiagnosticFactory0 OVERRIDE_BY_INLINE = DiagnosticFactory0.create(WARNING, DECLARATION_SIGNATURE); DiagnosticFactory0 REIFIED_TYPE_PARAMETER_IN_OVERRIDE = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 INLINE_CALL_CYCLE = DiagnosticFactory1.create(ERROR, DEFAULT); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 364ee636a6f..bf86421bd71 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -1085,6 +1085,7 @@ public class DefaultErrorMessages { MAP.put(PRIVATE_CLASS_MEMBER_FROM_INLINE, "Non-private inline function cannot access members of private classes: ''{0}''", SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES); MAP.put(NOT_YET_SUPPORTED_IN_INLINE, "{0} are not yet supported in inline functions", STRING); MAP.put(DECLARATION_CANT_BE_INLINED, "'inline' modifier is not allowed on virtual members. Only private or final members can be inlined"); + MAP.put(DECLARATION_CANT_BE_INLINED_WARNING, "'inline' modifier is not allowed on virtual enum members. Only private or final members can be inlined. This warning will become an error in K2"); MAP.put(OVERRIDE_BY_INLINE, "Override by an inline function"); MAP.put(REIFIED_TYPE_PARAMETER_IN_OVERRIDE, "Override by a function with reified type parameter"); MAP.put(NOTHING_TO_INLINE, "Expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of functional types"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt index 61c6ca76337..ac8cd675975 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt @@ -159,11 +159,13 @@ class InlineAnalyzerExtension( } } - //TODO: actually it should be isEffectivelyFinal(false), but looks like it requires committee decision: KT-34372) - if (callableDescriptor.isEffectivelyFinal(true)) { + if (callableDescriptor.isEffectivelyFinal(ignoreEnumClassFinality = true)) { if (overridesAnything) { trace.report(Errors.OVERRIDE_BY_INLINE.on(functionOrProperty)) } + if (!callableDescriptor.isEffectivelyFinal(ignoreEnumClassFinality = false)) { + trace.report(Errors.DECLARATION_CANT_BE_INLINED_WARNING.on(functionOrProperty)) + } return } trace.report(Errors.DECLARATION_CANT_BE_INLINED.on(functionOrProperty)) diff --git a/compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.fir.kt b/compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.fir.kt new file mode 100644 index 00000000000..2807e6bc1ed --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.fir.kt @@ -0,0 +1,12 @@ +enum class Some { + A { + override fun foo(s: () -> String): String { + return s() + s() + } + }; + + //SHOULD BE ERROR REPORTED + open inline fun foo(s: () -> String): String { + return s() + } +} diff --git a/compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.kt b/compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.kt new file mode 100644 index 00000000000..0af3607c4a8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.kt @@ -0,0 +1,12 @@ +enum class Some { + A { + override fun foo(s: () -> String): String { + return s() + s() + } + }; + + //SHOULD BE ERROR REPORTED + open inline fun foo(s: () -> String): String { + return s() + } +} diff --git a/compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.txt b/compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.txt new file mode 100644 index 00000000000..b6437ce7469 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.txt @@ -0,0 +1,21 @@ +package + +public final enum class Some : kotlin.Enum { + enum entry A + + private constructor Some() + @kotlin.internal.IntrinsicConstEvaluation public final override /*1*/ /*fake_override*/ val name: kotlin.String + public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int + protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: Some): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit + public open inline fun foo(/*0*/ s: () -> kotlin.String): kotlin.String + public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class! + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): Some + public final /*synthesized*/ fun values(): kotlin.Array +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 2215bca8761..fa61b73be5e 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -17316,6 +17316,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/inline/vararg.kt"); } + @Test + @TestMetadata("virtualMemberInEnum.kt") + public void testVirtualMemberInEnum() throws Exception { + runTest("compiler/testData/diagnostics/tests/inline/virtualMemberInEnum.kt"); + } + @Test @TestMetadata("when.kt") public void testWhen() throws Exception {