diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ImplicitIntegerCoercion.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ImplicitIntegerCoercion.kt index 545102eca14..49d9f63d6ad 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/ImplicitIntegerCoercion.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/ImplicitIntegerCoercion.kt @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.resolve +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.name.FqName @@ -12,13 +14,10 @@ object ImplicitIntegerCoercion { val MODULE_CAPABILITY = ModuleCapability("ImplicitIntegerCoercion") - fun isEnabledForParameter(descriptor: ParameterDescriptor): Boolean = isEnabledFor(descriptor) - - fun isEnabledForConstVal(descriptor: VariableDescriptor): Boolean = isEnabledFor(descriptor) - - private fun isEnabledFor(descriptor: DeclarationDescriptor): Boolean = + fun isEnabledFor(descriptor: DeclarationDescriptor, languageVersionSettings: LanguageVersionSettings): Boolean = descriptor.hasImplicitIntegerCoercionAnnotation() || - DescriptorUtils.getContainingModuleOrNull(descriptor)?.hasImplicitIntegerCoercionCapability() == true + (languageVersionSettings.supportsFeature(LanguageFeature.ImplicitSignedToUnsignedIntegerConversion) && + DescriptorUtils.getContainingModuleOrNull(descriptor)?.hasImplicitIntegerCoercionCapability() == true) private val IMPLICIT_INTEGER_COERCION_ANNOTATION_FQ_NAME = FqName("kotlin.internal.ImplicitIntegerCoercion") diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt index 86725c05fe7..56743e45994 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt @@ -369,7 +369,7 @@ class CallCompleter( updatedType = argumentTypeResolver.updateResultArgumentTypeIfNotDenotable(context, expression) ?: updatedType } - if (parameter != null && ImplicitIntegerCoercion.isEnabledForParameter(parameter)) { + if (parameter != null && ImplicitIntegerCoercion.isEnabledFor(parameter, context.languageVersionSettings)) { val argumentCompileTimeValue = context.trace[BindingContext.COMPILE_TIME_VALUE, deparenthesized] if (argumentCompileTimeValue != null && argumentCompileTimeValue.parameters.isConvertableConstVal) { val generalNumberType = createTypeForConvertableConstant(argumentCompileTimeValue) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt index 45e2285315a..e876203f135 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/KotlinToResolvedCallTransformer.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.extensions.internal.CandidateInterceptor import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.* +import org.jetbrains.kotlin.resolve.ImplicitIntegerCoercion.isEnabledFor import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver import org.jetbrains.kotlin.resolve.calls.CallTransformer import org.jetbrains.kotlin.resolve.calls.DiagnosticReporterByTrackingStrategy @@ -370,7 +371,7 @@ class KotlinToResolvedCallTransformer( var reportErrorDuringTypeCheck = reportErrorForTypeMismatch - if (parameter != null && ImplicitIntegerCoercion.isEnabledForParameter(parameter)) { + if (parameter != null && isEnabledFor(parameter, context.languageVersionSettings)) { val argumentCompileTimeValue = context.trace[BindingContext.COMPILE_TIME_VALUE, deparenthesized] if (argumentCompileTimeValue != null && argumentCompileTimeValue.parameters.isConvertableConstVal) { val generalNumberType = createTypeForConvertableConstant(argumentCompileTimeValue) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt index 3aed3aaee13..a3068520745 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/constants/evaluate/ConstantExpressionEvaluator.kt @@ -823,7 +823,7 @@ private class ConstantExpressionEvaluatorVisitor( val isConvertableConstVal = callableDescriptor.isConst && - ImplicitIntegerCoercion.isEnabledForConstVal(callableDescriptor) && + ImplicitIntegerCoercion.isEnabledFor(callableDescriptor, languageVersionSettings) && callableDescriptor.compileTimeInitializer is IntValue return callableDescriptor.compileTimeInitializer?.wrap( diff --git a/compiler/testData/diagnostics/tests/unsignedTypes/conversions/conversionOfSignedToUnsigned.fir.kt b/compiler/testData/diagnostics/tests/unsignedTypes/conversions/conversionOfSignedToUnsigned.fir.kt index 21d36c3c73f..55391a41cfa 100644 --- a/compiler/testData/diagnostics/tests/unsignedTypes/conversions/conversionOfSignedToUnsigned.fir.kt +++ b/compiler/testData/diagnostics/tests/unsignedTypes/conversions/conversionOfSignedToUnsigned.fir.kt @@ -1,4 +1,5 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER +// !LANGUAGE: +ImplicitSignedToUnsignedIntegerConversion // ALLOW_KOTLIN_PACKAGE // FILE: annotation.kt diff --git a/compiler/testData/diagnostics/tests/unsignedTypes/conversions/conversionOfSignedToUnsigned.kt b/compiler/testData/diagnostics/tests/unsignedTypes/conversions/conversionOfSignedToUnsigned.kt index ddf89ecf53a..119ed9c860b 100644 --- a/compiler/testData/diagnostics/tests/unsignedTypes/conversions/conversionOfSignedToUnsigned.kt +++ b/compiler/testData/diagnostics/tests/unsignedTypes/conversions/conversionOfSignedToUnsigned.kt @@ -1,4 +1,5 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER +// !LANGUAGE: +ImplicitSignedToUnsignedIntegerConversion // ALLOW_KOTLIN_PACKAGE // FILE: annotation.kt diff --git a/compiler/testData/ir/irText/expressions/signedToUnsignedConversions.kt b/compiler/testData/ir/irText/expressions/signedToUnsignedConversions.kt index c5d2730d9cd..c97e5ee1427 100644 --- a/compiler/testData/ir/irText/expressions/signedToUnsignedConversions.kt +++ b/compiler/testData/ir/irText/expressions/signedToUnsignedConversions.kt @@ -1,5 +1,6 @@ // IGNORE_BACKEND_K2: JVM_IR // WITH_STDLIB +// !LANGUAGE: +ImplicitSignedToUnsignedIntegerConversion // FILE: signedToUnsignedConversions_annotation.kt diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index b73e4cb78ac..250a980b5db 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -327,6 +327,7 @@ enum class LanguageFeature( InlineLateinit(sinceVersion = null, kind = OTHER), // KT-23814 EnableDfaWarningsInK2(sinceVersion = null, kind = OTHER), // KT-50965 ContractSyntaxV2(sinceVersion = null, kind = UNSTABLE_FEATURE), // KT-56127 + ImplicitSignedToUnsignedIntegerConversion(sinceVersion = null), // KT-56583 ; init { diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/CompileTimeConstant.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/CompileTimeConstant.kt index 538e6cbc67d..7e6b8f5f30c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/CompileTimeConstant.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/constants/CompileTimeConstant.kt @@ -57,7 +57,8 @@ interface CompileTimeConstant { val isUnsignedLongNumberLiteral: Boolean, val usesVariableAsConstant: Boolean, val usesNonConstValAsConstant: Boolean, - // `isConvertableConstVal` means that this is `const val` that has `ImplicitIntegerCoercion` annotation + // `isConvertableConstVal` means that this is `const val` that can participate in signed to unsigned conversion + // see LanguageFeature.ImplicitSignedToUnsignedIntegerConversion val isConvertableConstVal: Boolean )