From 8cd9479f206ff7105cd2aad58139282b6010a5c1 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Tue, 5 Dec 2023 17:19:25 +0100 Subject: [PATCH] [K2] Report `NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION` when it is appropriate --- .../testData/resolve/constVal/const.kt | 4 ++-- .../resolve/suppress/withSuppression.fir.txt | 2 +- .../testData/resolve/suppress/withSuppression.kt | 2 +- .../declaration/FirConstPropertyChecker.kt | 14 +++++++++----- .../tests/modifiers/const/binaryLogic.fir.kt | 8 ++++---- .../complexBooleanInStringConcat_after.fir.kt | 2 +- .../complexBooleanInStringConcat_before.fir.kt | 8 -------- .../const/complexBooleanInStringConcat_before.kt | 1 + .../modifiers/const/ifConstVal_after.fir.kt | 4 ++-- .../modifiers/const/stringConcatenation.fir.kt | 16 ---------------- .../tests/modifiers/const/stringConcatenation.kt | 1 + .../useOfNonConstVal.fir.kt | 16 ---------------- .../useOfNonConstVal.kt | 1 + 13 files changed, 23 insertions(+), 56 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/modifiers/const/complexBooleanInStringConcat_before.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/modifiers/const/stringConcatenation.fir.kt delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/useOfNonConstVal.fir.kt diff --git a/compiler/fir/analysis-tests/testData/resolve/constVal/const.kt b/compiler/fir/analysis-tests/testData/resolve/constVal/const.kt index 157a7af37b2..52568064a23 100644 --- a/compiler/fir/analysis-tests/testData/resolve/constVal/const.kt +++ b/compiler/fir/analysis-tests/testData/resolve/constVal/const.kt @@ -21,8 +21,8 @@ const val l = k const val m = "123".toString() const val n = "456".length val o = "789" -const val p = o.toString() -const val q = o.length +const val p = o.toString() +const val q = o.length class ForConst{ companion object { diff --git a/compiler/fir/analysis-tests/testData/resolve/suppress/withSuppression.fir.txt b/compiler/fir/analysis-tests/testData/resolve/suppress/withSuppression.fir.txt index 04f383500a2..62f9958adb5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/suppress/withSuppression.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/suppress/withSuppression.fir.txt @@ -5,7 +5,7 @@ FILE: withSuppression.kt } public final val y: R|kotlin/String| = String(789) public get(): R|kotlin/String| - public final const val z: R|kotlin/String| = @R|kotlin/Suppress|(names = vararg(String(CONST_VAL_WITH_NON_CONST_INITIALIZER))) R|/y| + public final const val z: R|kotlin/String| = @R|kotlin/Suppress|(names = vararg(String(NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION))) R|/y| public get(): R|kotlin/String| @R|kotlin/annotation/Target|(allowedTargets = vararg(Q|kotlin/annotation/AnnotationTarget|.R|kotlin/annotation/AnnotationTarget.TYPE|)) public final annotation class Ann : R|kotlin/Annotation| { public constructor(): R|Ann| { diff --git a/compiler/fir/analysis-tests/testData/resolve/suppress/withSuppression.kt b/compiler/fir/analysis-tests/testData/resolve/suppress/withSuppression.kt index 1dd58387f87..bd30c021a78 100644 --- a/compiler/fir/analysis-tests/testData/resolve/suppress/withSuppression.kt +++ b/compiler/fir/analysis-tests/testData/resolve/suppress/withSuppression.kt @@ -4,7 +4,7 @@ const val x = "123" val y = "789" -const val z = @Suppress("CONST_VAL_WITH_NON_CONST_INITIALIZER") y +const val z = @Suppress("NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION") y @Target(AnnotationTarget.TYPE) annotation class Ann diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstPropertyChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstPropertyChecker.kt index 2738f71266a..df7047c76fa 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstPropertyChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstPropertyChecker.kt @@ -7,16 +7,17 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.fir.analysis.checkers.canBeUsedForConstVal import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext -import org.jetbrains.kotlin.fir.analysis.checkers.getModifier import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.diagnostics.reportOn -import org.jetbrains.kotlin.fir.analysis.checkers.canBeEvaluatedAtCompileTime +import org.jetbrains.kotlin.fir.analysis.checkers.* +import org.jetbrains.kotlin.fir.analysis.checkers.ConstantArgumentKind +import org.jetbrains.kotlin.fir.analysis.checkers.checkConstantArguments import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.utils.isConst +import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.types.ConeErrorType import org.jetbrains.kotlin.fir.types.coneType @@ -62,8 +63,11 @@ object FirConstPropertyChecker : FirPropertyChecker() { return } - if (!canBeEvaluatedAtCompileTime(initializer, context.session)) { - reporter.reportOn(initializer.source, FirErrors.CONST_VAL_WITH_NON_CONST_INITIALIZER, context) + val errorKind = when (checkConstantArguments(initializer, context.session)) { + null -> return + ConstantArgumentKind.NOT_CONST_VAL_IN_CONST_EXPRESSION -> FirErrors.NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION + else -> FirErrors.CONST_VAL_WITH_NON_CONST_INITIALIZER } + reporter.reportOn(initializer.source, errorKind, context) } } diff --git a/compiler/testData/diagnostics/tests/modifiers/const/binaryLogic.fir.kt b/compiler/testData/diagnostics/tests/modifiers/const/binaryLogic.fir.kt index 1c400e64d03..04e7d1cc19f 100644 --- a/compiler/testData/diagnostics/tests/modifiers/const/binaryLogic.fir.kt +++ b/compiler/testData/diagnostics/tests/modifiers/const/binaryLogic.fir.kt @@ -2,11 +2,11 @@ val nonConstBool = true const val constBool = false const val andExpr1 = true && false -const val andExpr2 = nonConstBool && false +const val andExpr2 = nonConstBool && false const val andExpr3 = true && constBool -const val andExpr4 = nonConstBool && constBool +const val andExpr4 = nonConstBool && constBool const val orExpr1 = true || false -const val orExpr2 = nonConstBool || false +const val orExpr2 = nonConstBool || false const val orExpr3 = true || constBool -const val orExpr4 = nonConstBool || constBool +const val orExpr4 = nonConstBool || constBool diff --git a/compiler/testData/diagnostics/tests/modifiers/const/complexBooleanInStringConcat_after.fir.kt b/compiler/testData/diagnostics/tests/modifiers/const/complexBooleanInStringConcat_after.fir.kt index a9f42f601f6..cf0b8faa855 100644 --- a/compiler/testData/diagnostics/tests/modifiers/const/complexBooleanInStringConcat_after.fir.kt +++ b/compiler/testData/diagnostics/tests/modifiers/const/complexBooleanInStringConcat_after.fir.kt @@ -4,5 +4,5 @@ val nonConstBool = true const val constBool = false const val s1 = """ ${ true && false } """ -const val s2 = """ ${ nonConstBool && false } """ +const val s2 = """ ${ nonConstBool && false } """ const val s3 = """ ${ constBool && false } """ diff --git a/compiler/testData/diagnostics/tests/modifiers/const/complexBooleanInStringConcat_before.fir.kt b/compiler/testData/diagnostics/tests/modifiers/const/complexBooleanInStringConcat_before.fir.kt deleted file mode 100644 index 8b6c35f7f87..00000000000 --- a/compiler/testData/diagnostics/tests/modifiers/const/complexBooleanInStringConcat_before.fir.kt +++ /dev/null @@ -1,8 +0,0 @@ -// LANGUAGE: -ProhibitSimplificationOfNonTrivialConstBooleanExpressions - -val nonConstBool = true -const val constBool = false - -const val s1 = """ ${ true && false } """ -const val s2 = """ ${ nonConstBool && false } """ -const val s3 = """ ${ constBool && false } """ diff --git a/compiler/testData/diagnostics/tests/modifiers/const/complexBooleanInStringConcat_before.kt b/compiler/testData/diagnostics/tests/modifiers/const/complexBooleanInStringConcat_before.kt index e98de25dd0b..c957fbb7def 100644 --- a/compiler/testData/diagnostics/tests/modifiers/const/complexBooleanInStringConcat_before.kt +++ b/compiler/testData/diagnostics/tests/modifiers/const/complexBooleanInStringConcat_before.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // LANGUAGE: -ProhibitSimplificationOfNonTrivialConstBooleanExpressions val nonConstBool = true diff --git a/compiler/testData/diagnostics/tests/modifiers/const/ifConstVal_after.fir.kt b/compiler/testData/diagnostics/tests/modifiers/const/ifConstVal_after.fir.kt index af6049a21a9..bc2d3d2a553 100644 --- a/compiler/testData/diagnostics/tests/modifiers/const/ifConstVal_after.fir.kt +++ b/compiler/testData/diagnostics/tests/modifiers/const/ifConstVal_after.fir.kt @@ -20,5 +20,5 @@ const val withWhen3 = when(value) { const val multibranchIf = if (value == 100) 1 else if (value == 1000) 2 else 3 val nonConstFlag = true -const val errorConstIf = if (nonConstFlag) 1 else 2 -const val errorBranch = if (flag) nonConstFlag else false +const val errorConstIf = if (nonConstFlag) 1 else 2 +const val errorBranch = if (flag) nonConstFlag else false diff --git a/compiler/testData/diagnostics/tests/modifiers/const/stringConcatenation.fir.kt b/compiler/testData/diagnostics/tests/modifiers/const/stringConcatenation.fir.kt deleted file mode 100644 index 5daca058981..00000000000 --- a/compiler/testData/diagnostics/tests/modifiers/const/stringConcatenation.fir.kt +++ /dev/null @@ -1,16 +0,0 @@ -const val simple = "O${'K'} ${1.toLong() + 2.0}" -const val withInnerConcatenation = "1 ${"2 ${3} ${4} 5"} 6" - -object A -object B { - override fun toString(): String = "B" -} - -const val printA = "A: $A" -const val printB = "B: $B" - -const val withNull = "1 ${null}" -const val withNullPlus = "1" + null - -val nonConst = 0 -const val withNonConst = "A $nonConst B" diff --git a/compiler/testData/diagnostics/tests/modifiers/const/stringConcatenation.kt b/compiler/testData/diagnostics/tests/modifiers/const/stringConcatenation.kt index b164029b4ae..1233e20ed1a 100644 --- a/compiler/testData/diagnostics/tests/modifiers/const/stringConcatenation.kt +++ b/compiler/testData/diagnostics/tests/modifiers/const/stringConcatenation.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL const val simple = "O${'K'} ${1.toLong() + 2.0}" const val withInnerConcatenation = "1 ${"2 ${3} ${4} 5"} 6" diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/useOfNonConstVal.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/useOfNonConstVal.fir.kt deleted file mode 100644 index ae4cd577d53..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/useOfNonConstVal.fir.kt +++ /dev/null @@ -1,16 +0,0 @@ -val nonConst = 1 - -const val constConst = nonConst * nonConst + 2 - -annotation class Ann(val x: Int, val y: String) - -@Ann(nonConst, "${nonConst}") -fun foo1() {} - -@Ann(nonConst + constConst, "${constConst}") -fun foo2() {} - -annotation class ArrayAnn(val x: IntArray) - -@ArrayAnn(intArrayOf(1, constConst, nonConst)) -fun foo3() {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/useOfNonConstVal.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/useOfNonConstVal.kt index d09b0f4cb55..cf3a428623e 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/useOfNonConstVal.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/useOfNonConstVal.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL val nonConst = 1 const val constConst = nonConst * nonConst + 2