diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index de5ec49228b..e708eb2a7ae 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -23693,6 +23693,18 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/modifiers/const/kCallable_before.kt"); } + @Test + @TestMetadata("kClassInEquals.kt") + public void testKClassInEquals() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/kClassInEquals.kt"); + } + + @Test + @TestMetadata("kClassInStringConcatenation.kt") + public void testKClassInStringConcatenation() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/kClassInStringConcatenation.kt"); + } + @Test @TestMetadata("kotlinJavaCycle.kt") public void testKotlinJavaCycle() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index ec6af487215..0628dd5fb59 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -23693,6 +23693,18 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/modifiers/const/kCallable_before.kt"); } + @Test + @TestMetadata("kClassInEquals.kt") + public void testKClassInEquals() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/kClassInEquals.kt"); + } + + @Test + @TestMetadata("kClassInStringConcatenation.kt") + public void testKClassInStringConcatenation() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/kClassInStringConcatenation.kt"); + } + @Test @TestMetadata("kotlinJavaCycle.kt") public void testKotlinJavaCycle() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 4ab6adbb7b0..97e4a82998a 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -23687,6 +23687,18 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/modifiers/const/kCallable_before.kt"); } + @Test + @TestMetadata("kClassInEquals.kt") + public void testKClassInEquals() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/kClassInEquals.kt"); + } + + @Test + @TestMetadata("kClassInStringConcatenation.kt") + public void testKClassInStringConcatenation() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/kClassInStringConcatenation.kt"); + } + @Test @TestMetadata("kotlinJavaCycle.kt") public void testKotlinJavaCycle() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 944a73fd1c6..4c89450709c 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -23693,6 +23693,18 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/modifiers/const/kCallable_before.kt"); } + @Test + @TestMetadata("kClassInEquals.kt") + public void testKClassInEquals() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/kClassInEquals.kt"); + } + + @Test + @TestMetadata("kClassInStringConcatenation.kt") + public void testKClassInStringConcatenation() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/kClassInStringConcatenation.kt"); + } + @Test @TestMetadata("kotlinJavaCycle.kt") public void testKotlinJavaCycle() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt index 6ff4982e27a..b6cd2b8a541 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirConstChecks.kt @@ -85,7 +85,7 @@ internal fun checkConstantArguments( } expression is FirStringConcatenationCall -> { for (exp in (expression as FirCall).arguments) { - if (exp is FirResolvedQualifier || expression.isForbiddenComplexConstant(session)) { + if (exp is FirResolvedQualifier || exp is FirGetClassCall) { return ConstantArgumentKind.NOT_CONST } checkConstantArguments(exp, session)?.let { return it } @@ -95,8 +95,13 @@ internal fun checkConstantArguments( if (expression.operation == FirOperation.IDENTITY || expression.operation == FirOperation.NOT_IDENTITY) { return ConstantArgumentKind.NOT_CONST } + + if (expression.isForbiddenComplexConstant(session)) { + return ConstantArgumentKind.NOT_CONST + } + for (exp in (expression as FirCall).arguments) { - if (exp is FirResolvedQualifier || expression.isForbiddenComplexConstant(session) || exp.getExpandedType().isUnsignedType) { + if (exp is FirResolvedQualifier || exp is FirGetClassCall || exp.getExpandedType().isUnsignedType) { return ConstantArgumentKind.NOT_CONST } checkConstantArguments(exp, session)?.let { return it } diff --git a/compiler/testData/diagnostics/tests/modifiers/const/kClassInEquals.kt b/compiler/testData/diagnostics/tests/modifiers/const/kClassInEquals.kt new file mode 100644 index 00000000000..77a94a10c80 --- /dev/null +++ b/compiler/testData/diagnostics/tests/modifiers/const/kClassInEquals.kt @@ -0,0 +1,10 @@ +// FIR_IDENTICAL +annotation class Anno(val equal: Boolean) + +class A +class B + +@Anno(A::class == B::class) +class C + +const val equal = A::class == B::class diff --git a/compiler/testData/diagnostics/tests/modifiers/const/kClassInStringConcatenation.kt b/compiler/testData/diagnostics/tests/modifiers/const/kClassInStringConcatenation.kt new file mode 100644 index 00000000000..6e6cd0c8fd5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/modifiers/const/kClassInStringConcatenation.kt @@ -0,0 +1,11 @@ +// FIR_IDENTICAL +annotation class Anno(val str: String) + +@Anno("${A::class}") +class A + +@Anno(B::class.toString()) +class B + +const val a = "${A::class}" +const val b = B::class.toString() 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 e228afe9fa5..4b077cb6f26 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 @@ -23693,6 +23693,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/modifiers/const/kCallable_before.kt"); } + @Test + @TestMetadata("kClassInEquals.kt") + public void testKClassInEquals() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/kClassInEquals.kt"); + } + + @Test + @TestMetadata("kClassInStringConcatenation.kt") + public void testKClassInStringConcatenation() throws Exception { + runTest("compiler/testData/diagnostics/tests/modifiers/const/kClassInStringConcatenation.kt"); + } + @Test @TestMetadata("kotlinJavaCycle.kt") public void testKotlinJavaCycle() throws Exception {