diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 5271fce5e28..b629a99defc 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -16041,6 +16041,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/javaInterop/generics/javaNestedSamInterface.kt"); } + @TestMetadata("kt42824.kt") + public void testKt42824() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/generics/kt42824.kt"); + } + @TestMetadata("kt42825.kt") public void testKt42825() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt"); diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeCheckerContext.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeCheckerContext.kt index e7dfd0f5878..2fe6f32b8b9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeCheckerContext.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeCheckerContext.kt @@ -8,9 +8,7 @@ package org.jetbrains.kotlin.ir.types import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.types.AbstractTypeCheckerContext -import org.jetbrains.kotlin.types.model.KotlinTypeMarker -import org.jetbrains.kotlin.types.model.SimpleTypeMarker -import org.jetbrains.kotlin.types.model.TypeConstructorMarker +import org.jetbrains.kotlin.types.model.* open class IrTypeCheckerContext(override val irBuiltIns: IrBuiltIns) : IrTypeSystemContext, AbstractTypeCheckerContext() { @@ -49,4 +47,15 @@ open class IrTypeCheckerContext(override val irBuiltIns: IrBuiltIns) : IrTypeSys override fun captureFromExpression(type: KotlinTypeMarker): KotlinTypeMarker? = error("Captured type is unsupported in IR") + + override fun DefinitelyNotNullTypeMarker.original(): SimpleTypeMarker = + error("DefinitelyNotNull type is unsupported in IR") + + override fun KotlinTypeMarker.makeDefinitelyNotNullOrNotNull(): KotlinTypeMarker { + error("makeDefinitelyNotNullOrNotNull is not supported in IR") + } + + override fun SimpleTypeMarker.makeSimpleTypeDefinitelyNotNullOrNotNull(): SimpleTypeMarker { + error("makeSimpleTypeDefinitelyNotNullOrNotNull is not yet supported in IR") + } } diff --git a/compiler/testData/codegen/box/javaInterop/generics/kt42824.kt b/compiler/testData/codegen/box/javaInterop/generics/kt42824.kt new file mode 100644 index 00000000000..2b6cf9bdde3 --- /dev/null +++ b/compiler/testData/codegen/box/javaInterop/generics/kt42824.kt @@ -0,0 +1,21 @@ +// FILE: DiagnosticFactory0.java + +import org.jetbrains.annotations.NotNull; + +public class DiagnosticFactory0 { + @NotNull + public SimpleDiagnostic on(@NotNull E element) { + return new SimpleDiagnostic<>(element); + } +} + +// FILE: test.kt + +class SimpleDiagnostic(val element: E) +interface KtAnnotationEntry + +fun foo(error: DiagnosticFactory0, entry: KtAnnotationEntry) { + error.on(entry) // used to be INAPPLICABLE_CANDIDATE +} + +fun box() = "OK" \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 982fbd94a90..0731e2b174e 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -17441,6 +17441,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/javaInterop/generics/javaNestedSamInterface.kt"); } + @TestMetadata("kt42824.kt") + public void testKt42824() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/generics/kt42824.kt"); + } + @TestMetadata("kt42825.kt") public void testKt42825() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 7aa64fe4dd0..b03c1255a64 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -17441,6 +17441,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/javaInterop/generics/javaNestedSamInterface.kt"); } + @TestMetadata("kt42824.kt") + public void testKt42824() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/generics/kt42824.kt"); + } + @TestMetadata("kt42825.kt") public void testKt42825() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 7fdd83dafa7..f03c7ca2aed 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -16041,6 +16041,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/javaInterop/generics/javaNestedSamInterface.kt"); } + @TestMetadata("kt42824.kt") + public void testKt42824() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/generics/kt42824.kt"); + } + @TestMetadata("kt42825.kt") public void testKt42825() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt"); diff --git a/core/compiler.common/src/org/jetbrains/kotlin/types/AbstractTypeChecker.kt b/core/compiler.common/src/org/jetbrains/kotlin/types/AbstractTypeChecker.kt index 74ce295bb8a..da6799b18da 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/types/AbstractTypeChecker.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/types/AbstractTypeChecker.kt @@ -404,15 +404,18 @@ object AbstractTypeChecker { if (subType.isStubType() || superType.isStubType()) return isStubTypeEqualsToAnything - val superTypeCaptured = superType.asCapturedType() + // superType might be a definitely notNull type (see KT-42824) + val superOriginalType = superType.asDefinitelyNotNullType()?.original() ?: superType + val superTypeCaptured = superOriginalType.asCapturedType() val lowerType = superTypeCaptured?.lowerType() if (superTypeCaptured != null && lowerType != null) { // If superType is nullable, e.g., to check if Foo? a subtype of Captured?, we check the LHS, Foo?, // against the nullable version of the lower type of RHS. See KT-42825 - val nullableLowerType = - if (superType.isMarkedNullable()) - lowerType.withNullability(true) - else lowerType + val nullableLowerType = if (superType.isMarkedNullable()) { + lowerType.withNullability(true) + } else { + if (superType.isDefinitelyNotNullType()) lowerType.makeDefinitelyNotNullOrNotNull() else lowerType + } when (getLowerCapturedTypePolicy(subType, superTypeCaptured)) { CHECK_ONLY_LOWER -> return isSubtypeOf(this, subType, nullableLowerType) CHECK_SUBTYPE_AND_LOWER -> if (isSubtypeOf(this, subType, nullableLowerType)) return true diff --git a/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt b/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt index 29b34eb5741..9bb9a8020a7 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.types.model import org.jetbrains.kotlin.types.AbstractTypeCheckerContext import org.jetbrains.kotlin.types.Variance -import java.util.* import kotlin.collections.ArrayList import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract @@ -144,9 +143,6 @@ interface TypeSystemInferenceExtensionContext : TypeSystemContext, TypeSystemBui fun KotlinTypeMarker.isBuiltinFunctionalTypeOrSubtype(): Boolean - fun KotlinTypeMarker.makeDefinitelyNotNullOrNotNull(): KotlinTypeMarker - fun SimpleTypeMarker.makeSimpleTypeDefinitelyNotNullOrNotNull(): SimpleTypeMarker - fun createCapturedType( constructorProjection: TypeArgumentMarker, constructorSupertypes: List, @@ -171,8 +167,6 @@ interface TypeSystemInferenceExtensionContext : TypeSystemContext, TypeSystemBui fun CapturedTypeMarker.typeParameter(): TypeParameterMarker? fun CapturedTypeMarker.withNotNullProjection(): KotlinTypeMarker - fun DefinitelyNotNullTypeMarker.original(): SimpleTypeMarker - fun typeSubstitutorByTypeConstructor(map: Map): TypeSubstitutorMarker fun createEmptySubstitutor(): TypeSubstitutorMarker @@ -249,6 +243,9 @@ interface TypeSystemContext : TypeSystemOptimizationContext { fun KotlinTypeMarker.isCapturedType() = asSimpleType()?.asCapturedType() != null fun SimpleTypeMarker.asDefinitelyNotNullType(): DefinitelyNotNullTypeMarker? + fun DefinitelyNotNullTypeMarker.original(): SimpleTypeMarker + fun KotlinTypeMarker.makeDefinitelyNotNullOrNotNull(): KotlinTypeMarker + fun SimpleTypeMarker.makeSimpleTypeDefinitelyNotNullOrNotNull(): SimpleTypeMarker fun SimpleTypeMarker.isMarkedNullable(): Boolean fun KotlinTypeMarker.isMarkedNullable(): Boolean = this is SimpleTypeMarker && isMarkedNullable() diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index f98e7183e9e..759d8427e97 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -13896,6 +13896,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/generics"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR_ES6, true); } + @TestMetadata("kt42824.kt") + public void testKt42824() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/generics/kt42824.kt"); + } + @TestMetadata("kt42825.kt") public void testKt42825() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index a6a2a19a7e0..25939fc651e 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -13896,6 +13896,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/generics"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS_IR, true); } + @TestMetadata("kt42824.kt") + public void testKt42824() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/generics/kt42824.kt"); + } + @TestMetadata("kt42825.kt") public void testKt42825() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index ef4b905d1fc..1f264aab7f6 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -13961,6 +13961,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/box/javaInterop/generics"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JS, true); } + @TestMetadata("kt42824.kt") + public void testKt42824() throws Exception { + runTest("compiler/testData/codegen/box/javaInterop/generics/kt42824.kt"); + } + @TestMetadata("kt42825.kt") public void testKt42825() throws Exception { runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt");