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 2d6a3880fce..09ffcd21a2d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt @@ -62,6 +62,12 @@ class DiagnosticReporterByTrackingStrategy( val reportOn = (diagnostic as NonApplicableCallForBuilderInferenceDiagnostic).kotlinCall trace.reportDiagnosticOnce(Errors.NON_APPLICABLE_CALL_FOR_BUILDER_INFERENCE.on(reportOn.psiKotlinCall.psiCall.callElement)) } + OnlyInputTypesDiagnostic::class.java -> { + val typeVariable = (diagnostic as OnlyInputTypesDiagnostic).typeVariable as? TypeVariableFromCallableDescriptor ?: return + psiKotlinCall.psiCall.calleeExpression?.let { + trace.report(TYPE_INFERENCE_ONLY_INPUT_TYPES.on(it, typeVariable.originalTypeParameter)) + } + } } } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/MutableConstraintStorage.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/MutableConstraintStorage.kt index a62e32b5b85..0cda281a860 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/MutableConstraintStorage.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/MutableConstraintStorage.kt @@ -8,9 +8,14 @@ package org.jetbrains.kotlin.resolve.calls.inference.model import org.jetbrains.kotlin.resolve.calls.inference.trimToSize import org.jetbrains.kotlin.resolve.calls.model.KotlinCallDiagnostic import org.jetbrains.kotlin.resolve.calls.tower.isSuccess +import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.TypeConstructorMarker import org.jetbrains.kotlin.types.model.TypeVariableMarker +import org.jetbrains.kotlin.types.TypeConstructor +import org.jetbrains.kotlin.types.UnwrappedType +import org.jetbrains.kotlin.types.checker.NewCapturedType +import org.jetbrains.kotlin.types.typeUtil.unCapture import kotlin.collections.ArrayList import kotlin.collections.LinkedHashMap @@ -27,6 +32,16 @@ class MutableVariableWithConstraints( return simplifiedConstraints!! } + // see @OnlyInputTypes annotation + val projectedInputCallTypes: Collection + get() = + mutableConstraints.filter { + val position = it.position.from + position is ArgumentConstraintPosition || position is ReceiverConstraintPosition || position is ExpectedTypeConstraintPosition + }.map { + (it.type as KotlinType).unCapture().unwrap() + } + private val mutableConstraints = ArrayList(constraints) private var simplifiedConstraints: List? = null diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt index 379b4084f64..7510e22b59b 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt @@ -9,12 +9,16 @@ import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer import org.jetbrains.kotlin.resolve.calls.inference.* import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintInjector import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter -import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor import org.jetbrains.kotlin.resolve.calls.inference.components.ResultTypeResolver import org.jetbrains.kotlin.resolve.calls.model.KotlinCallDiagnostic +import org.jetbrains.kotlin.resolve.calls.model.OnlyInputTypesDiagnostic +import org.jetbrains.kotlin.types.IntersectionTypeConstructor +import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.checker.NewCapturedType +import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker import org.jetbrains.kotlin.types.model.* import org.jetbrains.kotlin.utils.SmartList +import org.jetbrains.kotlin.utils.addToStdlib.safeAs import kotlin.math.max class NewConstraintSystemImpl( @@ -247,7 +251,8 @@ class NewConstraintSystemImpl( checkState(State.BUILDING, State.COMPLETION) constraintInjector.addInitialEqualityConstraint(this, variable.defaultType(), resultType, FixVariableConstraintPosition(variable)) - notFixedTypeVariables.remove(variable.freshTypeConstructor()) + val variableWithConstraints = notFixedTypeVariables.remove(variable.freshTypeConstructor()) + checkOnlyInputTypesAnnotation(variableWithConstraints, resultType) for (variableWithConstraint in notFixedTypeVariables.values) { variableWithConstraint.removeConstrains { @@ -258,6 +263,25 @@ class NewConstraintSystemImpl( storage.fixedTypeVariables[variable.freshTypeConstructor()] = resultType } + private fun checkOnlyInputTypesAnnotation( + variableWithConstraints: MutableVariableWithConstraints?, + resultType: KotlinTypeMarker + ) { + if (resultType !is KotlinType) return + if (variableWithConstraints == null || variableWithConstraints.typeVariable.safeAs()?.hasOnlyInputTypesAnnotation() != true ) return + val projectedInputCallTypes = variableWithConstraints.projectedInputCallTypes + val resultTypeIsInputType = projectedInputCallTypes.any { inputType -> + val constructor = inputType.constructor + if (constructor is IntersectionTypeConstructor) + constructor.supertypes.any { NewKotlinTypeChecker.equalTypes(resultType, it) } + else + NewKotlinTypeChecker.equalTypes(resultType, inputType) + } + if (!resultTypeIsInputType) { + addError(OnlyInputTypesDiagnostic(variableWithConstraints.typeVariable as NewTypeVariable)) + } + } + // KotlinConstraintSystemCompleter.Context, PostponedArgumentsAnalyzer.Context override fun canBeProper(type: KotlinTypeMarker): Boolean { checkState(State.BUILDING, State.COMPLETION) diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/TypeVariable.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/TypeVariable.kt index eab9ba6fd08..973578518c8 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/TypeVariable.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/model/TypeVariable.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.resolve.calls.model.LambdaKotlinCallArgument import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns +import org.jetbrains.kotlin.resolve.descriptorUtil.hasOnlyInputTypesAnnotation import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinTypeFactory import org.jetbrains.kotlin.types.SimpleType @@ -53,15 +54,21 @@ sealed class NewTypeVariable(builtIns: KotlinBuiltIns, name: String) : TypeVaria nullable = false, memberScope = builtIns.any.unsubstitutedMemberScope ) + abstract fun hasOnlyInputTypesAnnotation(): Boolean + override fun toString() = freshTypeConstructor.toString() } class TypeVariableFromCallableDescriptor( val originalTypeParameter: TypeParameterDescriptor -) : NewTypeVariable(originalTypeParameter.builtIns, originalTypeParameter.name.identifier) +) : NewTypeVariable(originalTypeParameter.builtIns, originalTypeParameter.name.identifier) { + override fun hasOnlyInputTypesAnnotation(): Boolean = originalTypeParameter.hasOnlyInputTypesAnnotation() +} class TypeVariableForLambdaReturnType( val lambdaArgument: LambdaKotlinCallArgument, builtIns: KotlinBuiltIns, name: String -) : NewTypeVariable(builtIns, name) +) : NewTypeVariable(builtIns, name) { + override fun hasOnlyInputTypesAnnotation(): Boolean = false +} diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnostics.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnostics.kt index 75074d2226d..0d02905b2cf 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnostics.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnostics.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.resolve.calls.components.CallableReferenceCandidate +import org.jetbrains.kotlin.resolve.calls.inference.model.NewTypeVariable import org.jetbrains.kotlin.resolve.calls.tower.ResolutionCandidateApplicability.* import org.jetbrains.kotlin.types.TypeConstructor import org.jetbrains.kotlin.types.UnwrappedType @@ -195,4 +196,10 @@ class ArgumentTypeMismatchDiagnostic( override fun report(reporter: DiagnosticReporter) { reporter.onCallArgument(expressionArgument, this) } +} + +class OnlyInputTypesDiagnostic(val typeVariable: NewTypeVariable) : KotlinCallDiagnostic(INAPPLICABLE) { + override fun report(reporter: DiagnosticReporter) { + reporter.onCall(this) + } } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/cast/AsInsideIn.kt b/compiler/testData/diagnostics/testsWithStdLib/cast/AsInsideIn.kt index 503938a0425..5936a24c965 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/cast/AsInsideIn.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/cast/AsInsideIn.kt @@ -4,7 +4,7 @@ interface A class B : A fun foo1(list: List, arg: B?): Boolean { // Type mismatch - return arg in list // resolved to extension + return arg in list // resolved to extension } fun foo2(list: List, arg: B?): Boolean { // FAKE: no cast needed diff --git a/compiler/testData/diagnostics/testsWithStdLib/commonCollections.kt b/compiler/testData/diagnostics/testsWithStdLib/commonCollections.kt index 4741203490a..ae8b9739896 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/commonCollections.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/commonCollections.kt @@ -4,7 +4,7 @@ import java.util.* fun foo() { val al = ArrayList() al.size - al.contains(1) + al.contains(1) al.contains("") al.remove("") @@ -12,7 +12,7 @@ fun foo() { val hs = HashSet() hs.size - hs.contains(1) + hs.contains(1) hs.contains("") hs.remove("") @@ -20,10 +20,10 @@ fun foo() { val hm = HashMap() hm.size - hm.containsKey(1) + hm.containsKey(1) hm.containsKey("") - hm[1] + hm[1] hm[""] hm.remove("") diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt26698.kt b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt26698.kt new file mode 100644 index 00000000000..397477fbefb --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt26698.kt @@ -0,0 +1,22 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE +// !WITH_NEW_INFERENCE + +open class Base() +class CX : Base() +class CY : Base() + +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +fun <@kotlin.internal.OnlyInputTypes T> foo(a: T, b: T) {} + +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +fun <@kotlin.internal.OnlyInputTypes T : Any> fooA(a: T, b: T) {} + +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +fun <@kotlin.internal.OnlyInputTypes T : Base> fooB(a: T, b: T) {} + + +fun usage(x: CX, y: CY) { + foo(x, y) // expected err, got err + fooA(x, y) // expected err, got ok + fooB(x, y) // expected err, got ok +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt26698.txt b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt26698.txt new file mode 100644 index 00000000000..2e81c5092fe --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt26698.txt @@ -0,0 +1,27 @@ +package + +@kotlin.Suppress(names = {"INVISIBLE_MEMBER", "INVISIBLE_REFERENCE"}) public fun foo(/*0*/ a: T, /*1*/ b: T): kotlin.Unit +@kotlin.Suppress(names = {"INVISIBLE_MEMBER", "INVISIBLE_REFERENCE"}) public fun fooA(/*0*/ a: T, /*1*/ b: T): kotlin.Unit +@kotlin.Suppress(names = {"INVISIBLE_MEMBER", "INVISIBLE_REFERENCE"}) public fun fooB(/*0*/ a: T, /*1*/ b: T): kotlin.Unit +public fun usage(/*0*/ x: CX, /*1*/ y: CY): kotlin.Unit + +public open class Base { + public constructor Base() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class CX : Base { + public constructor CX() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class CY : Base { + public constructor CY() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt29307.kt b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt29307.kt new file mode 100644 index 00000000000..ca1ccacbc4c --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt29307.kt @@ -0,0 +1,31 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE +// !WITH_NEW_INFERENCE +// ISSUE: KT-29307 + +fun test_1(map: Map) { + val x = map[42] // OK +} + +open class A + +class B : A() + +fun test_2(map: Map) { + val x = map[42] +} + +fun test_3(m: Map<*, String>) { + val x = m[42] // should be ok +} + +fun test_4(m: Map) { + val x = m.get(42) // should be ok +} + +fun test_5(map: Map, a: A) { + map.get(a) +} + +fun test_6(map: Map, b: B) { + map.get(b) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt29307.txt b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt29307.txt new file mode 100644 index 00000000000..92e81b66668 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt29307.txt @@ -0,0 +1,22 @@ +package + +public fun test_1(/*0*/ map: kotlin.collections.Map): kotlin.Unit +public fun test_2(/*0*/ map: kotlin.collections.Map): kotlin.Unit +public fun test_3(/*0*/ m: kotlin.collections.Map<*, kotlin.String>): kotlin.Unit +public fun test_4(/*0*/ m: kotlin.collections.Map): kotlin.Unit +public fun test_5(/*0*/ map: kotlin.collections.Map, /*1*/ a: A): kotlin.Unit +public fun test_6(/*0*/ map: kotlin.collections.Map, /*1*/ b: B): kotlin.Unit + +public open class A { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class B : A { + public constructor B() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypes.kt b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypes.kt new file mode 100644 index 00000000000..5e68d52b698 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypes.kt @@ -0,0 +1,47 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE +// !WITH_NEW_INFERENCE + +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +public fun <@kotlin.internal.OnlyInputTypes T> Iterable.contains1(element: T): Boolean = null!! + +class In + +class Out + +class Inv + +fun test_1(list: List>, x: In, y: In, z: In) { + list.contains1(x) + list.contains1(y) + list.contains1(z) +} + +fun test_2(list: List>, x: In, y: In, z: In) { + list.contains1(x) + list.contains1(y) + list.contains1(z) +} + +fun test_3(list: List>, x: Out, y: Out, z: Out) { + list.contains1(x) + list.contains1(y) + list.contains1(z) +} + +fun test_4(list: List>, x: Out, y: Out, z: Out) { + list.contains1(x) + list.contains1(y) + list.contains1(z) +} + +fun test_5(list: List>, x: Inv, y: Inv, z: Inv) { + list.contains1(x) + list.contains1(y) + list.contains1(z) +} + +fun test_6(list: List>, x: Inv, y: Inv, z: Inv) { + list.contains1(x) + list.contains1(y) + list.contains1(z) +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypes.txt b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypes.txt new file mode 100644 index 00000000000..62ab3cbf5d1 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypes.txt @@ -0,0 +1,30 @@ +package + +public fun test_1(/*0*/ list: kotlin.collections.List>, /*1*/ x: In, /*2*/ y: In, /*3*/ z: In): kotlin.Unit +public fun test_2(/*0*/ list: kotlin.collections.List>, /*1*/ x: In, /*2*/ y: In, /*3*/ z: In): kotlin.Unit +public fun test_3(/*0*/ list: kotlin.collections.List>, /*1*/ x: Out, /*2*/ y: Out, /*3*/ z: Out): kotlin.Unit +public fun test_4(/*0*/ list: kotlin.collections.List>, /*1*/ x: Out, /*2*/ y: Out, /*3*/ z: Out): kotlin.Unit +public fun test_5(/*0*/ list: kotlin.collections.List>, /*1*/ x: Inv, /*2*/ y: Inv, /*3*/ z: Inv): kotlin.Unit +public fun test_6(/*0*/ list: kotlin.collections.List>, /*1*/ x: Inv, /*2*/ y: Inv, /*3*/ z: Inv): kotlin.Unit +@kotlin.Suppress(names = {"INVISIBLE_MEMBER", "INVISIBLE_REFERENCE"}) public fun kotlin.collections.Iterable.contains1(/*0*/ element: T): kotlin.Boolean + +public final class In { + public constructor In() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Inv { + public constructor Inv() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Out { + public constructor Out() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesAndLowPriority.kt b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesAndLowPriority.kt index c020f073a25..7d9bdfa88db 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesAndLowPriority.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesAndLowPriority.kt @@ -18,9 +18,9 @@ public fun Map.get1(key: Any?): Int = null!! public fun <@kotlin.internal.OnlyInputTypes K, V> Map.get1(key: K): V? = null!! fun test(map: Map) { - val a: Int = listOf(1).contains1("") + val a: Int = listOf(1).contains1("") val b: Boolean = listOf(1).contains1(1) - val c: String? = map.get1("") + val c: String? = map.get1("") val d: String? = map.get1(1) } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesCaptured.kt b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesCaptured.kt new file mode 100644 index 00000000000..f7399ff0b86 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesCaptured.kt @@ -0,0 +1,113 @@ +// !WITH_NEW_INFERENCE +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// Issue: KT-26698 + +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +public fun <@kotlin.internal.OnlyInputTypes T> Iterable.contains1(element: T): Boolean = null!! + +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +public fun <@kotlin.internal.OnlyInputTypes T> Iterable.foo(element: T): T = null!! + +class Inv +class Inv2 + +class In +class Out + +// ------------------------------------------------------- + +fun test_0(x: Inv2, list: List>) { + list.foo(x) +} + +// ------------------------- Inv ------------------------- + +fun test_1(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_2(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_3(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_4(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_5(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_6(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_7(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_8(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_9(x: Inv, list: List>) { + list.contains1(x) +} + +// ------------------------- In ------------------------- + +fun test_11(x: In, list: List>) { + list.contains1(x) +} + +fun test_12(x: In, list: List>) { + list.contains1(x) +} + +fun test_13(x: In, list: List>) { + list.contains1(x) +} + +// ------------------------- Out ------------------------- + +fun test_21(x: Out, list: List>) { + list.contains1(x) +} + +fun test_22(x: Out, list: List>) { + list.contains1(x) +} + +fun test_23(x: Out, list: List>) { + list.contains1(x) +} + +// -------------------------------------------------------- + +fun test_31(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_32(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_33(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_34(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_35(x: Inv, list: List>) { + list.contains1(x) +} + +fun test_36(x: Inv, list: List>) { + list.contains1(x) +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesCaptured.txt b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesCaptured.txt new file mode 100644 index 00000000000..1831a64dc3d --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesCaptured.txt @@ -0,0 +1,54 @@ +package + +public fun test_0(/*0*/ x: Inv2, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_1(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_11(/*0*/ x: In, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_12(/*0*/ x: In, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_13(/*0*/ x: In, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_2(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_21(/*0*/ x: Out, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_22(/*0*/ x: Out, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_23(/*0*/ x: Out, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_3(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_31(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_32(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_33(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_34(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_35(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_36(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_4(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_5(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_6(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_7(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_8(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +public fun test_9(/*0*/ x: Inv, /*1*/ list: kotlin.collections.List>): kotlin.Unit +@kotlin.Suppress(names = {"INVISIBLE_MEMBER", "INVISIBLE_REFERENCE"}) public fun kotlin.collections.Iterable.contains1(/*0*/ element: T): kotlin.Boolean +@kotlin.Suppress(names = {"INVISIBLE_MEMBER", "INVISIBLE_REFERENCE"}) public fun kotlin.collections.Iterable.foo(/*0*/ element: T): T + +public final class In { + public constructor In() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Inv { + public constructor Inv() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Inv2 { + public constructor Inv2() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Out { + public constructor Out() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/resolveWithOnlyInputTypesAnnotation.kt b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/resolveWithOnlyInputTypesAnnotation.kt index e2c6f5d99e7..2dae2ca5f70 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/resolveWithOnlyInputTypesAnnotation.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/resolveWithOnlyInputTypesAnnotation.kt @@ -11,7 +11,7 @@ class D fun test1(a: A, b: B, c: C) { assertEquals1(a, b) - assertEquals1(b, c) + assertEquals1(b, c) assertEquals1(3, 3) assertEquals1(1 or 2, 2 or 1) diff --git a/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContains.kt b/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContains.kt index 548ff81ca33..f674d777f27 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContains.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContains.kt @@ -28,8 +28,8 @@ fun main() { "" in (hm as Map) "" !in (hm as Map) - 1 in (hm as Map) - 1 !in (hm as Map) + 1 in (hm as Map) + 1 !in (hm as Map) val a = A() "" in a @@ -44,8 +44,8 @@ fun main() { "" in (a as Map) "" !in (a as Map) - 1 in (a as Map) - 1 !in (a as Map) + 1 in (a as Map) + 1 !in (a as Map) val b = B() "" in b @@ -58,8 +58,8 @@ fun main() { "" in (b as Map) "" !in (b as Map) - 1 in (b as Map) - 1 !in (b as Map) + 1 in (b as Map) + 1 !in (b as Map) // Actually, we could've allow calls here because the owner explicitly declared as operator, but semantics is still weird val c = C() @@ -73,7 +73,7 @@ fun main() { "" in (c as Map) "" !in (c as Map) - 1 in (c as Map) - 1 !in (c as Map) + 1 in (c as Map) + 1 !in (c as Map) } diff --git a/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContainsError.kt b/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContainsError.kt index 042d8af1725..3af29d824a1 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContainsError.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/java/concurrentHashMapContainsError.kt @@ -29,8 +29,8 @@ fun main() { "" in (hm as Map) "" !in (hm as Map) - 1 in (hm as Map) - 1 !in (hm as Map) + 1 in (hm as Map) + 1 !in (hm as Map) val a = A() "" in a @@ -45,8 +45,8 @@ fun main() { "" in (a as Map) "" !in (a as Map) - 1 in (a as Map) - 1 !in (a as Map) + 1 in (a as Map) + 1 !in (a as Map) val b = B() "" in b @@ -59,8 +59,8 @@ fun main() { "" in (b as Map) "" !in (b as Map) - 1 in (b as Map) - 1 !in (b as Map) + 1 in (b as Map) + 1 !in (b as Map) // Actually, we could've allow calls here because the owner explicitly declared as operator, but semantics is still weird val c = C() @@ -74,7 +74,7 @@ fun main() { "" in (c as Map) "" !in (c as Map) - 1 in (c as Map) - 1 !in (c as Map) + 1 in (c as Map) + 1 !in (c as Map) } diff --git a/compiler/testData/diagnostics/testsWithStdLib/tryCatch/tryExpression.kt b/compiler/testData/diagnostics/testsWithStdLib/tryCatch/tryExpression.kt index 23e21dc8dd7..ca7bc4401a8 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/tryCatch/tryExpression.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/tryCatch/tryExpression.kt @@ -30,6 +30,6 @@ fun test2(): Map = run { try { emptyMap() } catch (e: ExcA) { - mapOf("" to "") + mapOf("" to "") } } \ No newline at end of file diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/25.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/25.kt index 1d2bbad55ba..c665a7fd843 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/25.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/25.kt @@ -26,7 +26,6 @@ open class Case1 { x.get(0) x.size x.isEmpty() - x[null] } } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/26.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/26.kt index 5e500da4ff9..bfb473cc7e2 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/26.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/26.kt @@ -26,7 +26,6 @@ open class Case1 { x.get(0) x.size x.isEmpty() - x[null] } } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/27.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/27.kt index 6e0edcc9659..1f105e663be 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/27.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/27.kt @@ -26,7 +26,6 @@ open class Case1 { x.get(0) x.size x.isEmpty() - x[null] } } } diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index 456810bd0ed..162d845c274 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -2743,6 +2743,16 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/internalAnnotationsOnTypes.kt"); } + @TestMetadata("kt26698.kt") + public void testKt26698() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt26698.kt"); + } + + @TestMetadata("kt29307.kt") + public void testKt29307() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt29307.kt"); + } + @TestMetadata("noInferAndLowPriority.kt") public void testNoInferAndLowPriority() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/noInferAndLowPriority.kt"); @@ -2758,6 +2768,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/notNullAnnotation.kt"); } + @TestMetadata("onlyInputTypes.kt") + public void testOnlyInputTypes() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypes.kt"); + } + @TestMetadata("onlyInputTypesAndLowPriority.kt") public void testOnlyInputTypesAndLowPriority() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesAndLowPriority.kt"); @@ -2768,6 +2783,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesAnnotationWithPlatformTypes.kt"); } + @TestMetadata("onlyInputTypesCaptured.kt") + public void testOnlyInputTypesCaptured() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesCaptured.kt"); + } + @TestMetadata("propagationOfNoInferAnnotation.kt") public void testPropagationOfNoInferAnnotation() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/propagationOfNoInferAnnotation.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index 772e8977dcf..06755a48091 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -2743,6 +2743,16 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/internalAnnotationsOnTypes.kt"); } + @TestMetadata("kt26698.kt") + public void testKt26698() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt26698.kt"); + } + + @TestMetadata("kt29307.kt") + public void testKt29307() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/kt29307.kt"); + } + @TestMetadata("noInferAndLowPriority.kt") public void testNoInferAndLowPriority() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/noInferAndLowPriority.kt"); @@ -2758,6 +2768,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/notNullAnnotation.kt"); } + @TestMetadata("onlyInputTypes.kt") + public void testOnlyInputTypes() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypes.kt"); + } + @TestMetadata("onlyInputTypesAndLowPriority.kt") public void testOnlyInputTypesAndLowPriority() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesAndLowPriority.kt"); @@ -2768,6 +2783,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesAnnotationWithPlatformTypes.kt"); } + @TestMetadata("onlyInputTypesCaptured.kt") + public void testOnlyInputTypesCaptured() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/onlyInputTypesCaptured.kt"); + } + @TestMetadata("propagationOfNoInferAnnotation.kt") public void testPropagationOfNoInferAnnotation() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inference/annotationsForResolve/propagationOfNoInferAnnotation.kt");