From c656a83a028dd5709e194ebd1b4e1ca763ab889b Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Mon, 30 Oct 2023 11:42:47 +0200 Subject: [PATCH] [FIR] Don't miss non-const annotation args This code with `b()` crashes the JVM backend. ^KT-59822 Fixed ^KT-59874 --- .../fir/analysis/checkers/FirConstChecks.kt | 10 +----- .../RecursivelyAnnotatedProperty.fir.kt | 5 +++ .../RecursivelyAnnotatedProperty.kt | 3 +- ...nnotationOnFunctionInsideLocalClass.fir.kt | 4 +-- ...OnFunctionParameterTypeInsideLocalClass.kt | 2 +- ...tionOnPropertyFieldInsideLocalClass.fir.kt | 15 --------- ...notationOnPropertyFieldInsideLocalClass.kt | 1 + ...nnotationOnPropertyInsideLocalClass.fir.kt | 8 ++--- ...erParameterFunctionInsideLocalClass.fir.kt | 2 +- ...OnTypeParameterFunctionInsideLocalClass.kt | 2 +- .../annotationOnConstructors.fir.kt | 8 ++--- .../simple.fir.kt | 31 +++++++++++++++++++ .../simple.kt | 1 - 13 files changed, 52 insertions(+), 40 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedProperty.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnPropertyFieldInsideLocalClass.fir.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/simple.fir.kt 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 bf36de56d5d..a19ab2f2ae5 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 @@ -140,11 +140,6 @@ internal fun checkConstantArguments( return ConstantArgumentKind.NOT_KCLASS_LITERAL } - //TODO, KT-59822: UNRESOLVED REFERENCE - if (expression.dispatchReceiver is FirThisReceiverExpression) { - return null - } - if (calleeReference !is FirResolvedNamedReference) return ConstantArgumentKind.NOT_CONST val symbol = calleeReference.resolvedSymbol as? FirNamedFunctionSymbol ?: return ConstantArgumentKind.NOT_CONST @@ -183,11 +178,8 @@ internal fun checkConstantArguments( val receiver = listOf(expression.dispatchReceiver, expression.extensionReceiver).single { it != null }!! return checkConstantArguments(receiver, session) } - propertySymbol.isLocal || propertySymbol.callableId.className?.isRoot == false -> return ConstantArgumentKind.NOT_CONST + propertySymbol.isLocal -> return ConstantArgumentKind.NOT_CONST expressionType.fullyExpandedClassId(session) == StandardClassIds.KClass -> return ConstantArgumentKind.NOT_KCLASS_LITERAL - - //TODO, KT-59822: UNRESOLVED REFERENCE - expression.dispatchReceiver is FirThisReceiverExpression -> return null } return when (property.initializer) { is FirConstExpression<*> -> when { diff --git a/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedProperty.fir.kt b/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedProperty.fir.kt new file mode 100644 index 00000000000..e58e2c50ba8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedProperty.fir.kt @@ -0,0 +1,5 @@ +// Properties can be recursively annotated +annotation class ann(val x: Int) +class My { + @ann(x) val x: Int = 1 +} diff --git a/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedProperty.kt b/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedProperty.kt index cb0fff775d8..3631b59a60f 100644 --- a/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedProperty.kt +++ b/compiler/testData/diagnostics/tests/annotations/RecursivelyAnnotatedProperty.kt @@ -1,6 +1,5 @@ -// FIR_IDENTICAL // Properties can be recursively annotated annotation class ann(val x: Int) class My { @ann(x) val x: Int = 1 -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnFunctionInsideLocalClass.fir.kt b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnFunctionInsideLocalClass.fir.kt index 1bb1eb2779f..4299d820c31 100644 --- a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnFunctionInsideLocalClass.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnFunctionInsideLocalClass.fir.kt @@ -4,7 +4,7 @@ annotation class Anno(val number: Int) fun topLevelFun() { class LocalClass { - @Anno(function(42)) - fun function(@Anno(function(24)) param: Int = function(0)) = 1 + @Anno(function(42)) + fun function(@Anno(function(24)) param: Int = function(0)) = 1 } } diff --git a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnFunctionParameterTypeInsideLocalClass.kt b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnFunctionParameterTypeInsideLocalClass.kt index fed7b8dad0c..4ecba334a9e 100644 --- a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnFunctionParameterTypeInsideLocalClass.kt +++ b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnFunctionParameterTypeInsideLocalClass.kt @@ -6,6 +6,6 @@ annotation class Anno(val number: Int) fun topLevelFun() { class LocalClass { - fun function(param: @Anno(function(42)) Int) = 1 + fun function(param: @Anno(function(42)) Int) = 1 } } diff --git a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnPropertyFieldInsideLocalClass.fir.kt b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnPropertyFieldInsideLocalClass.fir.kt deleted file mode 100644 index 6a379af541c..00000000000 --- a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnPropertyFieldInsideLocalClass.fir.kt +++ /dev/null @@ -1,15 +0,0 @@ -package myPack - -annotation class Anno(val number: String) - -fun topLevelFun() { - class LocalClass { - @Anno(variableToResolve) - @field:Anno(variableToResolve) - var variableToResolve = "${42}" - @Anno(variableToResolve) - get() = field + "str" - @Anno(variableToResolve) - set(@Anno(variableToResolve) value) = Unit - } -} diff --git a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnPropertyFieldInsideLocalClass.kt b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnPropertyFieldInsideLocalClass.kt index 448dd668b27..726b7747491 100644 --- a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnPropertyFieldInsideLocalClass.kt +++ b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnPropertyFieldInsideLocalClass.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL package myPack annotation class Anno(val number: String) diff --git a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnPropertyInsideLocalClass.fir.kt b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnPropertyInsideLocalClass.fir.kt index 482665daf3f..c8bacb24fcc 100644 --- a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnPropertyInsideLocalClass.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnPropertyInsideLocalClass.fir.kt @@ -4,11 +4,11 @@ annotation class Anno(val number: Int) fun topLevel() { class LocalClass { - @Anno(prop) + @Anno(prop) var prop - @Anno(prop) + @Anno(prop) get() = 22 - @Anno(prop) - set(@Anno(prop) value) = Unit + @Anno(prop) + set(@Anno(prop) value) = Unit } } diff --git a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnReceiverParameterFunctionInsideLocalClass.fir.kt b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnReceiverParameterFunctionInsideLocalClass.fir.kt index b90b5d0a8d5..6d58d2d6607 100644 --- a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnReceiverParameterFunctionInsideLocalClass.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnReceiverParameterFunctionInsideLocalClass.fir.kt @@ -4,6 +4,6 @@ annotation class Anno(val number: Int) fun topLevelFun() { class LocalClass { - fun @receiver:Anno(42.function()) Int.function() = 1 + fun @receiver:Anno(42.function()) Int.function() = 1 } } diff --git a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnTypeParameterFunctionInsideLocalClass.kt b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnTypeParameterFunctionInsideLocalClass.kt index 5a583763126..d34bdefa6e9 100644 --- a/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnTypeParameterFunctionInsideLocalClass.kt +++ b/compiler/testData/diagnostics/tests/annotations/cycleAnnotationOnTypeParameterFunctionInsideLocalClass.kt @@ -6,6 +6,6 @@ annotation class Anno(val number: Int) fun topLevelFun() { class LocalClass { - fun <@Anno(function()) T> function() = 1 + fun <@Anno(function()) T> function() = 1 } } diff --git a/compiler/testData/diagnostics/tests/scopes/classHeader/annotationOnConstructors.fir.kt b/compiler/testData/diagnostics/tests/scopes/classHeader/annotationOnConstructors.fir.kt index 1fa3d69969f..e1dafd8b68b 100644 --- a/compiler/testData/diagnostics/tests/scopes/classHeader/annotationOnConstructors.fir.kt +++ b/compiler/testData/diagnostics/tests/scopes/classHeader/annotationOnConstructors.fir.kt @@ -23,8 +23,8 @@ class A Companion.CONST, Nested.CONST, Interface.CONST, - a, - b() + a, + b() ) constructor() { @@ -36,8 +36,8 @@ constructor() { Companion.CONST, Nested.CONST, Interface.CONST, - a, - b() + a, + b() ) constructor(dummy: Int) : this() diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/simple.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/simple.fir.kt new file mode 100644 index 00000000000..31e7b7a790f --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/simple.fir.kt @@ -0,0 +1,31 @@ +@Retention(AnnotationRetention.SOURCE) +@Repeatable +annotation class Ann(val i: Int) +annotation class AnnIA(val ia: IntArray) +annotation class AnnSA(val sa: Array) + +var i = 1 + +@Ann(MyClass().i) +@Ann(i) +@Ann(i2) +@AnnIA(ia) +@AnnSA(sa) +class Test { + val i = 1 + @Ann(i) val i2 = 1 +} + +val i2 = foo() + +fun foo(): Int = 1 + +@AnnSA(emptyArray()) +class MyClass { + val i = 1 +} + +val ia: IntArray = intArrayOf(1, 2) +val sa: Array = arrayOf("a", "b") + +annotation class Ann2 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/simple.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/simple.kt index abfe6a4a925..68c9292c248 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/simple.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/simple.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL @Retention(AnnotationRetention.SOURCE) @Repeatable annotation class Ann(val i: Int)