diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignatureForResolvedCall.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignatureForResolvedCall.kt index 51f4ee9b366..41b98a78acf 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignatureForResolvedCall.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignatureForResolvedCall.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve.calls.results import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.psi.ValueArgument import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilderImpl @@ -52,9 +53,11 @@ fun > RC.createFlatSignature(): FlatSignature { fun createOverloadingConflictResolver( builtIns: KotlinBuiltIns, + module: ModuleDescriptor, specificityComparator: TypeSpecificityComparator ) = OverloadingConflictResolver( builtIns, + module, specificityComparator, MutableResolvedCall<*>::getResultingDescriptor, ConstraintSystemBuilderImpl.Companion::forSpecificity, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/ResolutionResultsHandler.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/ResolutionResultsHandler.java index 3e0ea6f84d7..584f28c6c65 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/ResolutionResultsHandler.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/ResolutionResultsHandler.java @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.config.LanguageFeature; import org.jetbrains.kotlin.config.LanguageVersionSettings; import org.jetbrains.kotlin.descriptors.CallableDescriptor; +import org.jetbrains.kotlin.descriptors.ModuleDescriptor; import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt; import org.jetbrains.kotlin.resolve.calls.context.CallResolutionContext; @@ -40,9 +41,12 @@ public class ResolutionResultsHandler { public ResolutionResultsHandler( @NotNull KotlinBuiltIns builtIns, + @NotNull ModuleDescriptor module, @NotNull TypeSpecificityComparator specificityComparator ) { - overloadingConflictResolver = FlatSignatureForResolvedCallKt.createOverloadingConflictResolver(builtIns, specificityComparator); + overloadingConflictResolver = FlatSignatureForResolvedCallKt.createOverloadingConflictResolver( + builtIns, module, specificityComparator + ); } @NotNull diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt index 7e0d4955053..46d47229213 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/CallableReferenceResolver.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve.calls.components import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.resolve.calls.context.CheckArgumentTypesMode import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemOperation @@ -33,11 +34,13 @@ import org.jetbrains.kotlin.types.UnwrappedType class CallableReferenceOverloadConflictResolver( builtIns: KotlinBuiltIns, + module: ModuleDescriptor, specificityComparator: TypeSpecificityComparator, statelessCallbacks: KotlinResolutionStatelessCallbacks, constraintInjector: ConstraintInjector ) : OverloadingConflictResolver( builtIns, + module, specificityComparator, { it.candidate }, { SimpleConstraintSystemImpl(constraintInjector, builtIns) }, diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/NewOverloadingConflictResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/NewOverloadingConflictResolver.kt index 5060eb87ad7..94b0fccaf12 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/NewOverloadingConflictResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/NewOverloadingConflictResolver.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve.calls.components import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintInjector import org.jetbrains.kotlin.resolve.calls.inference.components.SimpleConstraintSystemImpl import org.jetbrains.kotlin.resolve.calls.model.KotlinCallArgument @@ -30,11 +31,13 @@ import java.util.* class NewOverloadingConflictResolver( builtIns: KotlinBuiltIns, + module: ModuleDescriptor, specificityComparator: TypeSpecificityComparator, statelessCallbacks: KotlinResolutionStatelessCallbacks, constraintInjector: ConstraintInjector ) : OverloadingConflictResolver( builtIns, + module, specificityComparator, { // todo investigate diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt index de7fef42e45..889ea6a4289 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/OverloadingConflictResolver.kt @@ -19,10 +19,8 @@ package org.jetbrains.kotlin.resolve.calls.results import gnu.trove.THashSet import gnu.trove.TObjectHashingStrategy import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.descriptors.CallableDescriptor -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.ScriptDescriptor -import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.builtins.UnsignedTypes +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.synthetic.SyntheticMemberDescriptor import org.jetbrains.kotlin.resolve.DescriptorEquivalenceForOverrides import org.jetbrains.kotlin.resolve.OverridingUtil @@ -34,6 +32,7 @@ import java.util.* open class OverloadingConflictResolver( private val builtIns: KotlinBuiltIns, + private val module: ModuleDescriptor, private val specificityComparator: TypeSpecificityComparator, private val getResultingDescriptor: (C) -> CallableDescriptor, private val createEmptyConstraintSystem: () -> SimpleConstraintSystem, @@ -280,11 +279,35 @@ open class OverloadingConflictResolver( override fun isNonSubtypeNotLessSpecific(specific: KotlinType, general: KotlinType): Boolean { val _double = builtIns.doubleType val _float = builtIns.floatType - val _long = builtIns.longType - val _int = builtIns.intType - val _byte = builtIns.byteType - val _short = builtIns.shortType + if (UnsignedTypes.isUnsignedType(specific) && UnsignedTypes.isUnsignedType(general)) { + val uLong = module.findClassAcrossModuleDependencies(KotlinBuiltIns.FQ_NAMES.uLong)?.defaultType ?: return false + val uInt = module.findClassAcrossModuleDependencies(KotlinBuiltIns.FQ_NAMES.uInt)?.defaultType ?: return false + val uByte = module.findClassAcrossModuleDependencies(KotlinBuiltIns.FQ_NAMES.uByte)?.defaultType ?: return false + val uShort = module.findClassAcrossModuleDependencies(KotlinBuiltIns.FQ_NAMES.uShort)?.defaultType ?: return false + + return isNonSubtypeNotLessSpecific(specific, general, _double, _float, uLong, uInt, uByte, uShort) + } else { + val _long = builtIns.longType + val _int = builtIns.intType + val _byte = builtIns.byteType + val _short = builtIns.shortType + + return isNonSubtypeNotLessSpecific(specific, general, _double, _float, _long, _int, _byte, _short) + } + + } + + private fun isNonSubtypeNotLessSpecific( + specific: KotlinType, + general: KotlinType, + _double: KotlinType, + _float: KotlinType, + _long: KotlinType, + _int: KotlinType, + _byte: KotlinType, + _short: KotlinType + ): Boolean { when { TypeUtils.equalTypes(specific, _double) && TypeUtils.equalTypes(general, _float) -> return true TypeUtils.equalTypes(specific, _int) -> { diff --git a/compiler/testData/diagnostics/testsWithUnsignedTypes/overloadResolutionOfBasicOperations.kt b/compiler/testData/diagnostics/testsWithUnsignedTypes/overloadResolutionOfBasicOperations.kt new file mode 100644 index 00000000000..44e99c0cfde --- /dev/null +++ b/compiler/testData/diagnostics/testsWithUnsignedTypes/overloadResolutionOfBasicOperations.kt @@ -0,0 +1,8 @@ +// !LANGUAGE: +InlineClasses +// !SKIP_METADATA_VERSION_CHECK +// !DIAGNOSTICS: -UNUSED_VARIABLE + +fun test() { + val x: UInt = 1u + 2u + val y = 2u + 3u +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithUnsignedTypes/overloadResolutionOfBasicOperations.txt b/compiler/testData/diagnostics/testsWithUnsignedTypes/overloadResolutionOfBasicOperations.txt new file mode 100644 index 00000000000..93e27f34c8c --- /dev/null +++ b/compiler/testData/diagnostics/testsWithUnsignedTypes/overloadResolutionOfBasicOperations.txt @@ -0,0 +1,3 @@ +package + +public fun test(): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithUnsignedTypesGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithUnsignedTypesGenerated.java index 076ce4320e3..2b67c159938 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithUnsignedTypesGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithUnsignedTypesGenerated.java @@ -29,6 +29,11 @@ public class DiagnosticsWithUnsignedTypesGenerated extends AbstractDiagnosticsWi KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithUnsignedTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("overloadResolutionOfBasicOperations.kt") + public void testOverloadResolutionOfBasicOperations() throws Exception { + runTest("compiler/testData/diagnostics/testsWithUnsignedTypes/overloadResolutionOfBasicOperations.kt"); + } + @TestMetadata("unsignedLiteralsInsideConstVals.kt") public void testUnsignedLiteralsInsideConstVals() throws Exception { runTest("compiler/testData/diagnostics/testsWithUnsignedTypes/unsignedLiteralsInsideConstVals.kt");