diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt index 5d93a4b9648..b1845be08c6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.resolve.constants.CompileTimeConstantChecker import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver +import org.jetbrains.kotlin.utils.addToStdlib.safeAs class DiagnosticReporterByTrackingStrategy( val constantExpressionEvaluator: ConstantExpressionEvaluator, @@ -105,6 +106,13 @@ class DiagnosticReporterByTrackingStrategy( } VarargArgumentOutsideParentheses::class.java -> trace.report(VARARG_OUTSIDE_PARENTHESES.on(callArgument.psiExpression!!)) + + SpreadArgumentToNonVarargParameter::class.java -> { + val spreadElement = callArgument.safeAs()?.valueArgument?.getSpreadElement() + if (spreadElement != null) { + trace.report(NON_VARARG_SPREAD.on(spreadElement)) + } + } } } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt index ac09a3cb0e0..e973967ca3c 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt @@ -109,6 +109,19 @@ internal object ArgumentsToCandidateParameterDescriptor : ResolutionPart() { } } +internal object CheckSpreadArgumentToNonVarargParameter : ResolutionPart() { + override fun KotlinResolutionCandidate.process(workIndex: Int) { + for ((_, resolvedCallArgument) in resolvedCall.argumentMappingByOriginal) { + for (argument in resolvedCallArgument.arguments) { + val valueParameter = resolvedCall.argumentToCandidateParameter[argument] ?: continue + if (argument.isSpread && !valueParameter.isVararg) { + addDiagnostic(SpreadArgumentToNonVarargParameter(argument)) + } + } + } + } +} + internal object NoArguments : ResolutionPart() { override fun KotlinResolutionCandidate.process(workIndex: Int) { assert(kotlinCall.argumentsInParenthesis.isEmpty()) { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnistics.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnistics.kt index c0b7280dd5c..d140ba683f5 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnistics.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnistics.kt @@ -156,6 +156,12 @@ object AbstractSuperCall : KotlinCallDiagnostic(RUNTIME_ERROR) { } } +class SpreadArgumentToNonVarargParameter(val argument: KotlinCallArgument) : KotlinCallDiagnostic(RUNTIME_ERROR) { + override fun report(reporter: DiagnosticReporter) { + reporter.onCallArgument(argument, this) + } +} + // candidates result class NoneCandidatesCallDiagnostic(val kotlinCall: KotlinCall) : KotlinCallDiagnostic(INAPPLICABLE) { override fun report(reporter: DiagnosticReporter) { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt index ba481b4cca7..fa29c143bba 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt @@ -181,7 +181,8 @@ enum class KotlinCallKind(vararg resolutionPart: ResolutionPart) { CheckExplicitReceiverKindConsistency, CheckReceivers, CheckArguments, - CheckExternalArgument + CheckExternalArgument, + CheckSpreadArgumentToNonVarargParameter ), UNSUPPORTED();