From e74141ded6e9672078d3b71632dc8f47ae5e07b7 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Tue, 11 May 2021 18:24:25 +0300 Subject: [PATCH] [FIR] Properly check spread constant argument --- .../checkers/expression/FirAnnotationArgumentChecker.kt | 8 +++++--- ...nNonConstSingleArrayElementAsVarargInAnnotation.fir.kt | 2 +- ...onstSingleArrayElementAsVarargInAnnotationError.fir.kt | 2 +- .../annotationParameterMustBeConstant/vararg.fir.kt | 8 ++++---- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAnnotationArgumentChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAnnotationArgumentChecker.kt index 9047a062549..6d6f96a5f76 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAnnotationArgumentChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirAnnotationArgumentChecker.kt @@ -80,9 +80,11 @@ object FirAnnotationArgumentChecker : FirAnnotationCallChecker() { if (usedNonConst) return FirErrors.NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION } is FirVarargArgumentsExpression -> { - for (arg in expression.arguments) - checkAnnotationArgumentWithSubElements(arg, fqName, session, reporter, context) - ?.let { reporter.reportOn(arg.source, it, context) } + for (arg in expression.arguments) { + val unwrappedArg = if (arg is FirSpreadArgumentExpression) arg.expression else arg + checkAnnotationArgumentWithSubElements(unwrappedArg, fqName, session, reporter, context) + ?.let { reporter.reportOn(unwrappedArg.source, it, context) } + } } else -> { val error = when (checkConstantArguments(expression, session)) { diff --git a/compiler/testData/diagnostics/tests/varargs/assignNonConstSingleArrayElementAsVarargInAnnotation.fir.kt b/compiler/testData/diagnostics/tests/varargs/assignNonConstSingleArrayElementAsVarargInAnnotation.fir.kt index a497f672850..c2c506d90bb 100644 --- a/compiler/testData/diagnostics/tests/varargs/assignNonConstSingleArrayElementAsVarargInAnnotation.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/assignNonConstSingleArrayElementAsVarargInAnnotation.fir.kt @@ -22,5 +22,5 @@ fun foo4() {} @Anno(value = *nonConstArray) fun bar1() {} -@Anno(*nonConstArray) +@Anno(*nonConstArray) fun bar2() {} diff --git a/compiler/testData/diagnostics/tests/varargs/assignNonConstSingleArrayElementAsVarargInAnnotationError.fir.kt b/compiler/testData/diagnostics/tests/varargs/assignNonConstSingleArrayElementAsVarargInAnnotationError.fir.kt index 2f9fa270f42..b7a6af9478c 100644 --- a/compiler/testData/diagnostics/tests/varargs/assignNonConstSingleArrayElementAsVarargInAnnotationError.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/assignNonConstSingleArrayElementAsVarargInAnnotationError.fir.kt @@ -22,5 +22,5 @@ fun foo4() {} @Anno(value = *nonConstArray) fun bar1() {} -@Anno(*nonConstArray) +@Anno(*nonConstArray) fun bar2() {} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/vararg.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/vararg.fir.kt index 76eabfc83a1..ac380240bc3 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/vararg.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameterMustBeConstant/vararg.fir.kt @@ -6,10 +6,10 @@ annotation class Ann(vararg val i: Int) @Ann(i2) @Ann(i3) @Ann(i, i2, i3) -@Ann(*intArrayOf(i)) +@Ann(*intArrayOf(i)) @Ann(*intArrayOf(i2)) -@Ann(*intArrayOf(i3)) -@Ann(*intArrayOf(i, i2, i3)) +@Ann(*intArrayOf(i3)) +@Ann(*intArrayOf(i, i2, i3)) class Test var i = 1 @@ -22,6 +22,6 @@ fun foo(): Int = 1 @Repeatable annotation class AnnAnn(vararg val i: Ann) @AnnAnn(*arrayOf(Ann(1))) -@AnnAnn(*arrayOf(iAnn)) +@AnnAnn(*arrayOf(iAnn)) class TestAnn val iAnn = Ann(1)