diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index d7a100e1125..105d80fe040 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -21700,6 +21700,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinOutProjection.kt"); } + @Test + @TestMetadata("kotlinStarProjection.kt") + public void testKotlinStarProjection() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinStarProjection.kt"); + } + @Test @TestMetadata("listSuperType.kt") public void testListSuperType() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 14d79074a15..1687ffd2f6e 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -21700,6 +21700,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinOutProjection.kt"); } + @Test + @TestMetadata("kotlinStarProjection.kt") + public void testKotlinStarProjection() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinStarProjection.kt"); + } + @Test @TestMetadata("listSuperType.kt") public void testListSuperType() throws Exception { diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaGenericVarianceViolationTypeChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaGenericVarianceViolationTypeChecker.kt index e7e2fdde30f..a732cbd3f26 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaGenericVarianceViolationTypeChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirJavaGenericVarianceViolationTypeChecker.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.analysis.jvm.checkers.expression +import org.jetbrains.kotlin.fir.PrimitiveTypes import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirFunctionCallChecker import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter @@ -162,10 +163,10 @@ object FirJavaGenericVarianceViolationTypeChecker : FirFunctionCallChecker() { return when (this) { is ConeKotlinTypeProjectionOut -> if (positive) type else this is ConeKotlinTypeProjectionIn -> ConeKotlinTypeProjectionIn(type.removeOutProjection(!positive)) + is ConeStarProjection -> if (positive) PrimitiveTypes.Any else this // Don't remove nested projections for types at invariant position. is ConeKotlinTypeConflictingProjection, - is ConeKotlinType, - is ConeStarProjection -> this + is ConeKotlinType -> this } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Primitives.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Primitives.kt index 76e33308cb0..6b8dce827d9 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Primitives.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/Primitives.kt @@ -23,6 +23,8 @@ object PrimitiveTypes { val Long: ConeClassLikeType = StandardClassIds.Long.createType() val Float: ConeClassLikeType = StandardClassIds.Float.createType() val Double: ConeClassLikeType = StandardClassIds.Double.createType() + + val Any: ConeClassLikeType = StandardClassIds.Any.createType() } private fun ClassId.createType(): ConeClassLikeType = diff --git a/compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinStarProjection.kt b/compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinStarProjection.kt new file mode 100644 index 00000000000..799cc3c69c5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinStarProjection.kt @@ -0,0 +1,37 @@ +// FIR_IDENTICAL +// !DIAGNOSTICS: -UNUSED_VARIABLE +// FILE: A.java + +import java.util.*; + + +public class A { + void foo(List x) {} + void foo2(List x) {} + void foo3(Collection x) {} +} + +// FILE: B.java + +import java.util.*; + +public class B { + public B(Collection c) { + + } +} +// FILE: main.kt + +fun test(a: A) { + a.foo(bar()) + a.foo2(bar()) + a.foo3(bar()) + B(bar()) + a.foo(bar2()) + a.foo2(bar2()) + a.foo3(bar2()) + B(bar2()) +} + +fun bar(): MutableList<*> = TODO() +fun bar2(): MutableList> = TODO() diff --git a/compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinStarProjection.txt b/compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinStarProjection.txt new file mode 100644 index 00000000000..e55ff852348 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinStarProjection.txt @@ -0,0 +1,22 @@ +package + +public fun bar(): kotlin.collections.MutableList<*> +public fun bar2(): kotlin.collections.MutableList> +public fun test(/*0*/ a: A): kotlin.Unit + +public open class A { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public/*package*/ open fun foo(/*0*/ x: kotlin.collections.(Mutable)List!): kotlin.Unit + public/*package*/ open fun foo2(/*0*/ x: kotlin.collections.(Mutable)List!): kotlin.Unit + public/*package*/ open fun foo3(/*0*/ x: (kotlin.collections.MutableCollection..kotlin.collections.Collection?)): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public open class B { + public constructor B(/*0*/ c: kotlin.collections.(Mutable)Collection!) + 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/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 1b285ba9fcd..716dbfe3a95 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -21706,6 +21706,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinOutProjection.kt"); } + @Test + @TestMetadata("kotlinStarProjection.kt") + public void testKotlinStarProjection() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinStarProjection.kt"); + } + @Test @TestMetadata("listSuperType.kt") public void testListSuperType() throws Exception { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index e91e6371f34..35baea95f33 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -21700,6 +21700,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinOutProjection.kt"); } + @Test + @TestMetadata("kotlinStarProjection.kt") + public void testKotlinStarProjection() throws Exception { + runTest("compiler/testData/diagnostics/tests/platformTypes/genericVarianceViolation/kotlinStarProjection.kt"); + } + @Test @TestMetadata("listSuperType.kt") public void testListSuperType() throws Exception {