[FIR] fix subtyping for nullable captured types.
The issue is the type checker doesn't consider P? a subtype of CapturedType<in P>?, whereas P a subtype of CapturedType<in P>?. In AbstractTypeCheckerContext::checkSubtypeForSpecialCases, it checks if P? is a subtype of the lower type of the captured type, which is P, and returns false. This fix uses nullable version of the lower type when the captured type is marked nullable. To check if P? is a subtype of Captured<in P>?, we check the LHS, P?, against the nullable lower type of RHS, P?. ^KT-42825 Fixed
This commit is contained in:
committed by
Mikhail Glukhikh
parent
d96223a2ff
commit
eb804709da
Generated
+5
@@ -16041,6 +16041,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/javaInterop/generics/javaNestedSamInterface.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt42825.kt")
|
||||
public void testKt42825() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("propertyVarianceConflict.kt")
|
||||
public void testPropertyVarianceConflict() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/javaInterop/generics/propertyVarianceConflict.kt");
|
||||
|
||||
@@ -39,6 +39,13 @@ open class IrTypeCheckerContext(override val irBuiltIns: IrBuiltIns) : IrTypeSys
|
||||
): AbstractTypeCheckerContext = IrTypeCheckerContext(irBuiltIns)
|
||||
|
||||
override fun KotlinTypeMarker.isUninferredParameter(): Boolean = false
|
||||
override fun KotlinTypeMarker.withNullability(nullable: Boolean): KotlinTypeMarker {
|
||||
if (this.isSimpleType()) {
|
||||
return this.asSimpleType()!!.withNullability(nullable)
|
||||
} else {
|
||||
error("withNullability for non-simple types is not supported in IR")
|
||||
}
|
||||
}
|
||||
|
||||
override fun captureFromExpression(type: KotlinTypeMarker): KotlinTypeMarker? =
|
||||
error("Captured type is unsupported in IR")
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
// FILE: Processor.java
|
||||
|
||||
public interface Processor<T> {
|
||||
boolean process(T t);
|
||||
}
|
||||
|
||||
// FILE: test.kt
|
||||
|
||||
interface PsiModifierListOwner
|
||||
interface KtClassOrObject {
|
||||
fun toLightClass(): PsiModifierListOwner?
|
||||
}
|
||||
|
||||
fun execute(declaration: Any, consumer: Processor<in PsiModifierListOwner>) {
|
||||
when (declaration) {
|
||||
is KtClassOrObject -> {
|
||||
val lightClass = declaration.toLightClass()
|
||||
consumer.process(lightClass)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun box(): String = "OK"
|
||||
+5
@@ -17441,6 +17441,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/javaInterop/generics/javaNestedSamInterface.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt42825.kt")
|
||||
public void testKt42825() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("propertyVarianceConflict.kt")
|
||||
public void testPropertyVarianceConflict() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/javaInterop/generics/propertyVarianceConflict.kt");
|
||||
|
||||
+5
@@ -17441,6 +17441,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/javaInterop/generics/javaNestedSamInterface.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt42825.kt")
|
||||
public void testKt42825() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("propertyVarianceConflict.kt")
|
||||
public void testPropertyVarianceConflict() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/javaInterop/generics/propertyVarianceConflict.kt");
|
||||
|
||||
+5
@@ -16041,6 +16041,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/javaInterop/generics/javaNestedSamInterface.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt42825.kt")
|
||||
public void testKt42825() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("propertyVarianceConflict.kt")
|
||||
public void testPropertyVarianceConflict() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/javaInterop/generics/propertyVarianceConflict.kt");
|
||||
|
||||
Reference in New Issue
Block a user